记一次基于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注入基本流程
-
列数探测: 通过
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 - 关键属性配置:
<boundary> <level>1</level> <clause>1,2</clause> <where>1</where> <ptype>1</ptype> <prefix>pay`+/*_*/where+false</prefix> <suffix>#</suffix> </boundary> - 匹配规则:
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 更便捷的参数方案
使用命令行参数直接指定前后缀:
sqlmap --prefix="pay`+/*_*/where+false" --suffix="#" --technique=U -v 3
优势:
- 无需修改boundary文件
- SQLMap会直接使用提供的前后缀
- 调用默认的clause和where匹配union_query.xml模板
4. 完整测试流程
-
初始探测:
sqlmap -u "pay.php?id=pay" --prefix="pay`+/*_*/where+false" --suffix="#" --technique=U -v 3 -
代理调试(可选):
sqlmap -u "pay.php?id=pay" --prefix="pay`+/*_*/where+false" --suffix="#" --technique=U -v 3 --proxy=http://127.0.0.1:8080 -
观察测试payload:
- 有效payload示例:
pay+/_/where+false order by 1#` - 列数探测payload:
pay+/_/where+false order by 4839#`
- 有效payload示例:
-
成功识别后:
- 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注入测试需求。