WAF绕过技术全面解析:从原理到实践方案(简易版)

Web 应用防火墙 (WAF) 作为保护网站安全的重要防线,其绕过技术一直是网络安全研究的热点领域。本文将系统性地介绍 WAF 绕过的方法论、具体技术方案和实践策略,内容涵盖网络架构层、HTTP 协议层、应用层以及数据库层的绕过技术,并提供详细的案例分析和防御建议。

WAF基础与绕过方法论

Web 应用防火墙 (WAF) 是一种专门设计用来保护 Web 应用程序的安全解决方案,它通过监控、过滤和阻止恶意 HTTP/HTTPS 流量来防御各类网络攻击。WAF 通常部署在 Web 应用程序和客户端之间,像一座 "智能安检门" 检查所有进出网站的流量,核心任务包括拦截攻击 (如 SQL 注入、XSS)、过滤异常请求(如 CC 攻击) 以及通过 "虚拟补丁" 临时隐藏漏洞。

WAF 的工作流程可分为四个关键阶段:

  1. 预处理阶段:判断请求是否为 HTTP/HTTPS,检查 URL 是否在白名单中

  2. 规则检测阶段:将解析后的数据包与预置规则库进行匹配

  3. 处理模块:根据检测结果执行放行、阻断或告警操作

  4. 日志记录:记录所有拦截和处理日志供后续分析

绕过 WAF 的本质是寻找 WAF 设备之后处理应用层数据包的硬件 / 软件特性,构造 WAF 无法识别但应用程序能成功执行的载荷。这些特性就像特定场景,当满足这些场景而 WAF 未考虑时,就能实现绕过。成功的 WAF 绕过需要三个关键条件:熟练掌握目标系统函数和语法、深入了解中间件运行机制,以及了解 WAF 的防护原理和方法。

从技术实施角度看,WAF 绕过可分为四大层面:

  1. 网络架构层绕过:针对 WAF 部署位置的绕过

  2. HTTP 协议层绕过:利用协议解析差异

  3. 应用程序层绕过:利用应用特性或漏洞

  4. 数据库层绕过:利用数据库特性和 SQL 语法技巧

网络架构层绕过技术

网络架构层的 WAF 绕过主要针对 WAF 的部署位置和网络流量路径设计,核心思路是避开 WAF 的检测范围找到防护体系的薄弱环节。这一层的绕过尤其适用于云 WAF 场景,通过寻找真实服务器 IP 或利用网络配置不当实现绕过。

寻找真实IP绕过云WAF

云 WAF 通常通过 DNS 解析将流量引导至云端防护节点,找到网站的真实服务器 IP 即可实现直接访问,绕过云 WAF 的防护。以下是几种有效的真实 IP 发现方法:

  1. 二级域名与其他域名解析记录

    • 查找同一域名注册者下的其他域名解析记录,特别是未接入 WAF 的二级域名(如 test.example.com、dev.example.com)可能直接解析到真实 IP

    • 使用工具如dignslookup查询相关域名的 DNS 记录

  2. 邮件服务器 MX 记录

    • 邮件服务器通常与 Web 服务器位于同一网络环境,通过查询域名的 MX 记录可能发现真实 IP

    • Windows 下使用nslookup -qt=mx example.com

    • Linux 下使用dig mx example.com

  3. 历史解析记录查询

    • 网站接入云 WAF 前的 DNS 记录可能暴露真实 IP

    • 使用 SecurityTrails 等服务查询域名历史解析记录: https://securitytrails.com/

  4. 全网扫描与 SSRF 利用

    • 使用 Zmap 等快速扫描工具对全网 IP 进行扫描,通过特征比对找到真实服务器

    • 若目标存在 SSRF 漏洞,可通过漏洞反向连接获取网站真实 IP

利用网络配置漏洞

除了寻找真实 IP,网络架构层的绕过还包括:

  1. 同网段绕过:当 WAF 仅防护特定网段时,通过处于同一内网的其他设备发起请求可能绕过防护

  2. 边界漏洞利用:利用网络边界设备(如负载均衡器、CDN 节点)的配置缺陷或漏洞,将恶意流量注入到 WAF 防护区域之外

  3. IP 白名单绕过:部分 WAF 对搜索引擎爬虫或特定 IP 段(如公司内网)设置白名单,伪装成这些可信来源可能绕过检测

