为什么 Web 应用程序防火墙检测不到持久性 XSS?

信息安全 Web应用程序 xss 华夫
2021-09-04 13:08:13

这篇OWASP 文章提到“使用数据验证,只能检测和阻止反射型 XSS,不能检测持久型 XSS,如果在请求的参数中发送部分攻击,则基于 DOM 的 XSS 只能受到限制。” 为什么会这样?

我了解一旦恶意脚本存储在应用程序中,现在任何 GET/POST 请求都不会像恶意的,但脚本将在受害者端执行。然而,要执行持久性 XSS,攻击者必须向服务器发送一个看似恶意的请求,该请求应该被 WAF 感知,因此应该停止执行。

2个回答

如果您根据应用程序严格调整 WAF,以便它可以完全区分特定输入字段的有效输入和无效输入,那么您应该能够检测到通过使用输入字段来注入持久性 XSS 的尝试。

但是,通常 WAF 并没有那么紧密地适应特定的应用程序,在这种情况下只使用一些启发式方法来检测常见的攻击。除此之外,持久性 XSS 可以有不同的来源,甚至不需要通过使用输入字段甚至使用 Web 界面将其添加到应用程序中。例如,亚马逊 Kindle 商店中有一个存储型 XSS 漏洞,该漏洞是由图书描述元数据中的脚本引起的:Amazon.com Stored XSS via Book Metadata

我认为这一点并不理想,因为 WAF 确实可以捕获一些持续的 XSS 攻击。

但至少有两个问题:

  • 持久性 XSS 攻击不仅仅通过 Web 请求发生,还可能通过各种其他方式发生,例如电子邮件。该漏洞实际上仅在从数据存储(例如数据库)读取数据然后打印时才引入。如果您的 WAF 没有监听 db 和服务器之间的连接——据我所知,这并不常见——那么它就无法检测到这一点。
  • 缺少上下文。WAF 可能会查看传入的请求以及生成的输出。因此,它可以判断在什么上下文中回显了用户输入,以及这样做是否安全。对于持久性 XSS,缺少此上下文,因此不清楚 eg');alert('1是否是安全输入(或如何处理输入,以及是否通过编码使其安全)。