原文:《Cross-Site Scripting #3 Bad JavaScript Imports》
譯者:Twosecurity

在這篇文章里,我們將換一個姿勢利用 XSS。通常來講,XSS 是由程序對輸入缺乏合理的過濾而產生的。但在這篇文章里,我會展示如何在正確過濾 XSS 的網站中利用 XSS。它和常規攻擊手段類似,我們也可以用它來偷 cookie 或者釣魚。不過在之前,我們先來講解一下跨域資源共享技術。

跨域資源共享

跨域資源能夠提供瀏覽器更好的用戶體驗。通過它,我們可以在一個網站上訪問到不屬于它域下的資源(比如圖像,javascript,以及其它數據)。打個比方:

http://example.com 有如下跨域資源:

為什么要引用腳本,而不是直接內聯?

當許多網站同時引用<script src=”https://code.jquery.com/jquery-1.8.1.min.js”></script>時,瀏覽器只需加載一次,便可以將其載入緩存方便不同網站對其的調用。

為什么我們又需要加載外部的javascript庫呢?答案很簡單,方便開發。在 jQuery 中,我們只需短短的一句,就可以改變背景顏色:$(‘body’).css('background', '#ccc');

如果直接用原生 JavaScript 操作 DOM 的話,我們就得:

Function changeBachground(color) {
  Document.body.style.background = color;
}

Onload="changeBackground('red');" //某個事件

由 javascript 引用而導致的漏洞

由于控制權的缺失,加載第三方控制的腳本有十分嚴重的安全隱患。第三方網站的站長有可能在腳本中插入惡意代碼。或者網站自身有漏洞而被攻擊者所控制,最終導致攻擊者篡改其提供的腳本。

攻擊從本地加載的腳本

假設在一個開發環境中,工程師用<script src="http://127.0.0.1:4545/import.js"></script>加載本地Web服務器上的資源。如果在發布該應用時沒有移除這個語句,那么攻擊者可以使用如下手段來攻擊目標:

  • 登陸運行該應用的電腦(物理滲透,SSRF)
  • 用一個 Web 服務器監聽本地4545端口,并返回惡意js。
  • 目標在該電腦上開啟瀏覽器,進入這個程序
  • 瀏覽器加載惡意 JavaScript,導致XSS

攻擊從局域網加載的腳本

繼續假設一個開發環境,開發者用腳本來加載內部服務器的資源:<script src="http://192.168.0.111/import.js"></script>。這時候,攻擊者也可以按照類似攻擊本地資源的手法插入惡意腳本,只不過需要鎖定一個ip罷了(SSRF,內網滲透,物理滲透)。

源于未注冊域名的腳本

很多時候,工程師會在host文件中加入自定義的域名。這樣一來省錢,二來不用部署。或者有些已經注冊的域名忘記續費而過期了,如果發布時碰巧忘記移除它(比如<script src="https://securelayer7.net/import.js"></script>)。那么攻擊者便有機可乘了:

加載動態 ip 的腳本

開發者很有可能會犯將 ip 設為動態這種低級錯誤。我們只需想辦法獲取該 ip 地址的控制權(思路也和內網類似),便可以攻擊目標了。

因為輸入加載錯誤的域名

很多時候,開發者會漏打或者錯打域名(比方說:<script src="https://code.jqueri.com/import.js"></script>)我們可以趁機注冊該域名并返回惡意代碼

從一個運行 HTTP 的服務器加載腳本

如果一個腳本是用HTTP(不是HTTPS)傳輸的,那么我們可以用中間人攻擊(arp攻擊,icmp攻擊)來篡改腳本并在其中注入內容。

防護措施

  • 從本地或者內網 ip 加載的腳本都要被替換成其它安全位置的腳本
  • 嚴格管控現有的域名,確保知道哪些過期了,哪些沒有
  • 腳本不應該從動態 ip 中引入
  • 再三檢查輸入域名是否配對真實域名
  • 盡可能地使用 https
  • 腳本應該盡量存放在安全性高的第三方網站
  • 如果你不能保證上述幾點,不要因為追求性能而無視安全性(引用腳本改成內聯)


歡迎關注作者公眾號


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/527/