2018年第三届南宁市网络安全技术大赛Web题部分

liudao  2193天前

上周末的时候参加了一个CTF比赛,一共有3道web题,想写一下后面两道题的WP。

图片.png


第二题:绿帽子

图片.png

打开题目,是个登陆界面,并且可以注册,首先测试了一下有没有注入,好消息是没有=。=,查看源码得到“出题人不会写前端”这条信息,根据这条信息往下走。

图片.png

注册一个账号,登录进去。

图片.png

发现账户余额1000,1级帽子500,点击购买帽子。

图片.png

图片.png

购买后升级,题目暗示还要购买帽子才阔以继续,余额剩下500,但是2级绿帽子需要501。

图片.png

也就是说这道题需要通过一些方法来购买足够的绿帽子才能拿到flag。

抓包发现,购买的帽子种类和金额都在参数里。

图片.png

尝试修改price为0,然后发送该请求,发现运气不错,余额没有减少还是1000。

图片.png

然后发现,还需要购买一顶帽子。

图片.png

图片.png

这里开始猜测是条件竞争,以前看到过一些买东西存在条件竞争的题目。然后尝试,一级帽子和2级帽子一起买、2级帽子开多个线程买……然后发现并没有什么用。本来打算放弃这个思路,去尝试别的。第二天看到tips: 1s,觉得不是延时注入就是条件竞争。还有一个点就是:一共买3个帽子,第一个是一级的,后面两个都是2级的。感觉就是在第二步出现的竞争。

而且不同号登陆后的cookie不会变,这道题应该和cookie有关系。

尝试同一个号用两个不同的cookie登录,然后同时购买,得到flag。

图片.png

第三题:

图片.png

打开题目,没有任何有用的信息。扫描下目录有没有啥敏感文件。

图片.png

发现可能是git泄露。

然后利用git恢复工具提取一下文件。

图片.png

得到index.php。

图片.png

查看源码,进行代码审计。

图片.png

审计代码,发现获得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

图片.png


图片.png

最新评论

嘻嘻嘻  :  就服**的表情包
2193天前 回复
嘿嘿嘿  :  就服表 哥的表情包
2193天前 回复
昵称
邮箱
提交评论