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.
Le WebViews sono utilizzate all'interno delle applicazioni per visualizzare contenuti web in modo interattivo. Vari tipi di WebViews offrono diverse funzionalità e caratteristiche di sicurezza per le applicazioni iOS. Ecco una breve panoramica:
UIWebView, che non è più raccomandato a partire da iOS 12 a causa della sua mancanza di supporto per disabilitare JavaScript, rendendolo suscettibile a iniezioni di script e attacchi di Cross-Site Scripting (XSS).
WKWebView è l'opzione preferita per incorporare contenuti web nelle app, offrendo un controllo migliorato sui contenuti e sulle caratteristiche di sicurezza. JavaScript è abilitato per impostazione predefinita, ma può essere disabilitato se necessario. Supporta anche funzionalità per prevenire l'apertura automatica di finestre da parte di JavaScript e garantisce che tutti i contenuti vengano caricati in modo sicuro. Inoltre, l'architettura di WKWebView riduce al minimo il rischio di corruzione della memoria che influisce sul processo principale dell'app.
SFSafariViewController offre un'esperienza di navigazione web standardizzata all'interno delle app, riconoscibile dal suo layout specifico che include un campo indirizzo in sola lettura, pulsanti di condivisione e navigazione, e un link diretto per aprire contenuti in Safari. A differenza di WKWebView, JavaScript non può essere disabilitato in SFSafariViewController, che condivide anche cookie e dati con Safari, mantenendo la privacy dell'utente dall'app. Deve essere visualizzato in modo prominente secondo le linee guida dell'App Store.
Nel processo di esaminare le configurazioni di WebViews, si concentrano su due tipi principali: UIWebView e WKWebView. Per identificare questi WebViews all'interno di un binario, vengono utilizzati comandi, cercando riferimenti a classi specifiche e metodi di inizializzazione.
UIWebView Identification
Questo comando aiuta a localizzare le istanze di UIWebView cercando stringhe di testo ad essa correlate nel binario.
Identificazione di WKWebView
Allo stesso modo, per WKWebView, questo comando cerca nel binario stringhe di testo indicative del suo utilizzo.
Inoltre, per scoprire come viene inizializzato un WKWebView, viene eseguito il seguente comando, mirato alla firma del metodo relativa alla sua inizializzazione:
Per WKWebView, è evidenziato che disabilitare JavaScript è una buona pratica a meno che non sia necessario. Si cerca il binario compilato per confermare che la proprietà javaScriptEnabled
sia impostata su false
, assicurando che JavaScript sia disabilitato:
WKWebView offre la possibilità di identificare problemi di contenuti misti, a differenza di UIWebView. Questo viene controllato utilizzando la proprietà hasOnlySecureContent
per garantire che tutte le risorse della pagina siano caricate tramite connessioni sicure. La ricerca nel binario compilato viene eseguita come segue:
L'analisi dinamica comporta l'ispezione dell'heap per le istanze di WebView e le loro proprietà. Uno script chiamato webviews_inspector.js
è utilizzato a questo scopo, mirato alle istanze di UIWebView
, WKWebView
e SFSafariViewController
. Registra informazioni sulle istanze trovate, inclusi URL e impostazioni relative a JavaScript e contenuti sicuri.
L'ispezione dell'heap può essere condotta utilizzando ObjC.choose()
per identificare le istanze di WebView e controllare le proprietà javaScriptEnabled
e hasonlysecurecontent
.
Lo script viene eseguito con:
Risultati Chiave:
Le istanze di WebViews sono state localizzate e ispezionate con successo.
L'abilitazione di JavaScript e le impostazioni di contenuto sicuro sono state verificate.
Questo riepilogo racchiude i passaggi e i comandi critici coinvolti nell'analisi delle configurazioni di WebView attraverso approcci statici e dinamici, concentrandosi su funzionalità di sicurezza come l'abilitazione di JavaScript e la rilevazione di contenuti misti.
Gestire il contenuto nelle WebViews è un aspetto critico, specialmente quando si trattano vari protocolli come http(s)://
, file://
e tel://
. Questi protocolli consentono il caricamento di contenuti sia remoti che locali all'interno delle app. Si sottolinea che quando si carica contenuto locale, devono essere adottate precauzioni per impedire agli utenti di influenzare il nome o il percorso del file e di modificare il contenuto stesso.
WebViews offrono diversi metodi per il caricamento dei contenuti. Per UIWebView, ora deprecato, si utilizzano metodi come loadHTMLString:baseURL:
e loadData:MIMEType:textEncodingName:baseURL:
. WKWebView, d'altra parte, impiega loadHTMLString:baseURL:
, loadData:MIMEType:textEncodingName:baseURL:
e loadRequest:
per il contenuto web. Metodi come pathForResource:ofType:
, URLForResource:withExtension:
e init(contentsOf:encoding:)
sono tipicamente utilizzati per caricare file locali. Il metodo loadFileURL:allowingReadAccessToURL:
è particolarmente notevole per la sua capacità di caricare un URL o una directory specifica nella WebView, potenzialmente esponendo dati sensibili se viene specificata una directory.
Per trovare questi metodi nel codice sorgente o nel binario compilato, possono essere utilizzati comandi come i seguenti:
Riguardo all'accesso ai file, UIWebView lo consente universalmente, mentre WKWebView introduce le impostazioni allowFileAccessFromFileURLs
e allowUniversalAccessFromFileURLs
per gestire l'accesso dagli URL dei file, con entrambe impostate su false per impostazione predefinita.
Un esempio di script Frida è fornito per ispezionare le configurazioni di WKWebView per le impostazioni di sicurezza:
Infine, un esempio di un payload JavaScript mirato all'exfiltrazione di file locali dimostra il potenziale rischio per la sicurezza associato a WebViews configurati in modo errato. Questo payload codifica i contenuti dei file in formato esadecimale prima di trasmetterli a un server, evidenziando l'importanza di misure di sicurezza rigorose nelle implementazioni di WebView.
A partire da iOS 7, Apple ha fornito API per la comunicazione tra JavaScript in un WebView e oggetti nativi Swift o Objective-C. Questa integrazione è principalmente facilitata attraverso due metodi:
JSContext: Una funzione JavaScript viene creata automaticamente quando un blocco Swift o Objective-C è collegato a un identificatore all'interno di un JSContext
. Questo consente un'integrazione e comunicazione senza soluzione di continuità tra JavaScript e codice nativo.
JSExport Protocol: Ereditando il protocollo JSExport
, le proprietà native, i metodi di istanza e i metodi di classe possono essere esposti a JavaScript. Ciò significa che eventuali modifiche apportate nell'ambiente JavaScript vengono riflesse nell'ambiente nativo e viceversa. Tuttavia, è essenziale garantire che i dati sensibili non vengano esposti involontariamente tramite questo metodo.
JSContext
in Objective-CIn Objective-C, il JSContext
per un UIWebView
può essere recuperato con la seguente riga di codice:
WKWebView
Per WKWebView
, l'accesso diretto a JSContext
non è disponibile. Invece, viene utilizzato il passaggio di messaggi tramite la funzione postMessage
, che consente la comunicazione tra JavaScript e nativo. I gestori per questi messaggi sono impostati come segue, consentendo a JavaScript di interagire in modo sicuro con l'applicazione nativa:
JavaScript può interagire con il layer nativo definendo un gestore di messaggi per gli script. Questo consente operazioni come l'invocazione di funzioni native da una pagina web:
Per catturare e manipolare il risultato di una chiamata a una funzione nativa, è possibile sovrascrivere la funzione di callback all'interno dell'HTML:
Il lato nativo gestisce la chiamata JavaScript come mostrato nella classe JavaScriptBridgeMessageHandler
, dove il risultato delle operazioni come la moltiplicazione di numeri viene elaborato e inviato nuovamente a JavaScript per la visualizzazione o ulteriori manipolazioni:
(Tutorial basato su quello di https://blog.vuplex.com/debugging-webviews)
Per eseguire il debug dei contenuti web all'interno delle webview iOS, è necessaria una configurazione specifica che coinvolge gli strumenti per sviluppatori di Safari, poiché i messaggi inviati a console.log()
non vengono visualizzati nei log di Xcode. Ecco una guida semplificata, che enfatizza i passaggi e i requisiti chiave:
Preparazione sul dispositivo iOS: L'Inspector Web di Safari deve essere attivato sul tuo dispositivo iOS. Questo si fa andando su Impostazioni > Safari > Avanzate, e abilitando l'Inspector Web.
Preparazione sul dispositivo macOS: Sul tuo computer di sviluppo macOS, devi abilitare gli strumenti per sviluppatori all'interno di Safari. Avvia Safari, accedi a Safari > Preferenze > Avanzate, e seleziona l'opzione per Mostra menu Sviluppo.
Connessione e Debugging: Dopo aver collegato il tuo dispositivo iOS al computer macOS e avviato la tua applicazione, utilizza Safari sul tuo dispositivo macOS per selezionare la webview che desideri debuggare. Naviga su Sviluppo nella barra dei menu di Safari, passa il mouse sul nome del tuo dispositivo iOS per vedere un elenco delle istanze delle webview, e seleziona l'istanza che desideri ispezionare. Si aprirà una nuova finestra dell'Inspector Web di Safari per questo scopo.
Tuttavia, fai attenzione alle limitazioni:
Il debugging con questo metodo richiede un dispositivo macOS poiché si basa su Safari.
Solo le webview nelle applicazioni caricate sul tuo dispositivo tramite Xcode sono idonee per il debugging. Le webview nelle app installate tramite l'App Store o Apple Configurator non possono essere debuggate in questo modo.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)