記一次安全事故排查

項目組有個項目管理網站wss,搭建在公網之上,今天上班的時候發現訪問網站時會跳轉到一個廣告頁面(原地跳轉,而不是打開一個新的頁面)。
嗯,這就是現象。

下面記錄一下整個排查過程。

  1. 使用Chrome查看網絡數據是如何交互的,但是這個方法無效,因爲在原地跳轉的一瞬間,chrome中網絡的數據就已經更新了,而我們希望看到的是如何跳轉到這個廣告頁面的。
  2. 使用wireshark,過濾,抓包,終於看到,在獲取到style.css文件之後,跳轉到了一個其他域的請求,其HTTP報頭中寫着:host:**(廣告域);referer:www.wssys.net。也即是從wssys.net中跳轉到這個廣告裏面的。
  3. 把style.css屏蔽掉,因爲我不知道這個向wssys.net的請求是誰發起的,只能按照請求的順序依次排查,所幸需要排查的不多。style.css如果有個連接(比如圖片)是指向wssys.net那麼就可能會出現這個refer情況。
  4. 把style.css屏蔽掉並不work,然後只能去排查代碼,在user_upload.php文件中發現瞭如下一個iframe
<iframe id="frame_content" name="main_frame" frameborder="0" height="1px" width="1px" src="http://www.wssys.net/analytics<?php if ($language == "en") { echo "_en";}?>.html" scrolling="no"></iframe>
//終於發現了wssys.net的影子,把這個請求放到瀏覽器中就會出現剛剛的跳轉。因此,應該是這個域名過期了,或者其服務器出現了些什麼問題所導致的。

解決方法也就簡單了,直接把這個iframe刪除即可。

更進一步

接下來的問題很驚心啊,一個iframe中的內容竟然可以去影響外部窗口的location。這個實在是太可怕了,試想,如果一個訪問量很大的網站中有個小小的iframe嵌入了某個網站的信息,然後這個網站被人篡改了,這樣將會直接導致這個大型網站被跳轉到一個什麼亂七八糟,甚至是釣魚頁面上。
而更可怕的是如果這個被嵌入的網站是類似於google-analysis的網站(當然google的技術肯定是沒問題的),那麼全球可能會有很多很多網站都會受到影響。

爲此,做了個小小的實驗:

index.html

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
    這是main body窗口
    <iframe src="http://******(某個域名下)/iframe.html" width="100px" height="100px"/>
</body>
</html>
iframe.html

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript">
    window.parent.location.replace("http://www.baidu.com");
</script> 
</head>
<body>
    這是iframe窗口
</body>
</html>

就這個小小的代碼window.parent.location.replace就會發生 我們上面說的問題。

措施

有時候,對於頁面中的iframe並不能簡單粗暴的刪掉,但是我們又不能完全的信任它是非常安全。我查詢了MDN的iframe屬性,發現了sandbox這個屬性,當然了只支持html5.
iframe屬性

通過使用sandbox可以限制iframe中所允許做的操作。
sandbox包含如下四個屬性:

  • allow-same-origin: 允許將內容作爲普通來源對待。如果未使用該關鍵字,嵌入的內容將被視爲一個獨立的源。
  • allow-top-navigation:嵌入的頁面的上下文可以導航(加載)內容到頂級的瀏覽上下文環境(browsing context)。如果未使用該關鍵字,這個操作將不可用。
  • allow-forms: 允許嵌入的瀏覽上下文可以提交表單。如果該關鍵字未使用,該操作將不可用。
  • allow-scripts: 允許嵌入的瀏覽上下文運行腳本(但不能window創建彈窗)。如果該關鍵字未使用,這項操作不可用。

所以,我們可以將index.html改爲如下:

index.html

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
    這是main body窗口
    <iframe src="http://******/iframe.html" width="100px" height="100px" sandbox="allow-scripts"/>
</body>
</html>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章