表:网络架构层绕过技术对比

技术方法

适用场景

实施难度

隐蔽性

所需工具

二级域名解析

存在未防护子域名

dig/nslookup

MX 记录查询

邮件与 Web 同服务器

系统内置命令

历史记录查询

域名曾直接解析

SecurityTrails

全网扫描

其他方法无效

Zmap 等扫描器

SSRF 利用

存在 SSRF 漏洞

漏洞利用工具

网络架构层的绕过往往是最直接有效的方法,但依赖于目标系统的配置情况和信息收集的全面性。在实际渗透测试中,这些技术常与其他层面的绕过方法结合使用,形成多层次的绕过策略。

HTTP协议层绕过技术

HTTP 协议层的绕过技术利用 WAF 与后端服务器在协议解析上的差异,通过构造特殊的 HTTP 请求实现防护绕过。这种类型的绕过不依赖于特定应用程序或数据库,具有较高的通用性,是 WAF 绕过中最常用的方法之一。

SSL/TLS协议绕过

利用 WAF 对 SSL 加密算法支持不全面的特性可以实现绕过,特别是在某些硬件 WAF 场景下:

  1. SSL/TLS 版本与加密套件探测

    • 使用sslscan工具识别服务器支持的 SSL/TLS 版本和加密套件:sslscan http://target/ | grep Accept

    • 对比 WAF 与后端服务器支持的加密算法,找出 WAF 不支持但服务器支持的组合

  2. 特定加密算法请求

    • 使用 curl 指定特定加密套件发起请求:

      curl --ciphers ECDHE-RSA-AES256-SHA https://waf-test.lab.local/ssl-cipher-test
    • 这种方法可能使 WAF 无法解密检测流量,而后端服务器能正常处理

HTTP协议版本与管道化技术

HTTP 协议版本的差异和管道化技术可有效绕过部分 WAF 的检测机制:

  1. HTTP 协议版本差异

    • 通过发送非标准 HTTP 版本请求 (如 HTTP/0.9) 或最新版本 (如 HTTP/2) 利用 WAF 解析差异

    • 某些 WAF 对老版本协议支持不完善,可能忽略部分恶意请求

  2. HTTP 管道化 (Pipeline) 技术

    • 在单个 TCP 连接中连续发送多个 HTTP 请求,利用 WAF 可能只检测第一个请求的特性

    • 需要设置Connection: keep-alive头部维持连接

    • 第一个请求为正常请求,后续请求包含恶意载荷

  3. 分块传输编码 (Chunked Transfer Encoding)

    • 使用Transfer-Encoding: chunked头部,将请求体分块发送

    • WAF 与后端服务器对分块数据解析逻辑可能不一致

    • 数据最后需要用0独占一行表示结束

编码与内容类型绕过

利用各种编码方式和内容类型声明可以混淆 WAF 的检测规则:

  1. URL 编码与双重 URL 编码

    • 对特殊字符进行 URL 编码:'变为%27 变为%20

    • 双重 URL 编码:%27变为%2527,部分 WAF 只解码一次

    • 案例:' OR 1=1 --编码为%2527%2520OR%25201%253D1%2520--绕过安全狗

  2. 字符集编码 (Charset) 绕过

    • 修改Content-Type头部使用非常用字符集:

      Content-Type: application/x-www-form-urlencoded;charset=ibm500
    • 可用字符集包括 ibm037、ibm500、cp875、ibm1026 等

    • Burpsuite 的 HTTP Request Smuggler 插件可简化此类数据包修改

  3. MIME 编码绕过

    • 主要用于 Spring 框架,利用文件名 MIME 解码特性

    • 文件名格式:=?charset?B?base64str?=,如=?UTF-8?B?YS5gc3A=?=解码为a.jsp

    • WAF 可能未处理此类编码而直接放行

请求头与参数污染技术

