【IT168 專(zhuān)稿】今天,電子郵箱(E-mail)無(wú)疑已經(jīng)成為大眾通訊的工具;由于垃圾郵件泛濫,E-mail也成為信息安全的重大隱患之一。搜索到有效郵件地址成為垃圾郵件發(fā)送成功與否的決定要素。隨著Ajax新興技術(shù)在大型網(wǎng)站,如SOHU等得到應(yīng)用,使得垃圾郵件制造者有機(jī)可乘。
現(xiàn)在瀏覽器端以 JavaScript 為核心,基于各種 Web 標(biāo)準(zhǔn)(即:早已完成標(biāo)準(zhǔn)化的XHTML/CSS/DOM/XML/XSLT 和正在進(jìn)行標(biāo)準(zhǔn)化的XMLHTTP)的技術(shù)正在加速整合,Ajax 就是這一系列技術(shù)的一個(gè)統(tǒng)稱(chēng)。其關(guān)鍵在于對(duì)瀏覽器端的JavaScript、DHTML和與服務(wù)器異步通信的組合。使用Ajax,可以使B/S(瀏覽器/服務(wù)器)模式的程序出現(xiàn)類(lèi)似于C/S(客戶機(jī)和服務(wù)器結(jié)構(gòu))的即時(shí)動(dòng)態(tài)cool效果,實(shí)現(xiàn)不刷新頁(yè)面,動(dòng)態(tài)改變頁(yè)面數(shù)據(jù)。
目前很多大型的網(wǎng)站已經(jīng)大范圍使用了Ajax技術(shù),比如我們經(jīng)??吹降模篻oogle搜索時(shí)出來(lái)的搜索次數(shù)以及可能搜索到的下拉列表、在注冊(cè)用戶時(shí)輸入用戶名后,自動(dòng)顯示該用戶是否可以被注冊(cè)等等。然而這項(xiàng)技術(shù)在給用戶帶來(lái)便利的同時(shí),若是考慮不周也會(huì)給帶來(lái)一定的安全隱患。
我們知道在開(kāi)發(fā)程序用戶登陸模塊,處理用戶登錄失敗時(shí),出于安全方面考慮,不能返回給用戶具體的“密碼錯(cuò)誤”或“用戶名錯(cuò)誤”,而要說(shuō):“用戶名或密碼錯(cuò)誤”。(如圖1)
(圖1)
既然這樣,當(dāng)然就不能在其他地方給用戶返回,具體是用戶名錯(cuò)誤還是密碼錯(cuò)誤。但是有些網(wǎng)站采用Ajax技術(shù)之后,雖是給用戶帶來(lái)便捷為目的,卻犯了這樣的錯(cuò)誤。據(jù)筆者經(jīng)過(guò)一系列的測(cè)試發(fā)現(xiàn),國(guó)內(nèi)很多門(mén)型網(wǎng)站的郵件系統(tǒng)都存在這樣的漏洞, SOHU、網(wǎng)易、21CN等都犯了上述錯(cuò)誤。我們就以Sohu為例,看看垃圾郵件制作者是如何利用其email帳戶暴露漏洞,得到有效郵件地址列表的。
說(shuō)到如何暴出郵件系統(tǒng)的email帳戶,有些讀者已經(jīng)想到本文開(kāi)頭的例子“在注冊(cè)用戶時(shí)輸入用戶名后,自動(dòng)顯示該用戶是否可以被注冊(cè)”,說(shuō)的就是這個(gè)例子。大家可以去sohu注冊(cè)一個(gè)帳戶:http://passport.sohu.com/web/signup.jsp,輸入用戶名,光標(biāo)移到“請(qǐng)輸入密碼”的輸入框,如果這個(gè)用戶存在,馬上后面會(huì)提示:(圖2)
![]() |
(圖2)
如果不存在,則提示:
![]() |
(圖3)
那么這兩個(gè)信息是怎么來(lái)的呢?這里的Ajax處理流程是,JavaScript調(diào)用了相應(yīng)的XMLHttpReques對(duì)象去訪問(wèn)一個(gè)web應(yīng)用程序,然后獲取返回結(jié)果后,直接把返回的結(jié)果輸出到頁(yè)面。
![]() |
部分源代碼:
![]() (圖6) |
在必要的參數(shù)中,operator是用來(lái)判斷調(diào)用不同驗(yàn)證方法的(該check頁(yè)面提供了幾種不同的驗(yàn)證,還有兩次密碼是否一致等等),userdomain是域名,sohu有幾個(gè)不同域名的郵箱,username就是用戶名了,而代碼中的time應(yīng)該是為了保證每次get提交的時(shí)候讓瀏覽器不緩存而設(shè)的(沒(méi)有細(xì)看,不重要)。所以,三個(gè)參數(shù)中主要是username發(fā)生變化,而服務(wù)器僅僅返回兩種不同的結(jié)果。
這樣就很利于我們爆破用戶名了,還記得我們?cè)趺幢┝ζ平忄]箱密碼么?掛字典,然后不斷提交,判斷服務(wù)器返回字符中有沒(méi)有特定的字符,破解的速度取決于網(wǎng)速和返回字符的多少。正常的訪問(wèn)是返回一個(gè)頁(yè)面,這樣就有一堆垃圾數(shù)據(jù)。然而Ajax告訴我們,只要從服務(wù)器返回“0”和“1”就可以作出判斷,所以這里返回的更少了,僅僅是:
![]() |
(圖7)
為此,我們完全可以可以嘗試使用其他更方便的語(yǔ)言寫(xiě)出工具,用于搜集有效郵件地址,速度一定很快。很多大網(wǎng)站都使用了這樣的驗(yàn)證方法,就不一一例舉了。我已經(jīng)仿照Ajax使用JAVASCRIPT寫(xiě)個(gè)爆sohu用戶名測(cè)試程序,相關(guān)代碼在這里不在本文列出來(lái)了。有興趣的朋友可以去論壇(http://www.ixpub.net/thread-654600-1-1.html)查看。
我列舉了大家可能經(jīng)常想到的一些解決方案:
1、判斷request的來(lái)源地址。這樣的方式不推薦,因?yàn)楹诳涂梢愿膆ttp包頭,從而繞過(guò)檢測(cè)。
2、采用驗(yàn)證碼。也不推薦,請(qǐng)各位大大想一下用戶的感受,剛輸入用戶名就讓我輸入注冊(cè)碼?這樣Ajax意義何在?
3、給一個(gè)IP在一個(gè)小時(shí)內(nèi),分配一些份額,比如500個(gè)(考慮到網(wǎng)吧等等多臺(tái)機(jī)器一個(gè)IP,使用NAT的地方)。
4、返回隨機(jī)圖片。這是我自己設(shè)想了一種解決方案,沒(méi)有經(jīng)過(guò)測(cè)試,下面詳細(xì)說(shuō)明。
從給出的前三個(gè)方案看,都存在一個(gè)誤區(qū),認(rèn)為Ajax應(yīng)該獲得服務(wù)器返回的兩個(gè)有特殊意義的值(用戶名可用或不可用),然后再判斷,分兩種情況在頁(yè)面顯示出來(lái)不同的信息,或者把兩個(gè)不同的返回結(jié)果直接給用戶,這樣兩種經(jīng)典的處理模式,問(wèn)題就集中在“兩個(gè)不同結(jié)果的值”這里?,F(xiàn)在我們從需求出發(fā),分析用戶希望看到的結(jié)果,無(wú)非就是想知道用戶名是否可用,也就是說(shuō)最終的結(jié)果顯示在用戶容易看到的地方,而且用戶可以“看懂”信息,并可以加以區(qū)別(知道能不能使用這個(gè)用戶名注冊(cè))。而黑客(或垃圾郵件搜集者)認(rèn)為,只要用戶能看懂,程序也應(yīng)該可以看懂并預(yù)測(cè)出兩種結(jié)果,所以就有了這種暴力獲取郵箱名稱(chēng)的攻擊。如果“人”能看懂而程序不能看懂呢?舉個(gè)典型的例子,大家還記得QQ網(wǎng)站的那個(gè)令人討厭的中文驗(yàn)證碼吧?那個(gè)東西就是隨機(jī)的,程序不能預(yù)測(cè)并且用戶可以看懂。在這里也可以使用這項(xiàng)技術(shù)。直接在服務(wù)器隨機(jī)把“可以注冊(cè)”和“不能注冊(cè)”四個(gè)字,做成隨機(jī)圖片,文字以隨機(jī)的字體和隨機(jī)的顏色出現(xiàn)在圖片中隨機(jī)的位置,然后返回給javascript,再由javascript把圖片放到網(wǎng)頁(yè)中,用戶看到的是返回的是隨機(jī)大小的圖片,暴力獲取郵箱名的攻擊就立刻失去了效果。
![]() |
(圖8)
是否該在這里也使用Ajax技術(shù),無(wú)所謂對(duì)錯(cuò),只要大網(wǎng)站一帶頭,這樣做的就會(huì)大有人在,只是我們?cè)谀7碌臅r(shí)候也要仔細(xì)考慮。畢竟Ajax的實(shí)質(zhì)其實(shí)是在用戶“感覺(jué)不出來(lái)”的情況下訪問(wèn)了web應(yīng)用程序,再把返回的結(jié)果交給用戶,同時(shí)用戶可以去做其他的事情,不用等待結(jié)果。既然Ajax可以訪問(wèn),惡意用戶當(dāng)然也可以自己去訪問(wèn),所以我們應(yīng)該把處理Ajax請(qǐng)求的web應(yīng)用程序像其他頁(yè)面一樣做好相應(yīng)的防范措施,就可以有效的避免安全問(wèn)題。
聯(lián)系客服