來自:碼農翻身(微訊號:coderising)
建立Beauty.com的駭客三兄弟最近可謂是春風得意,他們的這個網站精準地利用了人類的本性,竊取了不少登入使用者的cookie。
(註:參見前文《瀏覽器的安全反擊戰》)
利用別人的cookie,他們可以冒充真實的使用者,在頒發cookie的那個網站中為所欲為,個人隱私在他們面前根本不存在。
運氣好的話連別人的使用者名稱和密碼都能得到,那就一通百通,因為大家都嫌麻煩,總是使用同一套使用者名稱和密碼來登入各種不同系統。
可是好景不長,這一天駭客老三慌慌張張地找到了老大:“大哥,大事不好! ”
“老三,你這慌慌張張的毛病什麼時候能改改? 這點兒你可得學學你二哥。” 老大訓斥道。
“不是,大哥,這次真是大事不妙,瀏覽器家族最近頒佈了一個什麼同源策略,我們原來偷Cookie的招數都不管用了! 今天我連一個Cookie,使用者名稱密碼都沒有偷到。”
“什麼叫偷,說了多少次了,那就借,知道不?!”
(註:同源策略參見前文《瀏覽器的安全反擊戰》)
“我早就料到了,這麼重大的安全漏洞肯定肯定會補上的,他們不會這麼輕易地讓我們來跨域來訪問別人的Cookie,修改別人的DOM,呼叫別人的服務的。” 老成持重的駭客老二說道。
“那怎麼辦? 沒有Cookie,難道我們三兄弟以後就餓肚子了嗎?” 老三很緊張。
“別擔心,我們哥仨勾兌勾兌,他們肯定有漏洞的,” 老大安慰到,“老二,你先說說你的看法。”
“其實吧,我們想去借一個Cookie來用,關鍵是要讓我們Beauty.com的JavaScript在標的瀏覽器上執行,然後訪問愛存不存銀行(icbc.com.cn)的cookie,可是現在他們用了同源策略,我們網站的JavaScript不允許訪問別人網站的東西,那這條路就行不通了。”
“我想到一個招數,” 老三興奮地說,“我們可以想辦法修改下icbc.com.cn伺服器端的JavaScript, 把偷Cookie的程式碼加上去!”
“你想得美,那豈不得到icbc.com.cn的伺服器去修改了!還得黑掉別人的伺服器,這就難了,即使你修改了,人家程式員再次釋出新版本,那不就把我們的修改給改寫掉了?” 老大再次訓斥。
“那我們就想辦法去黑掉程式員的SVN,Github,直接把上面的程式碼給改了…..” 老三的聲音越來越小。
“唉,算了吧,我們盜亦有道,只做Web端駭客。” 老大重申三人組織的性質。
這時候老二想了一個辦法:“其實老三說的也有道理,我們只要想辦法把JavaScript程式碼註入到標的頁面中,就能繞過同源策略了,這讓我想到了HTML中的,這個標簽會在瀏覽器中產生一個輸入框,讓使用者輸入資料,我們可以把JavaScript程式碼當做資料輸入進去, 等到資料提交到伺服器端,會儲存下來,下次展示頁面的時候不就可以執行了嗎?!”
老三說:“二哥我聽不太明白,你能不能舉個例子?”
老二說道:“好吧,有這麼一個網站,可以讓你對某個文章輸入評論:”
“然後,你在評論區輸入了這樣的程式碼,註意,我們註入了一段’JavaScript’”
“等到再次有人訪問這個頁面的時候,會發生什麼呢?” 老二啟發老三。
“奧,我明白了,那就可以把那個人的cookie顯示出來了!”老三一點都不笨。
興奮之餘,老三撓撓頭:“ 但是這隻是在人家的瀏覽器中顯示,怎麼才能發到我們的伺服器呢? 用JavaScript來發? 那也不行, 因為同源策略嚴格限制JavaScript的跨域訪問吶!”
老大也說:“是啊,這個人看到自己的cookie被alert出來,估計會嚇一跳吧。”
老二說:“嗯,確實不能這麼辦,讓我想想。”
一炷香時間過去,老二說:“有了! 那個同源策略並不限制這樣的標簽從別的網站(跨域)去下載圖片,我們在註入JavaScript程式碼的時候,同時建立一個使用者不可見的,透過這個發cookie發給我們。”
老三還是不明白, 要求再詳細解釋一下,老二就上了程式碼:
老二說:“看到了吧,只要這段程式碼被執行,使用者的cookie就會發到我們伺服器上(http://beauty.com/log),我們就等著收取cookie吧!”
老三感慨道:“二哥你真厲害,天馬行空,竟然想到了使用的src屬性來傳送資料!”
老大說:“我們乾脆把這段程式碼封裝成一個js檔案,嗯,就叫做beauty.js吧, 這樣以後我們用起來會很方便!”
老三看到又可以‘借到’cookie了,興奮得直搓手: “大哥二哥,我這就去把JS寫出來,找個網站試一試。”
老大說道:“我們把這種方法叫做Cross Site Scripting ,簡稱CSS,二弟意下如何?”
老二說:“大哥, CSS已經名花有主了,意思是層疊樣式表,我們還是叫做XSS吧!”
(註:按照XSS的分類方法, 上面介紹的叫做儲存性XSS, 危害最大。 還有反射型XSS,基於DOM的XSS,本文不再展開。)
大家都表示同意。
老三很快寫出了beauty.js, 也折騰出了http://beauty.com/log 專門用於記錄‘借’來的cookie。
他找了一家網站做實驗,註入了beauty.js, 沒過多久,cookie就源源不斷地發過來了。大家都非常高興,馬上擴大範圍,在多個知名網站上都做了手腳。
一週以後,負責監控的老三發現,cookie越來越少,老三趕緊調查,發現很多網站的Cookie都加上了HttpOnly這樣的屬性:
Set-Cookie:JSESSIONID=xxxxxx;Path=/;Domain=book.com;HttpOnly
這個cookie一旦加上HttpOnly,瀏覽器家族就禁止JavaScript讀取了! 自然也就無法發回到beauty.com。
老三趕緊向組織彙報。
老大說道:“看來瀏覽器家族又升級了啊!”
老二說:“其實吧, 既然我們可以往指定的頁面註入JavaScript程式碼,那這個JavaScript可以做的事情就多了去了,不一定只是借Cookie。例如我們可以用這個JS程式碼畫一個假的登入框,改寫到真的登入框之上,讓使用者信以為真,這樣就可以偷到真實的使用者名稱和密碼了。 或者透過JavaScript構造GET,POST請求,可以模擬使用者在該網站做點手腳,刪點什麼東西,從一個賬號往另外一個賬戶轉賬,都是可以的嘛!”
“妙極, 老二,真有你的,老三,你去找點網站,按二哥說的試試。”
又過了幾天,老三哭喪著臉說道:“大哥二哥,這些徹底玩完,現在人類出手了,來了幾個必殺技。”
“什麼必殺技?”
“一方面他們有人會對輸入進行過濾,發現不符合他們要求的輸入例如等就會過濾掉,我們的