我的WafBypass之道(SQL注入篇)
字数 2317 2025-08-29 08:31:42

SQL注入WAF绕过技术详解

0x00 前言

本文总结了主流WAF的绕过技术,重点介绍突破WAF的思维方法和自动化绕过技术,而非简单罗列现有姿势。

0x01 WAF类型分析

主流WAF分类

  1. 云WAF

    • 通过CDN配置,DNS解析到CDN IP
    • 请求先经过云WAF检测,通过后再转发给主机
  2. 主机防护软件

    • 预先安装在主机上
    • 扫描和保护主机,监听Web端口流量
    • 开源WAF(如mod_security、ngx-lua-waf)升级成本高
  3. 硬件防护设备

    • 专用硬件设备进行流量清洗和拦截
    • 通过后再将数据包转发给主机

WAF规则库关系

  • 百度云加速免费版基于CloudFlare
  • 安全宝和百度云加速规则库相似
  • 创宇云安全和腾讯云安全规则库相似
  • 腾讯云安全和门神规则库相似
  • 硬件WAF自身往往存在大量漏洞

0x02 常见绕过技术

数据库特性利用

  1. 注释

    • #--/* */;%00
    • 案例:/**//**/绕过云锁
  2. 科学记数法

    • 1union1from绕过安全宝&百度云加速&Imperva
  3. 空白字符

    • 各数据库支持的空白字符不同:
      • SQLite3:0A 0D 0C 09 20
      • MySQL5:09 0A 0B 0C 0D A0 20
      • PosgresSQL:0A 0D 0C 09 20
      • Oracle 11g:00 0A 0D 0C 09 20
      • MSSQL:01-20
  4. 特殊符号

    • +-`~!@.'"(){}
  5. SQL函数&关键字

    • MySQL:
      • union distinctunion distinctrow
      • procedure analyse()updatexml()extracavalue()
      • 数学函数:exp()ceil()atan()sqrt()
      • 字符串函数:Mid()Substr()concat()
    • MSSQL:
      • IS_SRVROLEMEMBER()IS_MEMBER()HAS_DBACCESS()
      • convert()col_name()object_id()
  6. 逗号绕过

    • limit 1 offset 0代替limit 0,1
    • mid(version() from 1 for 1)代替mid(version(),1,1)
  7. BIGINT溢出报错注入

    • 利用MySQL BIGINT数据类型构造溢出

容器特性利用

  1. %特性

    • ASP+IIS环境中单一百分号%会被忽略
  2. %u特性

    • IIS支持unicode解析,WAF可能不识别
    • 案例:s%u0065lectselect
    • 多种编码表示同一字符:
      • 字母a:%u0000%u0041%u0061
      • 单引号:%u0027%u02b9
      • 空白:%u0020%uff00
  3. 畸形协议&请求

    • ASP/ASP.NET允许application/x-www-form-urlencoded方式提交
    • PHP+Apache对协议定义不严格
    • 利用multipart请求边界解析差异

通用特性

  1. HTTP参数污染(HPP)

    • 同一参数多次出现,不同容器处理不同:
      • ASP.NET + IIS:id=1,2,3
      • ASP + IIS:id=1,2,3
      • PHP + Apache:id=3
  2. 双重编码

    • 视场景而定,包括:
      • unencode、base64、json、binary、querystring、htmlencode、unicode、php serialize

0x03 针对性绕过案例

阿里云盾绕过

  1. 自定义变量绕过

    id=1|@pwd:=(select username from users where id=4)/*ddd*/union/*ddd*/select null,@pwd
    
  2. 科学计数法

    1' union/*!23000select*/user,password from users%23
    

腾讯云安全绕过

  1. 推理绕过
    1' union/*!50000select%0aall*/username from users%23
    1' union/*!50000select%0adistinct*/username from users%23
    

云锁绕过

  1. 超长注释

    /*666666...(超长字符串)...666666*/
    
  2. 数据包长度绕过

    • 超过2329字节时不检测

安全狗绕过

  1. 超长查询字符串
    • 导致WAF宕机,Service Unavailable

Emoji绕过

  1. 愤怒脸Emoji
    • %F0%9F%98%A0插入到%23%0A之间
    • ASCII码超过127的字符可能导致WAF引擎无法检测

0x04 自动化Bypass技术

SQLMap Tamper脚本

  1. 常用脚本
    • apostrophemask.py:UTF-8全角字符替换单引号
    • base64encode.py:Base64编码
    • between.py:用NOT BETWEENBETWEEN替换运算符
    • concat2concatws.py:函数替换
    • greatest.py:用GREATEST函数替换大于号
    • space2comment.py:用/**/替换空格
    • versionedkeywords.py:用MySQL注释包围关键字

系统化Fuzz方法

  1. 有毒标识模型

    • 将SQL关键字视为"位"
    • 在"位"的两边插入各种符号(注释、运算符等)
    • 计算公式:Factor[((x^n)*4 + x*y)*m]
      • x:有毒标识
      • n:位数
      • y:数据库语法糖
      • m:编码转换
  2. 传输过程测试点

    • 中间件特性/缺陷
    • 特定条件下的WAF欺骗

0x05 总结

  1. WAF绕过核心思想

    • 理解WAF工作原理
    • 掌握数据库和容器特性
    • 灵活组合各种绕过技术
    • 注重细节和推理
  2. 未来方向

    • 文件上传WAF绕过
    • Webshell防御绕过
    • 权限提升WAF绕过

通过系统化的测试方法和不断积累的绕过技术,可以有效突破主流WAF的防护。关键在于理解WAF的检测机制,并针对性地构造绕过Payload。

SQL注入WAF绕过技术详解 0x00 前言 本文总结了主流WAF的绕过技术,重点介绍突破WAF的思维方法和自动化绕过技术,而非简单罗列现有姿势。 0x01 WAF类型分析 主流WAF分类 云WAF : 通过CDN配置,DNS解析到CDN IP 请求先经过云WAF检测,通过后再转发给主机 主机防护软件 : 预先安装在主机上 扫描和保护主机,监听Web端口流量 开源WAF(如mod_ security、ngx-lua-waf)升级成本高 硬件防护设备 : 专用硬件设备进行流量清洗和拦截 通过后再将数据包转发给主机 WAF规则库关系 百度云加速免费版基于CloudFlare 安全宝和百度云加速规则库相似 创宇云安全和腾讯云安全规则库相似 腾讯云安全和门神规则库相似 硬件WAF自身往往存在大量漏洞 0x02 常见绕过技术 数据库特性利用 注释 : # 、 -- 、 /* */ 、 ;%00 案例: /**//**/ 绕过云锁 科学记数法 : 1union 、 1from 绕过安全宝&百度云加速&Imperva 空白字符 : 各数据库支持的空白字符不同: SQLite3:0A 0D 0C 09 20 MySQL5:09 0A 0B 0C 0D A0 20 PosgresSQL:0A 0D 0C 09 20 Oracle 11g:00 0A 0D 0C 09 20 MSSQL:01-20 特殊符号 : + 、 - 、 ` 、 ~ 、 ! 、 @ 、 . 、 ' 、 " 、 () 、 {} SQL函数&关键字 : MySQL: union distinct 、 union distinctrow procedure analyse() 、 updatexml() 、 extracavalue() 数学函数: exp() 、 ceil() 、 atan() 、 sqrt() 等 字符串函数: Mid() 、 Substr() 、 concat() 等 MSSQL: IS_SRVROLEMEMBER() 、 IS_MEMBER() 、 HAS_DBACCESS() convert() 、 col_name() 、 object_id() 逗号绕过 : limit 1 offset 0 代替 limit 0,1 mid(version() from 1 for 1) 代替 mid(version(),1,1) BIGINT溢出报错注入 : 利用MySQL BIGINT数据类型构造溢出 容器特性利用 %特性 : ASP+IIS环境中单一百分号 % 会被忽略 %u特性 : IIS支持unicode解析,WAF可能不识别 案例: s%u0065lect → select 多种编码表示同一字符: 字母a: %u0000 、 %u0041 、 %u0061 等 单引号: %u0027 、 %u02b9 等 空白: %u0020 、 %uff00 等 畸形协议&请求 : ASP/ASP.NET允许 application/x-www-form-urlencoded 方式提交 PHP+Apache对协议定义不严格 利用multipart请求边界解析差异 通用特性 HTTP参数污染(HPP) : 同一参数多次出现,不同容器处理不同: ASP.NET + IIS: id=1,2,3 ASP + IIS: id=1,2,3 PHP + Apache: id=3 双重编码 : 视场景而定,包括: unencode、base64、json、binary、querystring、htmlencode、unicode、php serialize 0x03 针对性绕过案例 阿里云盾绕过 自定义变量绕过 : 科学计数法 : 腾讯云安全绕过 推理绕过 : 云锁绕过 超长注释 : 数据包长度绕过 : 超过2329字节时不检测 安全狗绕过 超长查询字符串 : 导致WAF宕机,Service Unavailable Emoji绕过 愤怒脸Emoji : %F0%9F%98%A0 插入到 %23 与 %0A 之间 ASCII码超过127的字符可能导致WAF引擎无法检测 0x04 自动化Bypass技术 SQLMap Tamper脚本 常用脚本 : apostrophemask.py :UTF-8全角字符替换单引号 base64encode.py :Base64编码 between.py :用 NOT BETWEEN 和 BETWEEN 替换运算符 concat2concatws.py :函数替换 greatest.py :用 GREATEST 函数替换大于号 space2comment.py :用 /**/ 替换空格 versionedkeywords.py :用MySQL注释包围关键字 系统化Fuzz方法 有毒标识模型 : 将SQL关键字视为"位" 在"位"的两边插入各种符号(注释、运算符等) 计算公式: Factor[((x^n)*4 + x*y)*m] x:有毒标识 n:位数 y:数据库语法糖 m:编码转换 传输过程测试点 : 中间件特性/缺陷 特定条件下的WAF欺骗 0x05 总结 WAF绕过核心思想 : 理解WAF工作原理 掌握数据库和容器特性 灵活组合各种绕过技术 注重细节和推理 未来方向 : 文件上传WAF绕过 Webshell防御绕过 权限提升WAF绕过 通过系统化的测试方法和不断积累的绕过技术,可以有效突破主流WAF的防护。关键在于理解WAF的检测机制,并针对性地构造绕过Payload。