Webview Attacks

Erlernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Anleitung zu WebView-Konfigurationen und Sicherheit

Übersicht über WebView-Schwachstellen

Ein entscheidender Aspekt der Android-Entwicklung besteht darin, WebViews korrekt zu behandeln. Diese Anleitung hebt wichtige Konfigurationen und Sicherheitspraktiken hervor, um Risiken im Zusammenhang mit der Verwendung von WebViews zu minimieren.

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 externem Speicher unter Verwendung eines Datei-URL-Schemas (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 und stellte aufgrund potenzieller XSS-Angriffe ein erhebliches Sicherheitsrisiko dar. Die Standardeinstellung ist deaktiviert (false) für Apps, die auf Android Jelly Bean und neuer abzielen.

  • Verwenden Sie getAllowUniversalAccessFromFileURLs(), um diese Einstellung zu überprüfen.

  • Verwenden Sie setAllowUniversalAccessFromFileURLs(boolean), um diese Einstellung zu ändern.

  • Dateizugriff von Datei-URLs: Diese Funktion, ebenfalls veraltet, kontrollierte den Zugriff auf Inhalte von anderen Datei-URL-Schemas. Wie der universelle Zugriff ist die Standardeinstellung aus Sicherheitsgründen deaktiviert.

  • Verwenden Sie getAllowFileAccessFromFileURLs() zum Überprüfen und setAllowFileAccessFromFileURLs(boolean) zum Einstellen.

Sicherer Dateiload

Um den Dateisystemzugriff zu deaktivieren, aber dennoch auf Assets und Ressourcen zuzugreifen, wird die Methode setAllowFileAccess() verwendet. Ab 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 zum Zugriff auf lokale Assets und Ressourcen, die sich an der Same-Origin-Richtlinie orientieren und somit das CORS-Management erleichtern.

loadUrl

Dies ist eine häufig verwendete Funktion zum Laden beliebiger URLs in einer WebView:

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-Handling

  • JavaScript: Standardmäßig in WebViews deaktiviert, kann es über setJavaScriptEnabled() aktiviert werden. Es wird empfohlen, Vorsicht walten zu lassen, da das Aktivieren von JavaScript ohne angemessene Sicherheitsvorkehrungen Sicherheitslücken einführen kann.

  • Intent-Schema: WebViews können das intent-Schema verarbeiten, was potenziell zu Exploits führen kann, wenn nicht sorgfältig verwaltet. Ein Beispiel für eine Sicherheitslücke beinhaltete einen freiliegenden WebView-Parameter "support_url", der ausgenutzt werden konnte, um Cross-Site-Scripting (XSS)-Angriffe auszuführen.

Beispiel für die Ausnutzung mit adb:

adb.exe shell am start -n com.tmh.vulnwebview/.SupportWebView –es support_url "https://example.com/xss.html"

JavaScript-Brücke

Android bietet eine Funktion, die es JavaScript in einem WebView ermöglicht, native Android-App-Funktionen aufzurufen. Dies wird durch die Verwendung der Methode addJavascriptInterface erreicht, die JavaScript mit nativen Android-Funktionalitäten integriert, die als WebView JavaScript-Brücke bezeichnet werden. Es wird zur Vorsicht geraten, da diese Methode allen Seiten innerhalb des WebViews den Zugriff auf das registrierte JavaScript-Interface-Objekt ermöglicht, was ein Sicherheitsrisiko darstellt, wenn über diese Schnittstellen sensible Informationen preisgegeben werden.

  • Für Apps, die auf Android-Versionen unter 4.2 abzielen, ist äußerste Vorsicht geboten, da eine Sicherheitslücke besteht, die die Ausführung von Remote-Code durch bösartiges JavaScript ermöglicht, das Reflexion ausnutzt.

Implementierung einer JavaScript-Brücke

  • JavaScript-Schnittstellen können mit nativem Code interagieren, wie in den Beispielen gezeigt, in denen eine Klassenmethode für JavaScript freigegeben wird:

@JavascriptInterface
public String getSecret() {
return "SuperSecretPassword";
};
  • JavaScript Bridge wird aktiviert, indem eine Schnittstelle zum WebView hinzugefügt wird:

webView.addJavascriptInterface(new JavascriptBridge(), "javascriptBridge");
webView.reload();
  • Mögliche Ausnutzung durch JavaScript, beispielsweise über einen XSS-Angriff, ermöglicht das Aufrufen von freigelegten Java-Methoden:

<script>alert(javascriptBridge.getSecret());</script>
  • Um Risiken zu minimieren, beschränken Sie die Verwendung der JavaScript-Bridge auf den mit der APK ausgelieferten Code und verhindern Sie das Laden von JavaScript aus externen Quellen. Für ältere Geräte sollte das minimale API-Level auf 17 gesetzt werden.

Reflektionsbasierte Remote Code Execution (RCE)

  • Eine dokumentierte Methode ermöglicht die Erzielung von RCE durch Reflektion durch Ausführen eines spezifischen Payloads. Die @JavascriptInterface-Annotation verhindert jedoch unberechtigten Methodenzugriff und begrenzt die Angriffsfläche.

Remote Debugging

  • Remote Debugging ist mit den Chrome Developer Tools möglich, was eine Interaktion und beliebige JavaScript-Ausführung innerhalb des WebView-Inhalts ermöglicht.

Aktivierung des Remote Debugging

  • Das Remote Debugging kann für alle WebViews innerhalb einer Anwendung aktiviert werden, indem:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WebView.setWebContentsDebuggingEnabled(true);
}
  • Um das Debuggen bedingt basierend auf dem Debuggable-Zustand der Anwendung zu aktivieren:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE))
{ WebView.setWebContentsDebuggingEnabled(true); }
}

Exfiltration beliebiger Dateien

  • Zeigt die Exfiltration beliebiger Dateien unter Verwendung eines XMLHttpRequest:

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

Erlernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Last updated