Keyi 的日常 


DOMXSS的一点研究


起源

近期一起与Camaro师傅做项目,发现他对domxss有很深入的研究(前端之父),顺便学习讨论了一下,写点博客记录一下心得。Dom可以简单理解为html的节点,当前端参数可控制、并且可影响节点时候,形成domxss。
通常来讲domxss是属于前端的漏洞,通过前端的javascript代码获取传入的变量,形成xss漏洞。特点:不会与后端服务器进行交互。DOM XSS有何不同?我们可以观察到:HTML页面是静态的,并且与其他类型的XSS攻击一样,页面源代码中没有嵌入任何恶意脚本。如果使用#字符,脚本代码将永远不会到达服务器。它被视为一个片段,浏览器不会转发它。因此,服务器端攻击检测工具将无法检测到此攻击。这里抛出一个疑问:如果一段domxss的payload可以保存在前端,并且储存到数据库中。比如在留言的地方插入domxss-payload,那么当我们点击这个留言的时候触发domxss,我们是否可以称它为存储型domxss呢?是不是颠覆了大家对xss的分类和认知了?--通常domxss被称为“javascript中输出数据到HTML页面”,domxss的分类在我眼里一直是一个谜。

挖掘

domxss漏洞审计三步骤:漏洞的挖掘方式一般是从输入源或者输出点进行审计。通常我们是打开控制台,在console中对可以的关键函数进行输出,查看参数值是否可被控制,打断点进行调试。

分析domxss的三大步骤:
输入源-编码-输出点
1.输入源(sources):
location.href
lcoation.hash
location.search

三个函数的作用域

-w773

2.编码:
js对文字进行编码涉及3个函数:escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decodeURIComponent

3.输出点(sinks):
eval()、setTimeout()、setInterval()、Function()、innerHTML、document.write()
.innerHTML、.outerHTML
.append 等


输入点:
document.location
document.URL
document.URLUnencoded
document.referrer
window.location(href hash)
所有的inputs
window.name
document.cookie
XMLhttpRequest
localstorage

输出点:
document.write()
document.writeln()
xxx.innerHTML=
xxx.outerHTML=
innerHTML.replace=
document.attachEvent()
window.attachEvent()
document.location.replace()
document.location.assign()
document.domain
someDOMElement.insertAdjacentHTML
someDOMElement.onevent

关键函数列表

栗子

将下述代码保存为domxss.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<html>
<body>
<a href="?name=1" />
name 的值
<script>

function GetRequest() {
var url = location.search; //获取url中"?"符后的字串
var theRequest = new Object();
if (url.indexOf("?") != -1) {
var str = url.substr(1);
strs = str.split("&");
for(var i = 0; i < strs.length; i ++) {
theRequest[strs[i].split("=")[0]]=decodeURI(strs[i].split("=")[1]);
}
}
return theRequest;
}

//调用
var Request = new Object();
Request = GetRequest();
var name;
name = Request['name'];
document.write(eval(name))
</script>
</body>
</html>

输入domxss.html?name=javascript:alert(1) 成功弹框
-w902

我们对关键代码进行分析:

var url = location.search
var name;
name = Request['name'];
document.write(eval(name))  

从浏览器获取name的值,然后重新赋值给新变量name,然后使用eval语句直接输出。eval函数可以直接执行javascript代码,所以我们输入name=javascript:alert(1)成功弹框。在上述代码中,输入源(sources)是location.search,输出点(sinks)是document.write。所以大家在做domxss漏洞挖掘的时候可以重点先关注“关键字”进行审计,如上述说的location.search等。
重点关键字表格如下:
-w1368
表格下载

获取节点的主要方法
-w631

关于漏洞修复可以看DOM-XSS漏洞挖掘这部分

最后大家可以关注一些浏览器特性,还有就是“通过web唤起APP的操作也是越来越多,跳转的协议也是多种多样,例如 webview:// , myappbridge:// 等等。 仅仅使用 http 和 https 来判断URL是否合法已经不适用了,于是由跳转所产生的DOM-XSS漏洞也逐渐增多”

参考

DOM-based XSS
DOM-XSS漏洞挖掘
DOM XSS从javascript中输出数据到HTML页面
DOM-xss列表






© - 无尾熊 - 2019 - 2021 - Powered by hexo