基于DOM的漏洞-DOM破坏

admin 2022年11月9日11:40:45评论63 views字数 3122阅读10分24秒阅读模式

在本节中,将描述什么是DOM破坏,演示如何使用破坏技术来利用DOM漏洞,并提供可以减少暴露DOM破坏攻击的方法。



什么是DOM破坏?

DOM破坏是一种将HTML注入页面以操纵DOM并最终改变页面上JavaScript行为的技术。

DOM破坏在无法使用XSS的情况下特别有用,可以控制页面上的某些HTML,其中属性idnameHTML过滤器列入白名单。

最常见的DOM破坏形式使用锚元素覆盖全局变量,然后应用程序以不安全的方式使用该变量,例如生成动态脚本URL

术语“破坏”的意思是正在“破坏”对象的全局变量或属性,并用DOM节点或HTML集合覆盖它。

例如,可以使用DOM对象覆盖其他JavaScript对象并利用诸如提交之类的不安全名称来干扰表单的实际sbumit()函数。



如何利用DOM破坏漏洞?

JavaScript开发人员常用的模式是:

基于DOM的漏洞-DOM破坏


如果可以控制页面上的某些HTML,则可以使用DOM节点(例如锚点)破坏someObject引用,考虑以下代码:

基于DOM的漏洞-DOM破坏


要利用此易受攻击的代码,可以注入以下HTML以使用锚元素破坏someObject引用:

基于DOM的漏洞-DOM破坏


由于两个锚点使用相同的IDDOM将它们组合在一个DOM集合中,DOM破坏向量然后用这个DOM集合覆盖someObject引用,在最后一个锚元素上使用了name属性,以破坏someObject对象的url属性,该属性指向外部脚本。


场景试验-利用DOM破坏来启用XSS

https://portswigger.net/web-security/dom-based/dom-clobbering/lab-dom-xss-exploiting-dom-clobbering

场景说明:

这个试验场景包含一个DOM破坏漏洞,注释功能允许“安全”的HTML

试验目的:

要完成这个试验,需要构建一个破坏变脸并使用XSS调用alert()函数的HTML注入。

攻击过程:

访问某一篇博客文章,并创建包含以下锚点的评论

<a id=defaultAvatar><a id=defaultAvatar name=avatar href="cid:&quot;onerror=alert(1)//">

基于DOM的漏洞-DOM破坏


返回博客文章并创建包含任何随机文本的第二条评论,下次页面加载时,会调用alert(),即可完成试验

基于DOM的漏洞-DOM破坏



试验小结:

特定博客文章的页面会导入JavaScript文件loadCommentsWithDomPurify.js,其中会包含以下代码:

let defaultAvatar = window.defaultAvatar || {avatar: '/resources/images/avatarDefault.svg'}


defaultAvatar对象是使用这种包含逻辑OR运算符和全局变量的危险模式来实现的,这使得它容易受到DOM破坏。

可以使用锚标记破坏此对象,创建具有相同ID的两个锚点会导致它们被分组到一个DOM集合中。第二个锚点中的name属性包含"avatar",它将用href属性的内容破坏avatar属性。

这里要注意的是,这个站点使用DOMPurify过滤器试图减少基于DOM的漏洞。但是DOMPurify允许使用cid:协议,它不会对双引号进行URL编码。这意味着可以注入将在运行时解码的编码双引号。结果,上述注入将导致在下次加载页面时为defaultAvatar变量分配破坏的属性

{avatar: ‘cid:"onerror=alert(1)//’}

当发布第二个帖子时,浏览器会使用新近破坏的全局变量,该变量会在onerror事件处理程序中走私Payload并触发alert()



另一种常见的技术是使用表单元素以及诸如输入到破坏DOM属性的元素。

例如,破坏attributes属性使我们能够绕过在其逻辑中使用它的客户端过滤器,尽管过滤器将枚举attributes属性,但它实际上不会删除任何属性,因为该属性已被DOM节点破坏。因此,将能够注入通常会被过滤掉的恶意属性。

例如,考虑下面的注入:

基于DOM的漏洞-DOM破坏


在这种情况下,客户端过滤器将遍历DOM并遇到列入白名单的表单元素。通常,过滤器会遍历表单元素的attributes属性并删除任何列入黑名单的属性。但是,由于attributes属性已被input元素破坏,过滤器将循环通过input元素。由于输入元素的长度未定义,因此不满足过滤器的for循环条件(例如i<element.attributes.length),过滤器只是移动到了下一个元素。这会导致过滤器完全忽略onclick事件,从而允许在浏览器中调用alert()函数。


场景试验-破坏DOM属性以绕过HTML过滤器:

https://portswigger.net/web-security/dom-based/dom-clobbering/lab-dom-clobbering-attributes-to-bypass-html-filters

场景说明:

这个试验场景使用HTMLJanitor库,该库容易受到DOM破坏。

试验目的:

要完成这个试验,需要构建一个绕过过滤器的向量并使用DOM破坏来注入一个调用print()函数的向量,需要使用漏洞利用服务器,以使向量在受害者的浏览器中自动执行。

攻击过程:

访问其中一篇博客文章并创建包含以下HTML的评论

<form id=x tabindex=0 onfocus=print()><input id=attributes>

基于DOM的漏洞-DOM破坏


打开"exploit server",将下面语句添加到body中,注意替换下试验URL和博客id

<iframe src=https://your-lab-id.web-security-academy.net/post?postId=3 onload="setTimeout(()=>this.src=this.src+'#x',500)">

基于DOM的漏洞-DOM破坏


保存后发送给受害者即可完成试验。


试验小结:

这个库使用attributes属性来购率HTML属性,但是仍然可以破坏attributes属性本身,导致长度未定义。

这允许将任何属性注入到表单元素中,在这种情况下,使用onfocus属性来走私print()函数。

iframe加载时,经过500毫秒的延迟后,它会将#x片段添加到页面URL的末尾。延迟是必要的,以确保在执行JavaScript之前加载包含注入的注释。这会导致浏览器关注ID"x"的元素,也就是我们在评论中创建的表单,onfocus事件处理程序然后会调用print()函数。



如何防止DOM破坏?

用最简单的术语来说,可以通过实施检查以确保对象或函数符合预期,从而防止DOM破坏攻击。

例如,可以检查DOM节点的attributes属性是否实际上是NameNodeMap的一个实例,这可以确保该属性时一个属性,而不是一个破坏的HTML元素。

还应该避免编写与逻辑OR运算符||一起引用全局变量的代码,因为这可能导致DOM破坏漏洞。

总而言之:

●检查对象和函数是否合法,如果要过滤DOM,确保检查对象或函数不是DOM节点。

●避免糟糕的代码模式,应避免将全局变量与逻辑OR运算符结合使用。

●使用经过充分测试的库,例如DOMPurify,它可以解决DOM破坏漏洞。



基于DOM的漏洞-DOM破坏


服务器端请求伪造(SSRF)-概念梳理

文件上传漏洞-概念梳理

访问控制和权限提升漏洞-概念梳理

信息泄露漏洞-概念梳理

业务逻辑漏洞-概念梳理

命令注入攻击(上)
目录遍历攻击(上)

身份验证漏洞-概念梳理

SQL注入攻击-检索隐藏的数据
HTTP Host头漏洞攻击-概念梳理


原文始发于微信公众号(H君网安白话):基于DOM的漏洞-DOM破坏

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年11月9日11:40:45
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   基于DOM的漏洞-DOM破坏https://cn-sec.com/archives/1397142.html

发表评论

匿名网友 填写信息