原文:《Cross-Site Scripting #3 Bad JavaScript Imports》
譯者:Twosecurity
在這篇文章里,我們將換一個姿勢利用 XSS。通常來講,XSS 是由程序對輸入缺乏合理的過濾而產生的。但在這篇文章里,我會展示如何在正確過濾 XSS 的網站中利用 XSS。它和常規攻擊手段類似,我們也可以用它來偷 cookie 或者釣魚。不過在之前,我們先來講解一下跨域資源共享技術。
跨域資源共享
跨域資源能夠提供瀏覽器更好的用戶體驗。通過它,我們可以在一個網站上訪問到不屬于它域下的資源(比如圖像,javascript,以及其它數據)。打個比方:
http://example.com 有如下跨域資源:
- 通過 XMLHttpRequest 請求http://securelayer7.net已登陸用戶的數據
- 用
<iframe src>標簽包含http://youtube.com - 用
<img src>請求http://imgur.com的圖片 - 用
<script src>請求https://code.jquery.com/jquery-1.8.1.min.js取得的javascript庫

為什么要引用腳本,而不是直接內聯?
當許多網站同時引用<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>)。那么攻擊者便有機可乘了:
- 注冊http://securelayer7.net并返回import.js
- 用戶瀏覽時會加載我們的惡意腳本
加載動態 ip 的腳本
開發者很有可能會犯將 ip 設為動態這種低級錯誤。我們只需想辦法獲取該 ip 地址的控制權(思路也和內網類似),便可以攻擊目標了。
因為輸入加載錯誤的域名
很多時候,開發者會漏打或者錯打域名(比方說:<script src="https://code.jqueri.com/import.js"></script>)我們可以趁機注冊該域名并返回惡意代碼
從一個運行 HTTP 的服務器加載腳本
如果一個腳本是用HTTP(不是HTTPS)傳輸的,那么我們可以用中間人攻擊(arp攻擊,icmp攻擊)來篡改腳本并在其中注入內容。
防護措施
- 從本地或者內網 ip 加載的腳本都要被替換成其它安全位置的腳本
- 嚴格管控現有的域名,確保知道哪些過期了,哪些沒有
- 腳本不應該從動態 ip 中引入
- 再三檢查輸入域名是否配對真實域名
- 盡可能地使用 https
- 腳本應該盡量存放在安全性高的第三方網站
- 如果你不能保證上述幾點,不要因為追求性能而無視安全性(引用腳本改成內聯)
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/527/
暫無評論