談跨站腳本攻擊之綜合篇
發(fā)布時(shí)間:2008-06-30 閱讀數(shù): 次 來(lái)源:網(wǎng)樂(lè)原科技
近日,由于發(fā)現(xiàn)一些站點(diǎn)仍然存在UBB的跨站腳本攻擊的漏洞.跨站腳本攻擊雖然很少會(huì)對(duì)服務(wù)器造成一些什么比較大的影響,但對(duì)于一個(gè)站點(diǎn)來(lái)說(shuō),存在這種漏洞實(shí)在是太不值得!小則,彈點(diǎn)什么東東出來(lái);中則改改主頁(yè);重則竊取用戶的COOKIES資料,更甚者將會(huì)G掉瀏覽者的硬盤.一個(gè)站點(diǎn)被變成一個(gè)惡意網(wǎng)站,還有誰(shuí)敢來(lái)?如果再加上該站的站長(zhǎng)比較"盲"一些,豈不亂套了?
小小的一段代碼就真的能使一個(gè)站點(diǎn)成這樣?好叫我們來(lái)具體的看看所謂的跨站腳本攻擊到底會(huì)成為什么樣的攻擊模式.進(jìn)入一個(gè)含UBB功能的站點(diǎn),比如留言板,論壇,或是含提交程序的站點(diǎn).首先,講一下最簡(jiǎn)單的腳本攻擊:<td ></td >等HTML字符的過(guò)濾問(wèn)題.
登陸過(guò)一個(gè)CGI制作站點(diǎn).以原來(lái)ASP的眼光看CGI的站點(diǎn),感覺CGI對(duì)腳本的過(guò)濾應(yīng)該很好.于是做了最初的測(cè)試.在用戶一欄中填寫<td >,提交用戶注冊(cè)后發(fā)現(xiàn)并沒(méi)提出非法字符的提示.注冊(cè)完成后,點(diǎn)擊資料也發(fā)現(xiàn)頁(yè)面變形了.如在其他幾個(gè)如國(guó)家,性別里填寫也會(huì)出現(xiàn)同樣的問(wèn)題,那頁(yè)面就沒(méi)法看了.于是換了一個(gè)站點(diǎn),再次提交<td >出現(xiàn)了非法字符提示,看來(lái)站點(diǎn)是已經(jīng)過(guò)濾的<>等HTML的腳本字符,那好,我們改用ASCII 碼替換<> 如& #60; & #62;代替提交后再來(lái)看,又出現(xiàn)了上面頁(yè)面變形的情況,看來(lái)非法過(guò)濾機(jī)制還不是很完善. 更有甚者,我竟發(fā)現(xiàn)一個(gè)站點(diǎn)內(nèi)的姓名欄填寫時(shí)沒(méi)有字?jǐn)?shù)大小設(shè)置,沒(méi)有過(guò)濾任何非法字符,如果我提交個(gè)什么惡意代碼那還不成全了我?
簡(jiǎn)單的腳本攻擊如<td >等HTML格式的代碼一定要過(guò)濾好,上面的一些站點(diǎn)還沒(méi)牽扯到UBB就出問(wèn)題了.那我們下面就開始重點(diǎn)講一下UBB過(guò)濾漏洞的問(wèn)題.UBB是論壇中用來(lái)替換HTML編輯的一種格式符號(hào),如[b ][/b ]可以替換成HTML中的< b></ b>..然而就是這一個(gè)替換問(wèn)題,就成了跨站腳本攻擊的最佳積聚地.測(cè)試了一個(gè)ASP留言版以及一個(gè)整站的程序代碼:
初級(jí)問(wèn)題: [url ]的過(guò)濾,在提交該代碼時(shí)可以構(gòu)建一個(gè)onmouseover函數(shù)的惡意代碼,既然onmouseover可以生效,那還有什么辦不到的?一些原碼程序在變換[url ][/url ]時(shí),只是將[url ]s2[/ url]中的s2直接提交到< a href="s2" target=_blank>S2</a >中.看到如此轉(zhuǎn)換我們可以使用相應(yīng)的ASCII 碼中的& #34;來(lái)代替",我們多提交一個(gè)"然后在構(gòu)建onmouseover函數(shù)進(jìn)行操作,后果?你應(yīng)該知道!:P
[img ]的過(guò)濾,這真的算是個(gè)老大難的問(wèn)題.很早以前就是[img]的腳本攻擊流行一時(shí)啊.這次測(cè)試中,很多站點(diǎn)還是仍然存在這個(gè)漏洞.有點(diǎn)程序根本沒(méi)有進(jìn)行過(guò)濾.尤其是一些免費(fèi)留言板的提供站點(diǎn)很多都存在這樣的問(wèn)題.下面我們主要將一下[IMG ]標(biāo)簽的問(wèn)題:
很簡(jiǎn)單的[img ]javascript:alert();[/ img]提交后轉(zhuǎn)換成的代碼為< img src="javascript:alert();">,好,到這里我們就可以看到j(luò)avascript:alert();被< img src="">標(biāo)簽激活了.表現(xiàn)就是彈出對(duì)話框.上面寫著你在()中要提交的東西.如documents.cookie 呵呵..大多數(shù)人都應(yīng)該知道這東西是做什么.更有甚者,使用document.write();函數(shù),可以寫網(wǎng)頁(yè).寫什么?當(dāng)然是惡意代碼,如[ img]javascript:document.write();[ /img].()中間加你要加的,寫你要寫的,想多危險(xiǎn)就多危險(xiǎn).
高級(jí)問(wèn)題: 由于[img ]的初級(jí)問(wèn)題騷擾很多站點(diǎn)就對(duì)一個(gè)敏感的字符開始過(guò)濾.如ja連接,do連接,wr連接,提交后自動(dòng)分為j a,d o,w r.或是對(duì)字符進(jìn)行過(guò)濾java,document,等等.而這些只能難倒一小部分人.我們?nèi)匀豢梢岳肁SCII碼來(lái)代替.可能有人會(huì)對(duì)代替后的代碼仍然不能正常顯示而困惑.好,我們下面以一個(gè)完整的例子介紹:
某站點(diǎn)UBB過(guò)濾代碼段如下:
<%
Function code_ssstrers)
dim strer:strer=strers
if strer="" or isnull(strer) then code_ss"":exit function
strer=replace(strer,"<","<")
strer=replace(strer,">",">")
strer=replace(strer," "," ") '空格
strer=replace(strer,CHR(9)," ") 'table
strer=replace(strer,"'","'") '單引號(hào)
strer=replace(strer,"""",""") '雙引號(hào)
dim re,re_v
re_v="[^\(\)\;\';""\[]*"
're_v=".[^\[]*"
Set re=new RegExp
re.IgnoreCase =True
re.Global=True
re.Pattern="(javascript:)"
strer=re.Replace(strer,"javascript:")
re.Pattern="(javascript)"
strer=re.Replace(strer,"javascript")
re.Pattern="(jscript:)"
strer=re.Replace(strer,"jscript :")
re.Pattern="(js:)"
strer=re.Replace(strer,"js:")
re.Pattern="(value)"
strer=re.Replace(strer,"value")
re.Pattern="(about:)"
strer=re.Replace(strer,"about:")
re.Pattern="(file:)"
strer=re.Replace(strer,"file&:")
re.Pattern="(document.)"
strer=re.Replace(strer,"document :")
re.Pattern="(vbscript:)"
strer=re.Replace(strer,"vbscript :")
re.Pattern="(vbs:)"
strer=re.Replace(strer,"vbs :")
re.Pattern="(on(mouse|exit|error|click|key))"
strer=re.Replace(strer,"on$2")
能看懂ASP的朋友,就可以看出,以上代碼段對(duì)javascript,jscript:,js:,about;value,document.,onmouse以及onexit等語(yǔ)句進(jìn)行了過(guò)濾和替換.并對(duì)一些特殊字符進(jìn)行了替換.如".",";""(",")" [替換代碼為""中間的"..仔細(xì)觀察代碼后我們會(huì)發(fā)現(xiàn)其過(guò)濾機(jī)制并非想想象的那樣完美.提交:[ mg]& #176& #93& #118& #97& #115& #79rip& #106& #57documen& #115& #76write& #30& #29哈哈又被黑了& #29& #61& #29[/ mg] 類似代碼就可以實(shí)現(xiàn)更高級(jí)的腳本攻擊.注:由于很多站點(diǎn)仍存在此問(wèn)題,所以將代碼修改過(guò),無(wú)攻擊性了.
打開你的FT2000,使用文本編輯,你可以找到任何特殊字符所屬的ASCII碼.如:分號(hào);可以代替為&# 59,句點(diǎn).可以代替為&# 46,以這樣的形式我們?cè)俅翁峤淮a.果然,上面整個(gè)的過(guò)濾機(jī)制幾乎完全失效了.根本沒(méi)起到什么防御作用.
看了以上的攻擊方法,是不是覺得很郁悶?如果才能避免上面的問(wèn)題發(fā)生?
1.如果你的站點(diǎn)程序含論壇,留言板,以及其他程序中含提交數(shù)據(jù)格式的,沒(méi)有很好過(guò)濾機(jī)制,請(qǐng)馬上下載升級(jí)程序或是停止使用.避免造成更多的問(wèn)題.
2.各提供免費(fèi)論壇,免費(fèi)申請(qǐng)留言板的站,請(qǐng)將UBB格式關(guān)閉.或找到更好的解析UBB.ASP程序頁(yè).
3.對(duì)一些會(huì)編寫ASP的朋友,我建議大家過(guò)濾一下字符:(全部字符將寫在[]中)如:
["|.|;|:|\|/|&|$|#|`|)|,|'|"|-|~|[|(||] 注:其中|為分割符
4.對(duì)于某些站點(diǎn)建議去掉問(wèn)題比較多的留言板,或是其他含提交的程序.如:原www.sangel.net使用的guestbook,一些不知名的程序體問(wèn)題更是多多.建議換掉它.
5.我本人也修改了一個(gè)國(guó)外的留言板,前臺(tái)基本已經(jīng)修改完畢.后臺(tái)這幾天正在趕.修改后感覺在文本提交和輸入以及留言時(shí)都有了很好的過(guò)濾.本來(lái)打算全采用英文界面,但考慮到N多chinese 對(duì)英語(yǔ)不過(guò)關(guān),我還是將部分程序漢化了.有興趣的朋友可以http://www.e3i5.com/guestbook/ 測(cè)試.我們歡迎善意的測(cè)試.
以下是國(guó)內(nèi)一些經(jīng)過(guò)本人測(cè)試的站點(diǎn)的留言板有問(wèn)題的地址,(請(qǐng)各位站長(zhǎng)注意啦,及時(shí)修補(bǔ)程序免得造成不必要的麻煩),測(cè)試的時(shí)間比較短一些,可能有一些站點(diǎn)沒(méi)有找到.可能存在著更嚴(yán)重的問(wèn)題.:(
以上就是這次腳本攻擊測(cè)試的全部?jī)?nèi)容。綜觀全部站點(diǎn),看上去安全性真是的不敢再想.問(wèn)題多多.
雖然只是舉手之勞就可以解決的問(wèn)題,但稍不小心就會(huì)造成大問(wèn)題。別小看跨站腳本攻擊的威力,如果真的灌注的惡意代碼,那可就...Yy~汗
發(fā)表此文只是對(duì)國(guó)內(nèi)各類站點(diǎn)給個(gè)提醒,一個(gè)安全的站點(diǎn)大家用著放心,使著也舒心.再此也對(duì)在這個(gè)測(cè)試過(guò)程中小有得罪的朋友表示歉意.有關(guān)該內(nèi)容更多的請(qǐng)到http://www.e3i5.com 查找.歡迎大家的光臨和指導(dǎo).此文有什么不對(duì)的地方,請(qǐng)各位大蝦指點(diǎn).謝謝.