友测过后对DOM XSS的思考

Posted 异空间安全

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了友测过后对DOM XSS的思考相关的知识,希望对你有一定的参考价值。

友测过后对DOM XSS的思考

引言:

事情起因:昨天晚上在写和Freebuf合作的课程大纲的时候,突然老哥找到我说他们管理的有个网站被人说存在DOM XSS,叫我检测一下,随后扔了一个网址。嗯,那这就是事情的起因了,那经过检测之后我感觉有必要写一篇对XSS思路的文章,然后就写了这篇文章。

0x00 DOM XSS

DOM-Based XSS是一种基于文档对象模型(Document Object Model,DOM)的Web前端漏洞,简单来说就是javascript代码缺陷造成的漏洞。与普通XSS不同的是,DOM XSS是在浏览器的解析中改变页面DOM树,且恶意代码并不在返回页面源码中回显。


0x01 确定漏洞点

DOM XSS跟JS扯上关系,那我们在挖洞的时候应该把重心放在JS上面,当然还需要有可控的参数。所以关注点归结就是两点:1.可控的参数。 2.javascript代码

javascript 常见漏洞点

11.页面重定向
22.取值写入页面或动态执行
33.使用存在缺陷的第三方库或通用组件

1.页面重定向

1.301,301重定向

2.伪协议跳转 :“javascript:”、“vbscript:”、“data:”、“tencent:”、“mobileqqapi:”等

3.Js函数跳转:location.href、location.replace()、location.assign()等

这里举个栗子:url判断不严,导致伪协议跳转,最终形成XSS漏洞。

http://www.XXX.com/index.html?url=javascript:alert(1)

 1<!DOCTYPE html>
2<html>
3    <head>
4        <meta charset="UTF-8">
5        <title></title>
6    </head>
7    <body>
8        <input type="button" value="跳转" onclick="check()" />
9        <script type="text/javascript">
10            function check() {
11                            // 返回URL的查询部分
12                      var search=location.search;  
13                        // 截取URL的查询部分 去掉?号
14                      search=search.substring(1,search.length);
15                      var url="";                    
16                      if(search.indexOf("url=")>-1){  
17                        // 判断是否存在“url=”字符串
18                        var pos=search.indexOf("url=")+4;
19                        // 如果存在往后截取
20                        url=search.substring(pos,search.length);
21                        // 进行跳转
22                        location.href = url;
23                      }  
24            }
25        </script>
26    </body>
27
28</html>
Snipaste_2018-05-31_18-03-50
友测过后对DOM XSS的思考
Snipaste_2018-05-31_18-04-06

2.取值写入页面或动态执行

接受用户输入的值动态获取在页面写入或者执行。想要在客户端实现接受参数并写入页面或动态执行,常见的函数有innerHTML、document.write、eval、document.writeln。那么除了输入到Js外还可以输出到一些可以存储输入值的标签或者变量中。例如:

 11) inputs
2
32) window.location(href、hash、search等)
4
53) window.name
6
74) document.referrer
8
95) document.cookie
10
116) localstorage
12
137) SessionStorage
14
15LocalStorage和SessionStorage是HTML5 提供了两种新的本地存储方案,统称WebStorage。
16
17sessionStorage 是针对session的数据存储,关闭窗口后删除。
18
19localStorage 是一个本地的没有时间限制的数据存储。

举个栗子:动态获取值,写入div中,利用动态插入XSS。

http://127.0.0.1:8020/UPload/javascript.html?url=%3Cimg%20src=x%20onerror=%22alert(1)%22/%3E

 1<!DOCTYPE html>
2<html>
3    <head>
4        <meta charset="UTF-8">
5        <title></title>
6    </head>
7    <body>
8        <input type="button" value="执行" onclick="check()"/>
9        <div id="test">
10        </div>
11        <script type="text/javascript">
12            function check() {
13                            // 返回URL的查询部分
14                      var search=location.search;  
15
16                        // 截取URL的查询部分 去掉?号
17                      search=search.substring(1,search.length);
18                      var url="";                    
19                      if(search.indexOf("url=")>-1){  
20                        // 判断是否存在“url=”字符串
21                        var pos=search.indexOf("url=")+4;
22                        // 如果存在往后截取
23                        url=search.substring(pos,search.length);
24                        url = decodeURI(url)
25                        document.getElementById("test").innerHTML = url;
26
27                      }  
28            }
29        </script>
30    </body>
31
32</html>
友测过后对DOM XSS的思考
Snipaste_2018-05-31_18-29-35
友测过后对DOM XSS的思考
Snipaste_2018-05-31_18-30-10

3.使用存在缺陷的第三方库或通用组件

常见缺陷:jQuery低版本(1.9.0以下)存在DOM XSS漏洞可导致用户身份被盗用 。

 1<html>
2<head>
3<script src="http://libs.baidu.com/jquery/1.8.3/jquery.min.js"></script>
4</head>

5<body>
6<script>
7var url = location.href;
8if (url.indexOf("#") > 0) {
9         var a = url.substring(url.indexOf("#")+1);
10         $("a[name='"+a+"']").show();
11}
12
</script>

13<a href="#" name="test">test</a>
14</
body>
15</html>
友测过后对DOM XSS的思考
Snipaste_2018-05-31_18-42-48

0x02 实战

说了那么多基础内容该是实战了,实战的目标就是我老哥给的那个网站,他这个网站的XSS本质上是取值写入页面然后我们出发事件而产生的一个DOM XSS漏洞。

1.定位可控参数

遍历网站目录,寻找关键字“?x=”。最后需要到?l=,我们假设其是可控的,然后我们继续下一步。

友测过后对DOM XSS的思考
Snipaste_2018-05-31_18-47-47

2.定位参数对应javascript处理函数

我们需要去寻找该变量对应的处理函数,只有准确找到其位置才能知道其参数是否可控,当然只有这里确定了才能进行下一步“构造XSS”。

因为它这里javasctipt代码不多,很快找到一个可疑变量lang,尝试随意插入内容,验证是否这个就是那个可控变量。

友测过后对DOM XSS的思考
Snipaste_2018-05-31_10-52-24
友测过后对DOM XSS的思考
Snipaste_2018-05-31_18-58-00

然后我们发现我们插入"<img>,其成功插入说明这个变量就是我们寻找的那个可控变量。

3.构造XSS

接下来我们闭合参数然后使用事件绑定来构造XSS。

友测过后对DOM XSS的思考
Snipaste_2018-05-31_19-45-29

鼠标点击一下输入框,成功弹出,好,任务完成

Snipaste_2018-05-31_11-16-15

0x03 总结

纵观本文需要DOM XSS的入口就在于可控参数和javascript漏洞点,也具体描述了一些常见的漏洞点和最后举了一个实战栗子,希望对大家有所帮助。


以上是关于友测过后对DOM XSS的思考的主要内容,如果未能解决你的问题,请参考以下文章

基于dom的xss漏洞原理

web安全XSS跨站&反射型&存储型&DOM型

DOM型XSS

如何为开发人员演示DOM型XSS漏洞利用过程

DOM XSS的三种常见案例介绍

XSS注入