配合参数污染实现绕过WAF的XSS攻击
利用WAF,参数解析器与受害者浏览器的JS解析器之间的差异进行攻击 利用对重复参数进行拼接的Web框架(如ASP.NET/Node.js),从而避开WAF对参数的审查 利用单引号分割(')突破ASP.NET的Jscript的逗号分隔符
- 将XSS载荷分散到多个HTTP参数可有效规避WAF检测
- 17种主流WAF配置中仅有3种能拦截复杂的参数污染攻击
- AI黑客机器人实现了100%的绕过成功率,可在数秒内发现简单漏洞
可以用的框架必须是会将重复的HTTP参数的值进行拼接或者组成字符数组(例如PHP/Apache取参数的最后一次赋值,Apache Tomcat取参数的第一次赋值, ASP和IIS取参数的所有赋值)
- 利用不同Web框架对同名参数的处理,实现载荷的分割从而避开 WAF
- 利用WAF,参数解析器与受害者浏览器的JS解析器之间的差异进行攻击
以 ASP.NET 为例:参数污染
以ASP.NET为例子,使用HttpUtility.ParseQueryString()
将重复的HTTP参数拼接并用逗号(,)隔开[^1]
'; alert(1); //
JavaScript 的语法允许使用逗号分隔表达式,从而按顺序执行多个语句。这一语言特性与 ASP.NET 的逗号连接行为相结合,为高级绕过技术创造了条件。
/?q=1'&q=alert(1)&q='2
-> 1',alert(1),'2
userInput = '1',alert(1),'2';
最终生成的 JavaScript 代码在语法上是有效的,会执行 alert 函数。JavaScript 中的逗号运算符会从左到右依次计算每个表达式,并返回最后一个表达式的值。这种模式在 JavaScript 代码压缩和混淆中被广泛使用。
WAF类型
基于特征指纹的WAF
基于签名的 WAF 曾是传统 Web 安全的主要防御形式。这类系统维护着已知攻击模式的数据库,并将传入请求与这些特征进行比对。当检测到匹配时,WAF 会记录、告警或阻断该请求。基于签名检测的主要优势在于其精确性——当攻击与已知特征匹配时,误报率通常较低。特征还可按置信度分级,从而支持以更低误报率为优先的严格安全配置。但这类系统难以应对新型攻击向量,需持续更新特征库才能保持防护效力。
基于机器学习的WAF
基于机器学习的 WAF 代表了 Web 应用安全的下一发展阶段。这类系统通过分析流量模式与用户行为来识别可能预示攻击的异常请求。与基于特征库的系统不同,采用机器学习技术的 WAF 理论上能够检测零日漏洞和未知攻击向量。但显然这需要代价——可能无法保证较低的误报率,若未与优质的预训练基准数据结合,流量水平较低的应用仍易受攻击。
为什么传统的waf难以处理HTTP参数污染
- WAF通常只会验证单个参数,对于多参数的组合容易错过
- 多数WAF不会对Web框架的参数解析机制解析进行特殊调整,它们可能无法模拟 ASP.NET 特有的逗号连接行为。
- WAF基于模式匹配行判断,而拼接式载荷在保持功能的完整性下,又难以与传统的XSS载荷验证
- 还有附加一些攻击的混淆技术,让WAF难以辨认
要检测此类攻击,WAF 需实现框架专属的参数解析逻辑和上下文感知的 JavaScript 分析能力,这远超出模式匹配范畴。值得注意的是,为 WAF 配备此类分析所需资源将导致性能灾难,因为 WAF 的设计初衷是在代理请求时尽可能减少开销。
Test
Payload - 1
q=';alert(1),'
Payload - 2
q=1'+1;let+asd=window&q=def='al'+'ert'+;asd[def](1&q=2);'
Payload - 3
q=1'+1;let+asd=window&q=def='al'+'ert'+;asd[def](1&q=2);'
Payload - 4
使用 HackerBots
来测试WAF,AI大模型 ( heuristic-based) 可以实现所有类型的WAF绕过
(在针对基于机器学习(open-appsec)的WAF时配合足够流量的alert载荷被WAF拦截,让Bots在一旁努力)
Bots自动化的找到了了独特的载荷test\\';alert(1);//
来越过了Azure WAF
以及其他载荷 q='+new Function('a'+'lert(1)')()+q'
Summary
我们手动研究中最惊人的发现是参数污染技术对传统 WAF 的有效性。随着绕过成功率从简单载荷Payload - 1
的 17.6%跃升至复杂参数污染载荷payload - 3
的70.6%,数据清晰地表明:依赖模式匹配的 WAF 难以防御那些利用 WAF 与 Web 应用间基础解析差异的攻击。
或许我们最令人失望的发现是:复杂的攻击技术竟能与极其简单的绕过手段共存。尽管我们开发了能击败大多数 WAF 的复杂参数污染攻击载荷,但 Hackbot 测试显示,即便是 Azure WAF 和 open-appsec 这类看似坚固的产品,也能被相对简单的载荷绕过。
[^1]:Microsoft's official documentation微软官方文档中记载了这一行为,明确指出"同一查询字符串参数的多个实例会被列为单个条目,每个值之间用逗号分隔"。
评论0次