基于DOM的跨站点脚本(DOM XSS)是特定类型的 跨站脚本 脆弱性。它使用Document对象模型(DOM),这是以分层方式表示HTML对象的标准方法。与所有其他跨站点脚本(XSS)漏洞一样,这种类型的攻击也依赖于HTML页面上输入用户输入的不安全处理。当应用程序利用常见的JavaScript函数调用时,尤其常见,例如 document.baseURI 在没有消毒的情况下构建页面的一部分。

在以下文章中详细解释了这种攻击:  DOM XS. :基于DOM的跨站点脚本的解释。有关其他类型的XSS攻击的更多信息:反映XSS和存储的XS,请参阅以下文章: XSS类型:存储XSS,反射XS和基于DOM的XSS.

DOM XS. 的一个例子

我们的一个 vulnweb测试站点 具有基于DOM的XSS漏洞,可以使用以下有效载荷进行利用:

http://testhtml5.vulnweb.com/#/redir?url=javascript:alert(" DOM XS.  on: " + document.domain)

结果可以在以下图像中看到。这是一个具有简单警报的信息消息。注意如何存储有效载荷 GET 请求,使其适合社会工程攻击。

 DOM XS.

可以操作有效载荷以使用状态的提示来拆卸目标应用程序: 您的会话已过期。请插入密码以刷新您的会话。它是仅使用受害者的浏览器收获密码的简单而有效的方法。

 DOM XS.

这 #redir 路由由另一个文件执行, redir.html.。查看此文件的源代码,并注意以下JavaScript代码片段:

<script>
    var redirUrl = decodeURIComponent(window.location.hash.slice(window.location.hash.indexOf("?url=")+5));
    if (redirUrl) window.location = redirUrl;
</script>

基本上,漏洞利用使用 window.location.hash 源,在HTML元素宿中评估。有关源和汇款的信息,请阅读以下文章: 使用Acunetix查找基于DOM的XSS漏洞的源.

如何防止DOM XSS

您必须遵循以防止DOM XS的主要规则是:消毒所有不受信任的数据,即使它仅用于客户端脚本。如果您必须在页面上使用用户输入,请始终在文本上下文中使用它,从不作为HTML标记或任何其他潜在代码。

避免诸如 document.innerHTML 而是使用更安全的功能,例如, document.innerText and document.textContent。如果可以,完全避免使用用户输入,特别是如果它会影响DOM元素,如 document.url, 这 document.location, 或者 document.referrer.

此外,请记住,DOM XS和其他类型的XS不互斥。您的应用程序可以容易受到反射/存储的XSS和DOM XS的攻击。好消息是,如果在基础级别(例如,框架)正确处理用户输入,则应该能够减轻所有XSS漏洞。

如何检测DOM XSS

只能从服务器端(使用HTTP请求)来检测DOM XS几乎是不可能的。大多数DOM XSS有效载荷永远不会发送到服务器,因为它们是由符号的前置。这意味着,在服务器日志中没有任何数据都没有可用。这个事实使得维护Web应用程序安全性更加困难。

要检测到DOM XS的可能性,您必须使用像Acunetix这样的Web应用程序扫描仪模拟用户浏览器中的客户端的攻击。 Acunetix使用它的深度技术来尝试针对客户端代码和报告漏洞的DOM XS。

基于DOM的XSS作弊表

有关如何防止基于DOM的XSS攻击的更多详细信息,您可以阅读OWASP 基于DOM的XSS预防备忘带.

资源: //www.acunetix.com/blog/web-security-zone/