前不久,騰訊新推出的網(wǎng)絡(luò)空間“Q-ZONE”暴出了存在跨站漏洞,很難想象,一項新推出的業(yè)務(wù)居然如果脆弱,不由不讓人佩服騰訊的開發(fā)能力,下面便我們來了解一下“Q-ZONE”的這一跨站漏洞吧。
Q-Zone跨站漏洞的分析
1、Q-Zone對用戶輸入的過濾
進(jìn)入Q-Zone后,依次點(diǎn)擊“設(shè)置→空間設(shè)置→QQ空間名稱”,在這里將可以修改空間的顯示名稱。如果我們寫入一段可執(zhí)行的腳本代碼,只要過濾不嚴(yán)格的話,同樣會被保存在首頁中,通過調(diào)用執(zhí)行代碼,達(dá)到攻擊瀏覽者的目的。下面我們先測試一下這個輸入框中能否寫入跨站腳本:
在“輸入空間名稱”輸入框中輸入上面的代碼“ ”時,發(fā)現(xiàn)在輸入框中限制了輸入字符的長度,總共只能輸入24個字符。而且當(dāng)我們輸入許可長度的代碼,點(diǎn)擊提交后會彈出“請不要在輸入中包含"<>等字符”的對話框。看來Q-Zone對用戶的輸入進(jìn)行了過濾。
2、查看Q-Zone的輸入過濾方式
在Q-Zone頁面中點(diǎn)擊“查看→源文件”,在代碼段開始處,可以看見如下代碼段:
|
有一點(diǎn)點(diǎn)ASP編程基礎(chǔ)的用戶,相信都可以看懂這段代碼吧?在代碼中通過“StrLenOfAscii()”函數(shù),獲得了用戶輸入數(shù)據(jù)ASCⅡ碼的長度,除2后賦值給len變量。后面的代碼檢測len變量長度大于12的話,就提示輸入名稱太長。最重要的是前面的一句:“if (!checkFormValue(form1)) return false”,其中“checkFormValue()”函數(shù)很明顯可以推斷是用來檢測輸入數(shù)據(jù)中是否包含特殊字符的。當(dāng)檢測到數(shù)據(jù)中包含被過濾的字符時,就彈出了前面所說的對話框。
通過分析,我們可以肯定Q-Zone是在客戶端對用戶輸入數(shù)據(jù)進(jìn)行過濾的。
Q-Zone跨站漏洞的利用
即然Q-Zone是在客戶端對用戶輸入數(shù)據(jù)進(jìn)行過濾的,那么就給我們留下了可利用的機(jī)會。我們可以繞過客戶端的限制,直接修改輸入數(shù)據(jù)進(jìn)行提交。但是Q-Zone對用戶提交數(shù)據(jù)還進(jìn)行了另外一個限制,就是不允許外站提交,在這里我們保存的HTML文件也無法正常提交數(shù)據(jù)。因此,我們必須另外想一個辦法,修改提交數(shù)據(jù)。
1、截獲提交數(shù)據(jù)
我們先運(yùn)行一個叫作WSockExpert的軟件,運(yùn)行WSockExpert后點(diǎn)擊工具欄上的“打開”按鈕,顯示當(dāng)前的進(jìn)程列表。如果是用QQ的面板打開Q-Zone的,那么在進(jìn)程列表中選擇“QQ.exe→**的家”;如果是用IE打開Q-Zone的,可以在IE進(jìn)程中找到相應(yīng)的進(jìn)程,確定后點(diǎn)擊“Open”按鈕開始監(jiān)視與網(wǎng)站服務(wù)器交換的數(shù)據(jù)。
返回到Q-Zone網(wǎng)頁中,在“空間名稱”處輸入任意可提交的字符如“1234567890”,然后點(diǎn)擊“提交”,回到WSockExpert中,點(diǎn)中間列表框中的第3行“send”附近的數(shù)據(jù)欄,可以看到提交的數(shù)據(jù)內(nèi)容:
|
“Cookie”是Cookie內(nèi)容,包含了用戶驗(yàn)證的東西;而“spacename=1234567890”就是我們提交的空間名稱數(shù)據(jù)了;前面的“Content-Length: 20”是提交的這段數(shù)據(jù)的長度。在數(shù)據(jù)中,還可以看到“Referer: http://q-zone.qq.com/cgi-bin/user/cgi_show_spacename”,這是我們要提交的服務(wù)端網(wǎng)頁地址。
2、修改提交數(shù)據(jù)
將下面窗口中的提交數(shù)據(jù)內(nèi)容全部復(fù)制后,保存為一個1.TXT文件,將代碼中的“spacename=1234567890”
改為:“spacename= ”,“Content-Length: 20”改為“Content-Length: 40”
現(xiàn)在我們只要將這些數(shù)據(jù)提交到服務(wù)器上,就可以繞過客戶端對數(shù)據(jù)的過濾了,這就要用到另外一個叫作NC的工具了。
將上面保存的“1.txt”復(fù)制到與“nc.exe”同一個文件夾中,打開Windows系統(tǒng)中的命令提示符窗口,在命令行下進(jìn)入NC.exe所在的文件夾,輸入“nc -vv q-zone.qq.com 80<1.txt”,命令執(zhí)行后,就會向遠(yuǎn)程服務(wù)器提交我們修改過的數(shù)據(jù)了。
提示:我們可以將“Test”換成任意中文,但是需要先轉(zhuǎn)換為IE編碼,例如“測試”的IE編碼為“%B2%E2%CA%D4”,具體的轉(zhuǎn)換過程這里就不用多說了。
3、檢測代碼執(zhí)行結(jié)果
打開我們的Q-Zone,此時會自動彈出一個提示窗口。說明我們已經(jīng)在遠(yuǎn)程的網(wǎng)頁中成功的插入了“ ”這條代碼!同時在修改空間名稱的頁面中,可以看到已提交修改的原來被限制了的空間名稱。
跨站漏洞應(yīng)用實(shí)例——盜取用戶Cookie
上面進(jìn)行的僅僅是一個簡單的測試,如果攻擊者在Q-Zone中寫出危險的代碼,例如盜取瀏覽網(wǎng)頁者的Cookie內(nèi)容的代碼時,就很有可能獲得Cookie中的各種論壇或網(wǎng)站的帳號及密碼。下面簡單的說一說這種利用方式:
1、上傳Cookie收集網(wǎng)頁
申請一個網(wǎng)站空間,上傳一內(nèi)容如下的ASP文件——info.asp,這個網(wǎng)頁主要用來收集后面的Cookie內(nèi)容。
|
2、在Q-Zone中寫入盜Cookie代碼
運(yùn)行“Q-ZONE個人空間名稱跨站漏洞利用工具”,將下面的代碼提交插入到Q-Zone中:
|
當(dāng)其他QQ用戶瀏覽你的Q-Zone時,就會將在當(dāng)前網(wǎng)頁中新開一個窗口,連接到你指定的收集Cookie網(wǎng)頁,并將自己的COOKIE內(nèi)容發(fā)送到網(wǎng)站空間中的"cookies.txt"文件內(nèi),打開該文件后,就可以看到所有用戶的COOKIE信息,而這些COOKIE信息中很可能就包括著用戶的各個論壇和網(wǎng)站密碼帳號哦!
小知識:CSS跨站漏洞
跨站漏洞又叫CSS漏洞,這里的CSS可不是網(wǎng)站設(shè)計中的CSS(分層樣式表),而是指黑客入侵者通過某種方式,在遠(yuǎn)程的WEB頁面的HTML代碼中寫入特殊的字符串。當(dāng)其它上網(wǎng)者在瀏覽此頁面時,嵌入頁面中的這些字符就會被作為一段腳本代碼而執(zhí)行。
黑客向遠(yuǎn)程頁面中寫入代碼的方法很多,比如最常見的是在論壇中發(fā)帖時,在帖子中加入可執(zhí)行的代碼;或者在網(wǎng)站的用戶資料修改處,也可以通過更改簽名、聯(lián)系方式等,在用戶信息頁面中嵌入腳本代碼。無論采用何種方式寫入執(zhí)行代碼時,要求網(wǎng)頁程序沒有對用戶輸入的數(shù)據(jù)進(jìn)行嚴(yán)格的過濾,有的網(wǎng)頁程序限制了用戶寫入的字符類型,有危險的特殊代碼就無法寫入執(zhí)行。利用跨站漏洞,入侵者可以進(jìn)行非常多的攻擊,比如盜取別的人COOKIES中的帳號和密碼,或者偽造頁面信息、進(jìn)行拒絕服務(wù)等。可以說跨站漏洞是一個危害性非常大的漏洞。
用戶輸入過濾方式
網(wǎng)頁程序?qū)τ脩糨斎脒M(jìn)行過濾的方式一般有兩種:一種是在服務(wù)端進(jìn)行過濾,也就是說當(dāng)用戶將數(shù)據(jù)提交到網(wǎng)頁服務(wù)器后,在服務(wù)器端對用戶的輸入進(jìn)行檢測過濾是否符合要求;另外一種是在客戶端進(jìn)行過濾,也就是說當(dāng)用戶輸入數(shù)據(jù)后,在將數(shù)據(jù)提交發(fā)送到遠(yuǎn)程的網(wǎng)站服務(wù)器上時,首先在客戶端進(jìn)行數(shù)據(jù)過濾檢測,符合要求再發(fā)送。比如許多網(wǎng)頁程序?yàn)榱朔乐褂脩魳?gòu)造提交的數(shù)據(jù)進(jìn)行SQL攻擊,在遠(yuǎn)程服務(wù)器端進(jìn)行了數(shù)據(jù)過濾;同時在許多網(wǎng)站上我們也可以看到一些用戶注冊之類的表單,限制了用戶輸入數(shù)據(jù)的長度,這些大部份是在客戶端進(jìn)行限制的。
修改IE提交數(shù)據(jù)
一般說來,對用戶輸入端進(jìn)行的簡單限制,可以通過直接修改網(wǎng)頁源代碼繞過。例如上面提到的對用戶輸入長度的限制,如果我們將源代碼中的“maxlength="24"”改為“maxlength="1000"”,并將上面的檢測用戶輸入內(nèi)容的代碼段刪除掉后,保存成一個html文件后。再重新打開保存的HTML文件,就可以突破限制提交數(shù)據(jù)了。