专家-DOM覆盖-覆盖attributes属性以绕过HTML过滤器
# 实验室:覆盖DOM属性以绕过HTML过滤器
# 题目
此是呀是呀使用了 HTMLJanitor 库,该库容易受到 DOM 覆盖的攻击。
若要解决实验室问题,请构造一个可以绕过过滤器的向量,然后通过 DOM 覆盖调用print()
函数。
你可能需要使用漏洞利用服务器,才能在受害者的浏览器中自动执行向量。
笔记
本实验的预期解决方案在 Firefox 中不起作用。我们建议你使用 Chrome 完成本实验。
- name: 实验室-专家
desc: 覆盖DOM属性以绕过HTML过滤器 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/dom-based/dom-clobbering/lab-dom-clobbering-attributes-to-bypass-html-filters
bgColor: '#001350'
textColor: '#d112fe'
1
2
3
4
5
6
2
3
4
5
6
# 实操
点击 “ACCESS THE LAB” 进入实验室。
一个博客站点。
和上一个实验室类似,加载了两个 js 文件。
- htmlJanitor 库,可用于过滤 XSS 载荷。但代码编写不太规范,存在历史漏洞(也就是 DOM clobbering)
- 另一个 js 文件和上一个实验室类似,是评论功能的主要代码
我们不需要分析另一个 js 文件,因为其并不是本次实验的目标,我们不需要覆盖其中的变量。
我们需要覆盖某个全局属性,从而 “欺骗” 过滤器。
先注入几个载荷。
查看......我载荷呢?整个标签都被删掉了,真好。
如果是form
标签构造的载荷呢?
<form id=x tabindex=1 onfocus=alert(1) autofocus>
1
这一次,没有删除整个标签,只是简单地去除了其中的危险属性。
哦?不删我标签?这不就有了吗。
在原有的form
载荷之后,添加一个input
标签,它的id
属性被设置为了attributes
,这将会 “欺骗” 过滤器。
<form id=x tabindex=1 onfocus=print() autofocus><input id=attributes>aaa
1
将载荷注入评论区。
然后,访问博客文章的一瞬间,执行了print()
函数。
查看标签情况,这一次,form
中的危险属性没有被删除。
为什么?
- 因为 htmlJanitor 在过滤危险属性的时候,会通过全局变量
attributes
一次性获取所有属性值; - 但是我们通过
input
标签的id=attributes
属性将这个全局变量覆盖掉了; - 最终 htmlJanitor 获取到的只是一个普普通通的
input
罢了。
将载荷注入评论区后,访问漏洞利用服务器,通过window.location
将用户重定向到指定的博客 URL:
<script>
window.location = '';
</script>
1
2
3
2
3
保存载荷。
以下动图演示了攻击效果:
将载荷发送给受害用户,实验完成。
编辑 (opens new window)