2018年第三届南宁市网络安全技术大赛Web题部分
上周末的时候参加了一个CTF比赛,一共有3道web题,想写一下后面两道题的WP。
第二题:绿帽子
打开题目,是个登陆界面,并且可以注册,首先测试了一下有没有注入,好消息是没有=。=,查看源码得到“出题人不会写前端”这条信息,根据这条信息往下走。
注册一个账号,登录进去。
发现账户余额1000,1级帽子500,点击购买帽子。
购买后升级,题目暗示还要购买帽子才阔以继续,余额剩下500,但是2级绿帽子需要501。
也就是说这道题需要通过一些方法来购买足够的绿帽子才能拿到flag。
抓包发现,购买的帽子种类和金额都在参数里。
尝试修改price为0,然后发送该请求,发现运气不错,余额没有减少还是1000。
然后发现,还需要购买一顶帽子。
这里开始猜测是条件竞争,以前看到过一些买东西存在条件竞争的题目。然后尝试,一级帽子和2级帽子一起买、2级帽子开多个线程买……然后发现并没有什么用。本来打算放弃这个思路,去尝试别的。第二天看到tips: 1s,觉得不是延时注入就是条件竞争。还有一个点就是:一共买3个帽子,第一个是一级的,后面两个都是2级的。感觉就是在第二步出现的竞争。
而且不同号登陆后的cookie不会变,这道题应该和cookie有关系。
尝试同一个号用两个不同的cookie登录,然后同时购买,得到flag。
第三题:
打开题目,没有任何有用的信息。扫描下目录有没有啥敏感文件。
发现可能是git泄露。
然后利用git恢复工具提取一下文件。
得到index.php。
查看源码,进行代码审计。
审计代码,发现获得flag的条件是:同一条查询语句,第一次查询结果为guest,第二次查询为admin,所以应该利用条件语句进行绕过。
查看过滤规则,发现括号被过滤了,if语句用不了,但可以用case when。这里利用mysql中变量进行绕过,先判断一个变量是否为空,空的话赋值为2(对应查询结果为guest),不为空的话返回结果为1。这样同一条语句,第一次查返回结果为2,第二次查因为已经给变量赋值,会返回1。
Mysql变量赋值:@a:=1
Payload:/index.php?backdoor=Melonrind&id=case%20when%20@a%20is%20null%20then%20@a:=2%20else%20@a:=1%20end
最新评论