hacktricks/mobile-pentesting/android-app-pentesting/webview-attacks.md
2024-02-10 15:36:32 +00:00

9.3 KiB
Raw Blame History

Webview-Angriffe

Lernen Sie AWS-Hacking von Grund auf mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Vereinfachter Leitfaden zu WebView-Konfigurationen und Sicherheit

Übersicht über WebView-Schwachstellen

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

Beispiel WebView

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 lesen, indem sie das Datei-URL-Schema (file://path/to/file) verwenden.

Veraltete Funktionen: Universeller und Dateizugriff von URLs

  • Universeller Zugriff von Datei-URLs: Diese veraltete Funktion ermöglichte Cross-Origin-Anfragen von Datei-URLs und stellte ein erhebliches Sicherheitsrisiko durch potenzielle XSS-Angriffe dar. Die Standardeinstellung ist für Apps, die auf Android Jelly Bean und neuer abzielen, deaktiviert (false).

  • 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(), um zu überprüfen, und setAllowFileAccessFromFileURLs(boolean), um festzulegen.

Sicherer Dateiload

Um den Dateisystemzugriff zu deaktivieren und dennoch auf Assets und Ressourcen zuzugreifen, wird die Methode setAllowFileAccess() verwendet. Ab Android R 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 und entspricht der Same-Origin-Richtlinie, wodurch die Verwaltung von CORS erleichtert wird.

JavaScript und Intent-Schema-Handling

  • JavaScript: Standardmäßig in WebViews deaktiviert, kann es über setJavaScriptEnabled() aktiviert werden. Vorsicht ist geboten, 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 es nicht sorgfältig verwaltet wird. Ein Beispiel für eine Schwachstelle war ein freigelegter WebView-Parameter "support_url", der für die Ausführung von Cross-Site-Scripting (XSS)-Angriffen ausgenutzt werden konnte.

Verwundbare WebView

Beispiel für Ausnutzung mit adb:

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 Verwendung der Methode addJavascriptInterface erreicht, die JavaScript mit nativen Android-Funktionalitäten integriert und als WebView JavaScript Bridge bezeichnet wird. Vorsicht ist geboten, da diese Methode allen Seiten innerhalb des WebViews Zugriff auf das registrierte JavaScript Interface-Objekt ermöglicht und somit ein Sicherheitsrisiko besteht, wenn sensible Informationen über diese Schnittstellen offengelegt werden.

Wichtige Überlegungen

  • Äußerste Vorsicht ist geboten bei Apps, die auf Android-Versionen unter 4.2 abzielen, aufgrund einer Sicherheitslücke, die die Ausführung von Remote-Code durch bösartiges JavaScript ermöglicht, indem die Reflexion ausgenutzt wird.

Implementierung einer JavaScript Bridge

  • 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();
  • Potenzielle Ausnutzung durch JavaScript, zum Beispiel über einen XSS-Angriff, ermöglicht das Aufrufen von freigegebenen 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 Erreichung von RCE durch Reflektion durch Ausführung einer spezifischen Nutzlast. Die @JavascriptInterface-Annotation verhindert jedoch den unbefugten Zugriff auf Methoden und begrenzt somit die Angriffsfläche.

Remote-Debugging

  • Remote-Debugging ist mit den Chrome Developer Tools möglich und ermöglicht die Interaktion und beliebige Ausführung von JavaScript im WebView-Inhalt.

Aktivieren des Remote-Debuggings

  • Das Remote-Debugging kann für alle WebViews in einer Anwendung aktiviert werden, indem:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WebView.setWebContentsDebuggingEnabled(true);
}
  • Um das Debuggen bedingt auf der Debuggable-Eigenschaft 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 mithilfe 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

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

Andere Möglichkeiten, HackTricks zu unterstützen: