0x00 比赛环境吐槽
这个合天啊,真是不想说什么。上次搞比赛web也卡的不行。这次第一道web题,前一个小时根本没法正常访问。开个网页10分钟起。后来开了临时加开了好几个网页也是治标不治本,根本不行。
反正,我感觉不是服务器资源不行,是网页写搓了。
0x01 个人感受
跟着大佬比赛,真的是没我这菜鸡什么事情。web1,我还卡在10分钟一开网页,看后台有什么功能的时候,大佬已经完成注入了。web2,代码审计,看了会代码,问大佬,这是不是条件竞争, 大佬说是的,刚刚出了。web3,代码审计,一起看了一个多小时,大佬说没啥思路,先去吃饭。于是我又看了一个多小时,没啥思路,刷新网页看看有没有提示的时候,题目上赫然一个完成。问大佬什么情况,答:刚刚出了。
ORZ。
0x02 正片开始,web1
一道神棍题,介绍说是python的博客。
访问网页,~嗯~,网页卡住了。回忆了一下公司名字,~嗯~,等着吧。
先开脑洞,可能是P牛博客里面的新型文件包含,考虑到pwnhub上刚刚有过类似的题目,可能性比较高。可能是ssrf,也可能是jinja2的模板注入,还有可能是yaml反序列之类的。总而言之,应该和python的特性有关,嗯。
刷开网页,直接开始弹弹弹,看来还有xss,ORZ,不过这个似乎没什么卵用。
扫一波网页,发现 http://139.129.225.72:8080/admin/index
发现是一个特别简易的登陆框,admin’ or ‘1’=’1。
默数600下,进入后台。
默数600下,进入post。
默数600下,打开编辑页面。
默数600下,打开上传。
默数600下,测试上传。
默数600下,似乎什么反应也没有。
默数600下,看看其他后台功能。
默数600下,学长已经做完题目了,ORZ。
实际上,做题就是那个登陆框的注入。

似乎直接跑还跑不出来,最后要手动union一下,当然我自始至终,就是默数600秒的状态,也就没跑了。
所以说,这个和python写的有什么卵关系,摊手。倒是题目这么卡,可能和用python写的有关,也许作者没处理好高并发的情况。
https://github.com/5alt/0CTF2015Final0cms
有人找到了这么个东西,光看代码,似乎两个家伙长得一模一样,ORZ。
0x03 web 2 ascii字符图库
又是个神棍题,看名字,一下子就会想到也许和编码有关。
那么就可能是xss的各种编码,sql注入的各种编码转化间导致的注入。或者再不济就是
= A, = O, = U这种mysql下utf-8的奇葩姿势。
打开题目
又弹弹弹了,不过判断了一下,应该又是没什么卵用的。
对每个用户的发言有支持和反对功能,支持高了能排到前面去,可能有高并发下,可以一下子支持多次。不过似乎排到前面也没什么卵用。
有一个注册功能,登陆功能。
直接注册一下,登陆一下,看到服务端print_r了用户信息,并且提示此用户限制登陆。
输出了信息,可能是方便调试注入。于是测试了一会注入姿势,发现开了gpc。果然要和编码有关了吗?
就在这时学长发来一句.bak看源码,能获得index.php,register.php,login.php这三个的源码。

可以看到过掉if以后就能获得flag了。

注册时的逻辑是先往users表里面插入用户和密码,再往privs表里面插入权限信息。
显然两次数据库操作间存在时间差,如果在插入用户密码,还没有插入权限信息的时候登陆,就能获得flag了。
这是一个典型的条件竞争。
于是直接打开上次hctf的跑得比西方记者快的代码,改一下。
跑个一分钟左右就出了。

0x04 web 3 white & black
打开一看

是个登陆框。根据p牛博客所说50%的web打开是登陆框,其中60%以上能拿到源码。(说实话我感觉比例还要高)
于是用bbscan扫了一波。

下载下来看看。

嗯,行数比上面要多一些。
直接通读源码,看看什么情况。


所有和数据库操作的函数都上了waf,mysqli_real_escape_string这个函数是会考虑当前数据库的字符集的,所以宽字节是没有希望的。
注意到username还trim了一下,是为了防止有人尝试用数据库截断来做坏事。


不仅入库的时候上了waf,对所有get和post的数据都过滤了,还考虑了提交数组的情况。
注入基本是没戏了。

可以看到这里出现了一个power,但是搜索项目,没有发现这个参数的用处,观察了一下,发现没给admin.php的代码。
结合white & black,白盒加黑盒,这个应该是下一步的关键。

这里面有个auth函数,应该就是这里,绕过这个验证,获得权限。

可以看到,这里注释也说了,防止边信道攻击。不论是否有结果,都去做一次hash_equals。(当然网这么卡,怎么可能时序边信道)。

这里还向低版本兼容了,下面这个hash_equals是php官网上的一个实现,不敢说没有问题,但也不敢说服务器用的是下面的实现。问题应该不在这里。
后来,我才发现,提示在我截的第一张里面就有

Random我一开始还一直以为是大佬出的题目,我还特地问了一下发现不是就没在意了。
其实这里提示的是:

发现用到了rand这个不安全的随机数。
怎么玩,看p牛博客 .
照着脚本修修改改就进去了。

发现是个upload。


有个可疑请求。
跑一下目录。

发现能看到服务器上的操作记录。

有一条奇葩的请求,似乎是保存截图的功能(我是服务器关掉后复现的,就没看到截图了,ORZ)

服务器监听一下端口,来看一下报文,发现有JSEngine的字样。
后面的做法就和 点我 一样了。
我没复现完,卡在后面ssrf的编码处了,成功设置了ua,但是没能RCE。
调着调着就被拉去开会了,回来环境已经关了。
唉。