请求头操纵和参数污染是 HTTP 协议层绕过的有效手段:

  1. Host 头绕过

    • 修改 Host 头绕过基于域名防护的 WAF:

      Host: localhost:80
      Host: 127.0.0.1:80
    • 适用于 WAF 仅验证特定 Host 头的场景

  2. HTTP 参数污染 (HPP)

    • 提交多个同名参数,利用 WAF 与后端取参差异:

      ?id=1&id=union select 1,2,3
    • WAF 可能检查第一个id参数,而后端取最后一个

    • 不同服务器对多值参数的处理方式不同,PHP 通常取最后一个,ASP.NET 取第一个

  3. Content-Type 切换

    • application/x-www-form-urlencoded改为multipart/form-data

    • 部分 WAF 对 multipart 请求只检测文件上传,忽略其他攻击

    • 需要构造合适的 boundary 和请求结构

表:HTTP 协议层主要绕过技术对比

技术类别

具体方法

适用 WAF 类型

检测难度

实施复杂度

SSL/TLS 绕过

加密套件差异

硬件 WAF

协议版本

HTTP/0.9 或 HTTP/2

云 WAF/ 硬件 WAF

分块编码

Transfer-Encoding: chunked

多数 WAF

双重 URL 编码

%2527 代替 %27

规则简单 WAF

字符集编码

charset=ibm500

依赖内容检测 WAF

参数污染

多个同名参数

参数检查不严 WAF

HTTP 协议层的绕过技术不断创新,随着 HTTP/3 等新协议的出现和各类中间件解析差异的发现,未来将出现更多基于协议特性的绕过方法。这些技术往往可以组合使用,形成更复杂的绕过策略。

应用程序层绕过技术

应用程序层绕过技术主要利用 Web 应用程序、中间件或脚本引擎的特有功能或解析差异来绕过 WAF 检测。这类绕过方法通常针对特定技术栈,需要根据目标系统的具体实现选择合适的技术。

Web服务器特性利用

不同 Web 服务器对 HTTP 请求的解析存在差异,这些差异可被用于 WAF 绕过:

  1. IIS 服务器 % 特性

    • 在 ASP+IIS 环境中,s%elect可能被解析为select

    • 因 IIS 会删除%字符,而 WAF 可能保留原始输入

    • 类似地,un%ion可绕过对union关键词的检测

  2. IIS Unicode 解析特性

    • IIS 支持 Unicode 解析,如s%u0065lect被转换为select

    • 更高级的技巧是利用多个 widechar 转换为同一字符:

      • %u0065(e) 和%u00f0都会被转换为e

    • 案例:s%u0065lects%u00f0lect都被解析为select

  3. Apache 畸形 Method 处理

    • 某些 Apache 版本会忽略非常规 HTTP 方法,如DOTA2 /?id=1可能被当作 GET 请求处理

    • WAF 可能严格校验方法类型而导致绕过

    • 可尝试非标准方法如GETTPOSTx

  4. PHP 解析特性

    • PHP 在解析 multipart 数据时,boundary 识别可能只取逗号前内容

    • 设置 boundary 为----aaaa,123456,PHP 只识别----aaaa

    • WAF 可能获取整个字符串导致解析不一致

文件上传绕过技术

文件上传是常见的攻击向量,针对 WAF 的上传过滤有多种绕过方法:

  1. 多重 filename 属性

    • PHP 取最后一个 filename 值,而 WAF 可能检查第一个:

      Content-Disposition: form-data; name="file"; filename="a.txt";filename="a.php"
    • 最终服务器接收a.php,而 WAF 检查a.txt

  2. boundary 与注释混淆

    • 在 boundary 中插入注释或特殊字符:

      Content-Type: multipart/form-data; boundary=----12345/*test*/
    • 不同组件对注释的处理可能不一致

  3. 文件内容混淆

    • 在文件开头添加大量注释或垃圾数据(超过 WAF 检测大小限制)

    • 使用图片马或混合内容绕过内容检测

    • 对文件内容进行编码或加密

脚本命令执行绕过

系统命令执行是攻击的常见目标,有多种方法可绕过 WAF 对命令的检测:

  1. Linux 命令绕过

    • 空格绕过:

      cat</etc/passwd
      cat${IFS}/etc/passwd
      X=$'cat\x20/etc/passwd'&&$X
    • 命令分割:

      c'a't /etc/pass'"wd
      c""at /e't'c/pass""wd
      /b??/ca? /e?c/pas?wd
    • 通配符扩展:/b*/ca* /et*/pas*d

  2. Windows 命令绕过

    • 变量截取与拼接:

      set a=net user & call %a%
      %CommonProgramFiles:~10,-18%baidu.com
    • 特殊字符干扰:wh^o^am""i

    • 算术表达式:%PROGRAMFILES:~10,-5%

  3. 脚本引擎执行

    • 通过 Perl、Python 等执行命令:

      python -c 'import subprocess; subprocess.call(["ca"+"t","/et"+"c/pa"+"sswd"])'
    • PHP:php -r 'exec("ca"."t /et"."c/pa"."sswd");'

    • Base64 编码执行:

      echo Y2F0IC91dGMvcGFzc3dk | base64 -d | sh

编码与混淆技术

各种编码转换和混淆技术可有效绕过基于关键词检测的 WAF 规则:

  1. 多重编码组合

    • Unicode 编码:\u0065\u0076\u0061\u006c代替eval

    • HTML 实体编码:&lt;script&gt;代替<script>

    • 混合编码:%3Cimg%20src%3Dx%20onerror%3Dalert(1)%3E绕过 XSS 过滤

  2. 变量与字符串拼接

    • JavaScript:['al','ert'].join('')('1')

    • PHP:$a='ass';$b='ert';$c=$b.$a; $c(1);

    • SQL:CONCAT('sel','ect')代替select

  3. 进制转换与特殊表示

    • 十六进制:0x61646D696E代替admin

    • 八进制:\163\145\154\145\143\164(select)

    • 十进制:char(115,101,108,101,99,116)

表:应用程序层绕过技术适用场景

技术类型

适用环境

检测难度

实施复杂度

典型案例

IIS % 特性

ASP+IIS

s%elect → select

多重 filename

PHP 应用

文件上传绕过

命令分割

Linux 系统

c'a't /etc/passwd

变量拼接

Windows 系统

set a=net user & call %a%

Unicode 编码

支持 Unicode 解析的系统

\u0065 → e

多重编码

所有 Web 应用

混合 URL+Unicode 编码

应用程序层的绕过技术高度依赖于目标系统的具体实现和环境配置,在实际渗透测试中需要结合信息收集结果选择合适的技术。随着 Web 技术的发展和新编程特性的出现,这类绕过方法也在不断演进和丰富。

数据库层绕过技术

数据库层绕过技术专门针对 WAF 的 SQL 注入防护机制,利用数据库特性和 SQL 语法技巧构造恶意查询。这类技术需要深入了解各类数据库的语法差异和特性,是 SQL 注入攻击中的高级技巧。

SQL注释与空白符技巧

注释和空白符的灵活运用是绕过 WAF 关键词检测的基础方法:

  1. 注释符绕过

    • 普通注释:union/**/select使用/**/分割关键词

    • 长注释干扰:union/*aaaaaaaaaaaaa*/select消耗 WAF 匹配资源

    • 内联注释 (MySQL 特有):/*!union*/select/*!50000union*/select

    • 版本号注释:/*!32302 1/0*/仅在 MySQL 3.23.02 以下版本执行

  2. 空白符替代

    • MySQL 空白符包括:%09(TAB)、%0A(换行)、%0B%0C%0D%A0

    • 特殊空白符:%25A0(URL 编码的%A0)

    • 案例:union%250Cselect利用换页符分隔关键词

  3. 注释与换行组合

    • 1%23%0AAND%23%0A1=1%23解码后:

      1#
      AND#
      1=1#
    • #在 MySQL 中为注释符,%0A为换行

数据库函数与语法特性

