Exploiting Content Providers
Sfruttare i Content Provider
Introduzione
I dati vengono forniti da un'applicazione ad altre su richiesta da un componente chiamato content provider. Queste richieste sono gestite attraverso i metodi della classe ContentResolver. I content provider possono memorizzare i loro dati in varie posizioni, come un database, file, o su una rete.
Nel file Manifest.xml, è richiesta la dichiarazione del content provider. Ad esempio:
Per accedere a content://com.mwr.example.sieve.DBContentProvider/Keys
, è necessaria l'autorizzazione READ_KEYS
. È interessante notare che il percorso /Keys/
è accessibile nella sezione seguente, la quale non è protetta a causa di un errore dello sviluppatore, che ha protetto /Keys
ma ha dichiarato /Keys/
.
Forse puoi accedere a dati privati o sfruttare qualche vulnerabilità (SQL Injection o Traversal del Percorso).
Ottenere informazioni dai provider di contenuti esposti
È possibile ricostruire come raggiungere il DBContentProvider iniziando gli URI con "content://". Questo approccio si basa su informazioni acquisite utilizzando Drozer, dove sono stati individuati dati chiave nella directory /Keys.
Drozer può indovinare e provare diversi URI:
Dovresti anche controllare il codice del ContentProvider per cercare le query:
Inoltre, se non riesci a trovare le query complete potresti controllare quali nomi sono dichiarati dal ContentProvider nel metodo onCreate
:
La query sarà simile a: content://nome.del.pacchetto.classe/nome_dichiarato
Content Provider supportato dal database
Probabilmente la maggior parte dei Content Provider viene utilizzata come interfaccia per un database. Pertanto, se riesci ad accedervi potresti essere in grado di estrarre, aggiornare, inserire ed eliminare informazioni. Controlla se puoi accedere a informazioni sensibili o prova a modificarle per eludere i meccanismi di autorizzazione.
Quando controlli il codice del Content Provider guarda anche le funzioni chiamate: query, insert, update e delete:
Poiché sarai in grado di chiamarle
Contenuto della query
Inserisci contenuto
Interrogando il database imparerai il nome delle colonne, quindi potresti essere in grado di inserire dati nel DB:
Nota che nell'inserimento e nell'aggiornamento puoi usare --string per indicare una stringa, --double per indicare un double, --float, --integer, --long, --short, --boolean
Aggiorna contenuto
Conoscendo il nome delle colonne potresti anche modificare le voci:
Elimina contenuto
SQL Injection
È semplice testare l'SQL injection (SQLite) manipolando i campi di proiezione e selezione che vengono passati al content provider. Quando si interroga il Content Provider ci sono 2 argomenti interessanti da cercare: --selection e --projection:
Puoi provare a abusare questi parametri per testare le iniezioni SQL:
Scoperta automatica di SQLInjection da parte di Drozer
Provider di contenuti supportati dal sistema di file
I provider di contenuti potrebbero essere utilizzati anche per accedere ai file:
Leggere un file
È possibile leggere i file dal Provider di Contenuti
Traversamento del percorso
Se puoi accedere ai file, puoi provare ad abusare di un Traversamento del percorso (in questo caso non è necessario, ma puoi provare a usare "../" e trucchi simili).
Scoperta automatica del percorso di attraversamento tramite Drozer
Riferimenti
Last updated