WAF攻与防—自定义WAF规则与WAF绕过
字数 1583 2025-08-12 12:08:18

WAF攻防技术详解:自定义规则与绕过方法

一、WAF基础原理

WAF(Web应用防火墙)的核心原理是基于正则表达式匹配,通过定义各种攻击payload的模式来实施拦截。攻防双方在WAF技术上的对抗不断演进:

  • 防守方:通过分析WAF日志了解最新攻击方式,编写针对性规则
  • 攻击方:研究各种技术手段绕过WAF防护

二、WAF检测的关键变量

WAF主要检测以下12个请求变量:

  1. URL - 完整请求地址,如http://10.67.8.118:8889/abc/shell.php
  2. URL-path - 资源路径,如abc/shell.php
  3. Host - 主机地址,如10.67.8.118:8889
  4. Parameter-name - 参数名,如id(在id=123中)
  5. Parameter - 参数值,如123
  6. Header-name - 请求头名称,如Accept-Encoding
  7. Header - 请求头值,如gzip,deflate
  8. Cookie-name - Cookie名称,如id(在id=1中)
  9. Cookie - Cookie值,如1
  10. Version - HTTP版本,如1.1(HTTP/1.1)
  11. Method - 请求方法,如POST
  12. 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%u0006ectselect
  • 另类%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
  • 嵌套剥离selselectectselect(某些过滤器剥离后)
  • 宽字节:使用宽字符编码绕过

参数污染

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层特性

逻辑问题绕过

  1. 查找真实IP绕过CDN防护
  2. 同时提交GET和POST请求,WAF可能忽略GET参数
  3. HTTP和HTTPS同时开放,直接访问无防护的HTTP
  4. 使用%00截断,WAF可能只检测前半部分

性能问题绕过

  1. 参数数量溢出:填充大量参数使WAF不检测后面的恶意参数
    ?a0=0&a1=1&...&a100=100&id=1 union select 1,schema_name,3...
    
  2. 缓冲区溢出:超长测试向量导致WAF崩溃
    ?id=1 and (select 1)=(Select 0xA*1000)+UnIoN+SeLeCT...
    
  3. 重复请求:多次提交相同请求,部分可能绕过

白名单绕过

  1. IP白名单:伪造HTTP头(X-forwarded-for等)
  2. 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防护需要:

  1. 了解常见攻击模式并编写针对性规则
  2. 实施多因素验证和异常行为检测
  3. 定期更新规则库和安全策略
  4. 采用深度防御策略,不依赖单一防护机制

通过深入理解WAF工作原理和绕过技术,可以构建更强大的Web应用防护体系。

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. 基础防护机制 浏览器行为验证 进阶版本(结合IP): 更安全的散列验证(Lua实现): 防扫描模块 推荐使用成熟的防护模块: ngx_ lua_ waf 2. 针对特定攻击的规则 SQL注入防护 XSS防护 SSRF防护 RCE防护 四、WAF绕过技术 绕过WAF主要利用三方面特性:服务器特性、应用层特性和WAF层特性。 1. 利用服务器特性 ASP+IIS环境特性 %特性 : s%elect 可能被解析为 select %u特性 :Unicode编码绕过,如 s%u006c%u0006ect → select 另类%u特性 :不同Unicode可能解析为相同字符,如 %u0065 和 %u00f0 都解析为 e Apache畸形Method 2. 利用应用层特性 基本绕过技术 大小写转换 : AnD 1=2 注释插入 : URL编码 : / = %2f , * = %2a , % = %25 空字节 : id=1%00and 1=2 嵌套剥离 : selselectect → select (某些过滤器剥离后) 宽字节 :使用宽字符编码绕过 参数污染 组合技术 替换法+URL编码 : and → && → %26%26 内联注释+替换法 : 3. 利用WAF层特性 逻辑问题绕过 查找真实IP绕过CDN防护 同时提交GET和POST请求,WAF可能忽略GET参数 HTTP和HTTPS同时开放,直接访问无防护的HTTP 使用 %00 截断,WAF可能只检测前半部分 性能问题绕过 参数数量溢出 :填充大量参数使WAF不检测后面的恶意参数 缓冲区溢出 :超长测试向量导致WAF崩溃 重复请求 :多次提交相同请求,部分可能绕过 白名单绕过 IP白名单 :伪造HTTP头( X-forwarded-for 等) URL白名单 : 4. 分块传输绕过 基本分块传输 高级绕过技术 在分块长度标识后添加注释: 五、总结 WAF攻防是持续演进的过程,防守方需要不断更新规则并采用多层防护策略,而攻击者则不断研究新的绕过技术。有效的WAF防护需要: 了解常见攻击模式并编写针对性规则 实施多因素验证和异常行为检测 定期更新规则库和安全策略 采用深度防御策略,不依赖单一防护机制 通过深入理解WAF工作原理和绕过技术,可以构建更强大的Web应用防护体系。