iOS WebViews
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
The code of this page was extracted from here. Check the page for further details.
WebViews werden innerhalb von Anwendungen verwendet, um Webinhalte interaktiv anzuzeigen. Verschiedene Arten von WebViews bieten unterschiedliche Funktionen und Sicherheitsmerkmale für iOS-Anwendungen. Hier ist eine kurze Übersicht:
UIWebView, das ab iOS 12 nicht mehr empfohlen wird, da es keine Unterstützung für das Deaktivieren von JavaScript bietet, was es anfällig für Skriptinjektionen und Cross-Site Scripting (XSS)-Angriffe macht.
WKWebView ist die bevorzugte Option zur Integration von Webinhalten in Apps und bietet verbesserte Kontrolle über die Inhalte und Sicherheitsmerkmale. JavaScript ist standardmäßig aktiviert, kann jedoch bei Bedarf deaktiviert werden. Es unterstützt auch Funktionen, um zu verhindern, dass JavaScript automatisch Fenster öffnet, und stellt sicher, dass alle Inhalte sicher geladen werden. Darüber hinaus minimiert die Architektur von WKWebView das Risiko von Speicherbeschädigungen, die den Hauptanwendungsprozess betreffen.
SFSafariViewController bietet ein standardisiertes Webbrowser-Erlebnis innerhalb von Apps, erkennbar an seinem spezifischen Layout, das ein schreibgeschütztes Adressfeld, Share- und Navigationsschaltflächen sowie einen direkten Link zum Öffnen von Inhalten in Safari umfasst. Im Gegensatz zu WKWebView kann JavaScript im SFSafariViewController nicht deaktiviert werden, der auch Cookies und Daten mit Safari teilt und die Privatsphäre des Benutzers von der App aus wahrt. Es muss gemäß den App Store-Richtlinien deutlich angezeigt werden.
Im Prozess der Untersuchung von WebViews-Konfigurationen konzentriert man sich auf zwei Haupttypen: UIWebView und WKWebView. Zur Identifizierung dieser WebViews innerhalb einer Binärdatei werden Befehle verwendet, die nach spezifischen Klassenreferenzen und Initialisierungsmethoden suchen.
UIWebView Identifizierung
Dieser Befehl hilft dabei, Instanzen von UIWebView zu lokalisieren, indem nach Textzeichenfolgen gesucht wird, die damit im Binärformat verbunden sind.
WKWebView Identifizierung
Ebenso sucht dieser Befehl für WKWebView im Binärformat nach Textzeichenfolgen, die auf seine Verwendung hinweisen.
Darüber hinaus wird der folgende Befehl ausgeführt, um herauszufinden, wie ein WKWebView initialisiert wird, wobei die Methodensignatur, die mit seiner Initialisierung zusammenhängt, angesprochen wird:
Für WKWebView wird hervorgehoben, dass das Deaktivieren von JavaScript eine bewährte Methode ist, es sei denn, es ist erforderlich. Die kompilierte Binärdatei wird durchsucht, um zu bestätigen, dass die javaScriptEnabled
-Eigenschaft auf false
gesetzt ist, um sicherzustellen, dass JavaScript deaktiviert ist:
WKWebView bietet die Möglichkeit, Probleme mit gemischten Inhalten zu identifizieren, im Gegensatz zu UIWebView. Dies wird mit der hasOnlySecureContent
-Eigenschaft überprüft, um sicherzustellen, dass alle Seitenressourcen über sichere Verbindungen geladen werden. Die Suche im kompilierten Binärformat erfolgt wie folgt:
Die dynamische Analyse umfasst die Inspektion des Heaps nach WebView-Instanzen und deren Eigenschaften. Ein Skript namens webviews_inspector.js
wird zu diesem Zweck verwendet und zielt auf UIWebView
, WKWebView
und SFSafariViewController
-Instanzen ab. Es protokolliert Informationen über gefundene Instanzen, einschließlich URLs und Einstellungen im Zusammenhang mit JavaScript und sicherem Inhalt.
Die Heap-Inspektion kann mit ObjC.choose()
durchgeführt werden, um WebView-Instanzen zu identifizieren und die Eigenschaften javaScriptEnabled
und hasonlysecurecontent
zu überprüfen.
Das Skript wird ausgeführt mit:
Wichtige Ergebnisse:
Instanzen von WebViews werden erfolgreich lokalisiert und inspiziert.
Die Aktivierung von JavaScript und die sicheren Inhaltseinstellungen werden überprüft.
Diese Zusammenfassung fasst die kritischen Schritte und Befehle zusammen, die an der Analyse von WebView-Konfigurationen durch statische und dynamische Ansätze beteiligt sind, wobei der Fokus auf Sicherheitsfunktionen wie der Aktivierung von JavaScript und der Erkennung gemischter Inhalte liegt.
Die Verarbeitung von Inhalten in WebViews ist ein kritischer Aspekt, insbesondere beim Umgang mit verschiedenen Protokollen wie http(s)://
, file://
und tel://
. Diese Protokolle ermöglichen das Laden von sowohl entfernten als auch lokalen Inhalten innerhalb von Apps. Es wird betont, dass beim Laden lokaler Inhalte Vorsichtsmaßnahmen getroffen werden müssen, um zu verhindern, dass Benutzer den Namen oder den Pfad der Datei beeinflussen oder den Inhalt selbst bearbeiten.
WebViews bieten verschiedene Methoden zum Laden von Inhalten. Für UIWebView, das jetzt veraltet ist, werden Methoden wie loadHTMLString:baseURL:
und loadData:MIMEType:textEncodingName:baseURL:
verwendet. WKWebView hingegen verwendet loadHTMLString:baseURL:
, loadData:MIMEType:textEncodingName:baseURL:
und loadRequest:
für Webinhalte. Methoden wie pathForResource:ofType:
, URLForResource:withExtension:
und init(contentsOf:encoding:)
werden typischerweise zum Laden lokaler Dateien verwendet. Die Methode loadFileURL:allowingReadAccessToURL:
ist besonders bemerkenswert für ihre Fähigkeit, eine bestimmte URL oder ein Verzeichnis in den WebView zu laden, was potenziell sensible Daten offenlegen kann, wenn ein Verzeichnis angegeben wird.
Um diese Methoden im Quellcode oder in der kompilierten Binärdatei zu finden, können Befehle wie die folgenden verwendet werden:
Bezüglich Dateizugriff erlaubt UIWebView diesen universell, während WKWebView die Einstellungen allowFileAccessFromFileURLs
und allowUniversalAccessFromFileURLs
einführt, um den Zugriff von Datei-URLs zu verwalten, wobei beide standardmäßig auf false gesetzt sind.
Ein Frida-Skriptbeispiel wird bereitgestellt, um die WKWebView-Konfigurationen für Sicherheitseinstellungen zu inspizieren:
Lastly, ein Beispiel für eine JavaScript-Payload, die darauf abzielt, lokale Dateien zu exfiltrieren, zeigt das potenzielle Sicherheitsrisiko, das mit unsachgemäß konfigurierten WebViews verbunden ist. Diese Payload kodiert den Dateiinhalt in das Hex-Format, bevor sie an einen Server übertragen wird, und hebt die Bedeutung strenger Sicherheitsmaßnahmen in WebView-Implementierungen hervor.
Seit iOS 7 stellt Apple APIs für die Kommunikation zwischen JavaScript in einem WebView und nativen Swift- oder Objective-C-Objekten zur Verfügung. Diese Integration erfolgt hauptsächlich über zwei Methoden:
JSContext: Eine JavaScript-Funktion wird automatisch erstellt, wenn ein Swift- oder Objective-C-Block mit einem Bezeichner innerhalb eines JSContext
verknüpft wird. Dies ermöglicht eine nahtlose Integration und Kommunikation zwischen JavaScript und nativen Code.
JSExport-Protokoll: Durch die Vererbung des JSExport
-Protokolls können native Eigenschaften, Instanzmethoden und Klassenmethoden für JavaScript exponiert werden. Das bedeutet, dass alle Änderungen, die in der JavaScript-Umgebung vorgenommen werden, in der nativen Umgebung gespiegelt werden und umgekehrt. Es ist jedoch wichtig sicherzustellen, dass sensible Daten nicht unbeabsichtigt durch diese Methode exponiert werden.
JSContext
in Objective-CIn Objective-C kann der JSContext
für ein UIWebView
mit der folgenden Codezeile abgerufen werden:
WKWebView
Für WKWebView
ist der direkte Zugriff auf JSContext
nicht verfügbar. Stattdessen wird die Nachrichtenübermittlung über die Funktion postMessage
genutzt, die die Kommunikation zwischen JavaScript und der nativen Anwendung ermöglicht. Handler für diese Nachrichten werden wie folgt eingerichtet, um JavaScript eine sichere Interaktion mit der nativen Anwendung zu ermöglichen:
JavaScript kann mit der nativen Schicht interagieren, indem es einen Skript-Nachrichten-Handler definiert. Dies ermöglicht Operationen wie das Aufrufen nativer Funktionen von einer Webseite:
Um das Ergebnis eines nativen Funktionsaufrufs zu erfassen und zu manipulieren, kann man die Callback-Funktion innerhalb des HTML überschreiben:
Die native Seite verarbeitet den JavaScript-Aufruf, wie in der Klasse JavaScriptBridgeMessageHandler
gezeigt, wo das Ergebnis von Operationen wie der Multiplikation von Zahlen verarbeitet und zur Anzeige oder weiteren Manipulation an JavaScript zurückgesendet wird:
(Tutorial basierend auf dem von https://blog.vuplex.com/debugging-webviews)
Um Webinhalte innerhalb von iOS-Webviews effektiv zu debuggen, ist eine spezifische Einrichtung erforderlich, die die Entwicklertools von Safari nutzt, da Nachrichten, die an console.log()
gesendet werden, nicht in den Xcode-Protokollen angezeigt werden. Hier ist eine vereinfachte Anleitung, die die wichtigsten Schritte und Anforderungen hervorhebt:
Vorbereitung auf dem iOS-Gerät: Der Safari-Webinspektor muss auf Ihrem iOS-Gerät aktiviert werden. Dies geschieht, indem Sie zu Einstellungen > Safari > Erweitert gehen und den Webinspektor aktivieren.
Vorbereitung auf dem macOS-Gerät: Auf Ihrem macOS-Entwicklungsrechner müssen Sie die Entwicklertools in Safari aktivieren. Starten Sie Safari, greifen Sie auf Safari > Einstellungen > Erweitert zu und wählen Sie die Option Entwicklungsmenü anzeigen.
Verbindung und Debugging: Nachdem Sie Ihr iOS-Gerät mit Ihrem macOS-Computer verbunden und Ihre Anwendung gestartet haben, verwenden Sie Safari auf Ihrem macOS-Gerät, um das Webview auszuwählen, das Sie debuggen möchten. Navigieren Sie zu Entwickeln in der Menüleiste von Safari, fahren Sie mit der Maus über den Namen Ihres iOS-Geräts, um eine Liste der Webview-Instanzen zu sehen, und wählen Sie die Instanz aus, die Sie inspizieren möchten. Ein neues Safari-Webinspektor-Fenster wird zu diesem Zweck geöffnet.
Seien Sie sich jedoch der Einschränkungen bewusst:
Das Debuggen mit dieser Methode erfordert ein macOS-Gerät, da es auf Safari angewiesen ist.
Nur Webviews in Anwendungen, die über Xcode auf Ihr Gerät geladen wurden, sind für das Debugging berechtigt. Webviews in Apps, die über den App Store oder Apple Configurator installiert wurden, können auf diese Weise nicht debuggt werden.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)