利用数据库特有函数和语法特性可构造复杂绕过载荷:

  1. 函数分隔技巧

    • concat%2520(使用双重编码空格

    • concat/**/(使用注释分隔

    • concat%25a0(使用特殊空白符

  2. 浮点数词法解析

    • id=8E0union select 1,2,3

    • id=8.0union select 1,2,3

    • id=\Nunion select 1,2,3

  3. MySQL 特殊语法

    • ODBC 转义语法:select {x table_name} from {x information_schema.tables}

    • 大括号表达式:union{x select{x 1},2}

  4. 报错注入函数

    • extractvalue(1,concat(0x5c,md5(3)))

    • updatexml(1,concat(0x5c,md5(3)))

    • 几何函数:

      GeometryCollection((select * from (select * from (select @@version)x)y))
      polygon((select * from (select name_const(version(),1))x))
    • 这些函数常被 WAF 忽略但能执行 SQL

等价替换与逻辑混淆

通过关键词替换和逻辑重构可绕过简单的关键词过滤规则:

  1. 关键词等价替换

    • and&&or||

    • =likerlike

    • sleep()benchmark(10000000,md5(1))

    • substr()substring()mid()

  2. 逻辑重构

    • union select 1,2union select * from ((select 1)A join (select 2)B)

    • if(a,b,c)case when a then b else c end

    • limit 1,1limit 1 offset 1

  3. 十六进制与字符编码

    • admin0x61646D696E

    • selectchar(115,101,108,101,99,116)

    • 部分场景可用二进制或八进制表示

高级绕过技术

针对复杂 WAF 规则的高级绕过方法:

  1. 缓冲区溢出绕过

    • 构造超长参数名或值消耗 WAF 处理资源

    • 如超过 48KB 的 POST 数据可能绕过某些 ISAPI 过滤器

    • 案例:填充 48KB 无用数据后再写注入语句

  2. PCRE 限制绕过

    • 利用 WAF 的正则匹配次数限制 (PCRE_EXTRA_MATCH_LIMIT)

    • 注入大量注释消耗匹配资源:

      union/*aaa...*/select
    • 当注释字符超过 100 万时可能绕过部分 WAF

  3. Libinjection 绕过

    • Libinjection 是许多 WAF 使用的 SQLi 检测库

    • 使用不常用 SQL 函数:mod(3,2) union select mod(3,2),usr,pwd from user

    • 特殊字符插入:1<@可能绕过检测

    • 大括号语法:1 and{ifupdatexml(1,concat(0x3a,(select schema_name from information_schema.schemata limit 0,1)),1)}

  4. Fuzz 测试绕过

    • 编写脚本自动化测试各种变异组合

    • 使用随机 UA 头减少被封锁风险

    • 示例 Fuzz 向量:

      fuzz_aa = ['/*', '*/', '/*!', '*', '=', '`', '!', '@', '%', '.', '-', '+', '|', '%00']
      fuzz_bb = ['', ' ']
      fuzz_cc = ["%0a", "%0b", "%0c", "%0d", "%0e", "%0f", "%0g", "%0h", "%0i", "%0j"]
    • 组合测试如/*!union%s%s%sselect*/

表:数据库层绕过技术分类

技术类型

主要方法

适用数据库

检测难度

实施复杂度

注释干扰

/**/、/!/、#

多数数据库

空白符变异

%0A、%A0 等

MySQL、MSSQL

报错注入

updatexml 等

MySQL

等价替换

&& 代替 and

多数数据库

ODBC 语法

{x select}

MySQL

PCRE 限制

超长注释

规则严格 WAF

Libinjection 绕过

特殊字符插入

使用 Libinjection 的 WAF

数据库层绕过技术是 SQL 注入攻击中的高级主题,需要根据目标数据库类型和 WAF 规则特点选择合适的技术组合。随着 WAF 技术的进步,单纯的注释或大小写变换可能不再有效,需要结合协议层和应用层技术形成多层次的复合绕过策略。

综合绕过策略与防御建议

前文详细介绍了各层面的 WAF 绕过技术,但在实际环境中,单一技术往往难以突破现代高级 WAF 的防护。本章将探讨如何综合应用各类技术形成有效的绕过策略,同时从防御角度提供 WAF 配置建议,帮助安全人员加固防护体系。

多技术组合绕过策略

分层组合攻击是突破 WAF 的有效方法,通过结合网络层、协议层和应用层技术构造复杂攻击载荷:

  1. 编码嵌套组合

    • 将 Unicode 编码与双重 URL 编码结合:%25%37%35( 双重编码的u) + %25%36%35(e) = %u0065

    • HTML 实体编码嵌套 Base64:&lt;script&gt; + Base64编码事件处理函数

    • 案例:%2527(双重编码单引号) + %20union%20 + %0Aselect(换行分隔)

  2. 协议与数据库层结合

    • 使用 HTTP 分块传输编码发送 SQL 注入载荷

    • 在 POST 数据超过 48KB 后插入 SQL 语句,绕过 ISAPI 过滤器

    • 修改 Content-Type 为multipart/form-data同时使用数据库注释符分隔关键词

  3. 应用与数据库层结合

    • 利用 PHP 的filename解析特性上传.php文件,文件内容包含编码后的 SQL 语句

    • 通过文件包含漏洞执行上传文件,触发二次 SQL 注入

    • 案例:上传文件名为=2UTF-82B?YS5gc3A=?=(解码为 a.jsp),内容包含<% execute(request("cmd")) %>

情景化绕过流程示例

  1. 通过 DNS 历史记录找到真实 IP,绕过云 WAF

  2. 使用curl --ciphers ECDHE-RSA-AES256-SHA建立 SSL 连接

  3. 发送分块编码的 POST 请求,参数名重复且第一个参数正常

  4. SQL 语句中使用/*!union*/内联注释和%0A换行

  5. 关键表名和列名使用十六进制表示0x7573657273(users)

WAF绕过检测与防御

针对日益复杂的绕过技术,防御方需要采取多层次的安全措施:

  1. WAF 配置加固建议

    • 启用全量解码检测:对 URL 编码、Unicode、Base64 等进行多层解码后检测

    • 限制最大 HTTP 头数量和大小,防止缓冲区溢出攻击

    • 设置合理的 PCRE 匹配限制,既防 ReDoS 又避免被绕过

    • 对所有同名参数进行检测,而非仅第一个或最后一个

  2. 架构设计建议

    • 避免暴露真实 IP,定期检查 DNS 记录

    • 邮件服务器与 Web 服务器分离,MX 记录不指向业务 IP

    • 使用网络层 ACL 限制非 HTTP/HTTPS 流量访问 Web 服务器

    • 考虑混合部署模式:云 WAF+ 本地硬件 WAF 形成多层次防护

  3. 监控与日志分析

    • 记录所有被拦截请求的原始数据,包括 HTTP 头和 body

    • 对成功请求进行抽样分析,检测潜在绕过行为

    • 建立异常流量基线,监控偏离基线的请求模式

    • 使用机器学习检测编码异常和参数变异模式

  4. 代码层防御

    • 使用参数化查询而非拼接 SQL

    • 输入验证采用白名单而非黑名单

    • 统一大小写处理,避免大小写绕过

    • 对文件上传进行内容检测而非仅依赖扩展名

未来趋势与研究方向

WAF 绕过技术仍在持续演进,以下几个方向值得关注:

  1. AI 驱动的绕过技术

    • 使用生成对抗网络 (GAN) 自动生成绕过载荷

    • 基于强化学习的自动化 Fuzz 测试框架

    • 上下文感知的语义绕过,理解应用逻辑后构造合法恶意请求

  2. 新兴协议与标准

    • HTTP/3 协议带来的新解析差异

    • WebAssembly 等新执行环境中的绕过可能性

    • 服务网格 (Service Mesh) 架构下的安全边界变化

  3. 硬件级绕过

    • 利用 CPU 推测执行等硬件特性绕过安全检测

    • 基于时间的侧信道攻击探测 WAF 规则

    • GPU 加速的暴力 Fuzz 测试

  4. 防御技术演进

    • 行为分析替代静态规则匹配

    • 客户端证明 (Client Proof) 技术验证请求合法性

    • 可编程 WAF 支持自定义检测逻辑

表:WAF 绕过与防御技术对比

技术维度

攻击方策略

防御方对策

技术成熟度

实施成本

编码混淆

多重嵌套编码

全量解码检测

协议差异

利用解析不一致

规范化处理

资源消耗

大数据包 / 长注释

合理限制

参数污染

多同名参数

全参数检测

语义分析

上下文相关载荷

行为分析

AI 对抗

自动生成载荷

AI 检测引擎

新兴

很高

WAF 绕过与防护是一场持续的攻防博弈,没有一劳永逸的解决方案。安全团队需要保持对最新绕过技术的了解,定期评估和调整防护策略,同时加强开发人员的安全培训,从源头减少漏洞的产生。只有将 WAF 与其他安全措施结合,形成纵深防御体系,才能有效应对日益复杂的网络攻击。

尤其是防止 xgz 干坏事,必须得加防御!


WAF绕过技术全面解析:从原理到实践方案(简易版)
https://uniomo.com/archives/wafrao-guo-ji-shu-quan-mian-jie-xi-cong-yuan-li-dao-shi-jian-fang-an-jian-yi-ban
作者
雨落秋垣
发布于
2025年12月12日
许可协议