
文章目录前言那堵墙既是盾也是靶第一章 知彼WAF 的防御逻辑与弱点分析1.1 三种架构三种命门1.2 检测逻辑的盲区第二章 避实击虚绕过云 WAF 的“核武器”2.1 寻找源站 IP穿云箭的终极奥义2.2 云 WAF 的边界模糊重放攻击与 IP 防护失效第三章 拆解规则ModSecurity 与正则的迷藏3.1 分块传输编码HTTP 协议层面的隐身衣3.2 编码与双重编码字符集的“双重间谍”3.3 HTTP 参数污染HPP混乱中的狙击第四章 语法变异SQL 注入与 XSS 的特洛伊木马4.1 SQL 注入注释与空白符的交响曲4.2 XSS标签与事件的“七十二变”第五章 高阶对抗机器学习与人机识别的博弈5.1 模拟真实用户流量不仅仅是换个 User-Agent5.2 云 WAF 的 JS 挑战与重放攻击第六章 防御视角构建更坚固的墙结语没有完美的盾只有永恒的博弈前言那堵墙既是盾也是靶在渗透测试的攻防博弈中Web 应用防火墙WAF无疑是最让测试者头疼的存在。它像一道无形的墙横亘在攻击者与目标服务器之间。当你满怀信心地输入admin or 11--时回来的往往不是数据库报错而是那冷冰冰的 403 Forbidden。WAF 是为了拦截已知的攻击模式而生的而“未知”正是它的死穴。它像是一个守门的卫兵虽然手里拿着名单严查可疑分子但如果你化了妆、换了装束、或者是走了卫兵不看管的小门依然可以溜进去。本文将剥离枯燥的参数说明从实战角度出发深入剖析 WAF 的检测逻辑缺陷系统性梳理针对云 WAF 和 ModSecurity 的绕过技巧带你领略这场“穿墙而过”的艺术。第一章 知彼WAF 的防御逻辑与弱点分析要绕过 WAF首先要理解它是如何“思考”的。不同的 WAF 架构决定了它们不同的弱项。1.1 三种架构三种命门目前市面上的 WAF 主要分为三种形态每种形态都有其天然的攻击面硬件 WAF盒式 WAF部署在 Web 服务器前端串接在网络链路中。弱点性能压力大。为了避免成为网络瓶颈复杂的正则匹配通常会较少且对 HTTPS 流量的解密能力有限受限于硬件加速卡。如果流量巨大其检测深度会降低。软件 WAF如 ModSecurity以模块形式嵌入 Web 服务器。弱点完全依赖正则表达式规则库如 OWASP CRS。正则的贪婪匹配和回溯机制容易导致性能瓶颈且对语义分析的缺失使其容易被语法变形绕过。云 WAF如 Cloudflare、阿里云盾通过 DNS 解析将流量牵引至云端清洗。弱点“源站 IP”是它的阿喀琉斯之踵。云 WAF 是代理只要找到源站 IP直接对源站发起攻击云 WAF 就成了摆设。此外云 WAF 对“误杀”极其敏感为了用户体验规则往往较宽容。1.2 检测逻辑的盲区无论哪种 WAF核心检测逻辑通常基于以下三点而这三点正是我们突破的方向规则匹配检测 Payload 中是否包含关键词如select,alert,eval。绕过思路混淆、编码、拆分关键词。协议解析解析 HTTP 协议提取参数。绕过思路协议破坏、参数污染、编码差异。行为分析检测访问频率、路径特征。绕过思路低频扫描、模拟人工点击、分散 IP。第二章 避实击虚绕过云 WAF 的“核武器”针对云 WAF最有效的方法往往不是在 Payload 上“雕花”而是从架构层面降维打击。2.1 寻找源站 IP穿云箭的终极奥义云 WAF 的工作原理是代理。只要找到网站的真实 IP 地址攻击者就可以绕过云端的防护直达源站。实战技法一历史 DNS 解析记录很多网站在接入云 WAF 之前DNS 记录是指向源站 IP 的。即使后来接入了 WAF历史快照可能依然保留。工具SecurityTrails、ViewDNS.info、Netcraft Site Report。操作查询目标的 DNS 历史寻找 A 记录变更前的 IP。实战技法二子域名旁站探测主域名防护严密但子域名往往被遗忘。场景目标www.target.com接入了 Cloudflare但test.target.com或mail.target.com可能直接解析到源站 IP或者同 C 段 IP。通过端口扫描如 Masscan Nmap识别 C 段内开启 80/443 端口的服务器逐个尝试 Host 头绑定即可定位源站。实战技法三网络空间搜索引擎利用 ZoomEye、Shodan、Fofa 等引擎搜索目标网站特有的特征如 HTML Title、特定的 JS 文件名、服务器响应头中的独特字段。语法示例app:Coremail hostname:target.com往往能直接搜出未防护的邮件系统入口。实战技法四SSL 证书泄露HTTPS 证书中包含 SANSubject Alternative Name信息。攻击者可以在全网扫描 SSL 证书匹配目标域名从而发现未接入 WAF 的 IP。2.2 云 WAF 的边界模糊重放攻击与 IP 防护失效如果源站 IP 实在找不到或者被锁死在云 WAF 后端我们就要从流量层入手。技巧请求走私的前奏——Host 头篡改部分云 WAF 在回源时仅根据 CNAME 或后端代理配置转发未严格校验 Host 头。攻击在请求包中修改Host: target.com为Host: 源站IP。如果 WAF 仅检查路径而忽略 Host或者后端服务器配置为基于 IP 的虚拟主机这种请求可能直接穿透 WAF 的域名绑定规则。第三章 拆解规则ModSecurity 与正则的迷藏ModSecurity 是软件 WAF 的代表其核心是 OWASP Core Rule Set (CRS)。由于它重度依赖正则表达式我们的对抗重点就是**“破坏正则的匹配环境”**。3.1 分块传输编码HTTP 协议层面的隐身衣这是绕过 WAF 最经典、最有效的技巧之一。HTTP 协议允许将消息主体分成若干个块传输。原理WAF 通常需要等待请求体完整到达后才进行检测。如果请求体过大WAF 可能会拒绝或只检测前 N 个字节。利用Transfer-Encoding: chunked我们可以控制数据包的发送节奏。实战操作原始请求POST /login HTTP/1.1 Content-Type: application/x-www-form-urlencoded usernameadmin or 11-- -绕过请求POST /login HTTP/1.1 Transfer-Encoding: chunked Content-Type: application/x-www-form-urlencoded 5 usern 5 ame 2 ad ...通过将 Payload 拆分成极小的块或者利用0\r\n\r\n结束符前的延时很多 WAF 在处理这种非标准或恶意的分块时会出错导致拒绝服务或直接放行。注意现代 WAF如 ModSecurity v3已对此有防御但在某些配置不当的环境下尤其是结合 HTTP/2 或 HTTP Pipeline 时依然有效。3.2 编码与双重编码字符集的“双重间谍”WAF 和后端服务器对字符集的理解差异是绕过的富矿。双重 URL 编码WAF 通常只解码一次 URL。如果后端服务器配置了双重解码如 Tomcat 某些版本或特定配置攻击者可以编码两次。Payloadselect-%73elect-%25%37%33elect。WAF 看到%25开头认为只是一个百分号放行。后端服务器解析一次变成%73elect再解析一次变成select。Unicode 编码滥用在 JSON 或 XML 传输中利用 Unicode 转义。Payloadscriptalert(1)/script绕过\u003cscript\u003ealert(1)\u003c/script\u003e如果 WAF 不解析 Unicode 转义字符它只看到一堆乱码。但前端的 JS 解析器会自动还原并执行。3.3 HTTP 参数污染HPP混乱中的狙击WAF 如何处理重复参数这是一个经典的逻辑漏洞。场景http://target.com/search?id1idselect * from usersASP/IIS取最后一个参数idselect * from users。PHP/Apache取第一个参数id1。ModSecurity/CRS通常检测所有参数。实战利用如果后端是 PHPWAF 是全参数检测。Payload?idselect * from usersid1WAF 检测到select拦截反转思路如果 WAF 仅检测第一个参数而后端取最后一个某些特殊配置。Payload?idlegitimate_dataidevil_payloadWAF 看到legitimate_data放行。后端执行了evil_payload。此外利用参数分隔符差异;、、也可能导致 WAF 解析错位。第四章 语法变异SQL 注入与 XSS 的特洛伊木马当协议层面的路走不通时我们需要回归 Payload 本身进行“微创手术”。4.1 SQL 注入注释与空白符的交响曲ModSecurity 的 SQLi 规则极其严格但依然有缝隙。空白符替换正则通常匹配空格 或制表符\t。但在数据库中空白符是多样的。MySQL%09(Tab),%0A(New Line),%0D(Carriage Return),%0B(Vertical Tab),%0C(Form Feed),%A0(Non-breaking Space).Payloadselect username,password from users-select%0Ausername,password%0Afrom%0Ausers。很多 WAF 的正则\s无法完全覆盖%A0这种特殊空白。注释符切割利用数据库的注释特性打断关键词匹配。MySQL 内联注释sel/**/ect。MySQL 版本号注释/*!50000select*/。这种写法表示如果 MySQL 版本大于 5.00.00则执行select。WAF 往往将/*!...*/视为普通注释而忽略但数据库会执行其中的代码。科学计数法与浮点数某些 WAF 对数字型注入有严格的(\d)正则匹配。Payloadwhere id1e0union select...1e0在数学上等于 1但正则\d可能不匹配包含字母的数字形式导致 WAF 解析错位将union误认为是前面的参数的一部分。4.2 XSS标签与事件的“七十二变”XSS 的绕过核心是找到被黑名单遗漏的标签或事件。HTML 实体编码WAF 看到script会拦截但svg onloadalert(1)可能漏过。进一步利用 HTML 实体编码img srcx onerroralert(1)-img srcx onerror#97;lert(1)如果 WAF 不对参数值进行 HTML 实体解码攻击就能成功。DOM Clobbering 的前端陷阱这是一种高级绕过。我们不直接注入 JS而是注入 HTML 标签来覆盖页面的 DOM 结构。例如注入a idconfig hrefevil.com/a。如果页面 JS 中使用了document.getElementById(config).href攻击者就控制了配置。WAF 很难检测这种逻辑型攻击因为它不包含明显的恶意脚本特征。标签闭合与属性逃逸如果 WAF 强制过滤双引号尝试利用单引号或反引号。Payloadimg srcx onerroralert1利用 SVG 标签的特性允许 XML 命名空间svgscriptalert(1)/script/svg在 SVG 上下文中script标签会被不同地解析可能绕过针对 HTML 的正则。第五章 高阶对抗机器学习与人机识别的博弈现代云 WAF如 Cloudflare引入了机器学习模型和行为分析。传统的 Payload 变形开始失效我们需要上升到“流量伪装”的维度。5.1 模拟真实用户流量不仅仅是换个 User-Agent很多爬虫或扫描器被拦截是因为行为太“机器人”。特征请求频率恒定、不加载静态资源CSS/JS/图片、Referer 链缺失、Cookie 处理不当。实战对策全流量模拟使用 Headless BrowserPuppeteer/Playwright。不仅请求 API还要请求页面引用的所有 JS 和 CSS。这不仅能绕过简单的频率限制还能应对“蜜罐链接”页面中隐藏的、用户不可见但爬虫会请求的链接。速率抖动不要以每秒 10 个请求的速度匀速扫描。模拟人类的阅读速度加入随机延时甚至模拟“下班时间”夜间停止扫描。指纹对抗TLS 指纹和 HTTP 指纹。很多 WAF 会识别 Pythonrequests库或 SQLMap 的默认指纹。使用 Go 语言编写工具或配置 Curl/Python 适配 Chrome 的 TLS Cipher Suite 顺序JA3 指纹伪装是高阶渗透的必修课。5.2 云 WAF 的 JS 挑战与重放攻击Cloudflare 等云 WAF 常用 JS 挑战来验证浏览器环境。原理返回一个包含 JS 计算结果的页面只有浏览器执行了 JS 并跳转才允许访问。绕过无头浏览器最简单使用 Puppeteer 自动执行 JS。逆向 JS 脚本如果为了追求速度必须逆向 Cloudflare 的 anti-bot JS。虽然极难但社区常有现成的脚本如cloudscraper。重放攻击在某些配置下WAF 验证通过后的 Cookie (cf_clearance) 具有较长的有效期且绑定 User-Agent 和 IP。攻击者可以在浏览器里人工过一遍验证拿到 Cookie 后用 Python 携带该 Cookie 和对应的 User-Agent 进行高速扫描。第六章 防御视角构建更坚固的墙作为攻防两端的老兵我必须给防御者一些建议。攻防的本质不是比谁更聪明而是比谁的失误更少。源站隐蔽与访问控制这是防御云 WAF 绕过的根本。在源站服务器上配置白名单仅允许云 WAF 的 IP 段访问。即使攻击者找到源站 IP也会被防火墙拦截。深度解析与语义分析不要依赖单一的正则匹配。部署支持语义分析的 WAF或者结合 RASP运行时应用自我保护技术。RASP 挂钩在应用内部能直接看到解码后的最终数据完美免疫各种编码绕过。配置严格的 HTTP 协议规范禁用不必要的 HTTP 方法限制Transfer-Encoding对异常的请求头直接丢弃而非尝试解析。异常行为阻断建立 IP 信誉库。对于高频访问、不请求静态资源的 IP直接触发人机验证Captcha。不要试图拦截所有攻击只需让攻击者的成本高于其收益。结语没有完美的盾只有永恒的博弈WAF 绕过技术日新月异。从最基础的编码变形到协议层面的走私攻击再到架构层面的源站定位本质上都是在寻找防御规则与实际执行之间的“缝隙”。ModSecurity 的规则可以写得无限复杂云 WAF 的 AI 模型可以训练得无限精准但只要人类还在编写代码只要软件还在解析输入那个“缝隙”就永远存在。对于渗透测试者而言绕过 WAF 不是目的而是为了发现更深层的逻辑漏洞。我们穿墙而过是为了告诉防守者墙上有洞风会进来。在这个过程中我们见证了技术的脆弱也推动了防御的进化。