Exploiting Content Providers
Exploiting Content Providers
Intro
I dati sono forniti da un'applicazione ad altre su richiesta da un componente noto come 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, è necessaria 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, che 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 Path Traversal).
Ottieni informazioni da content provider esposti
È possibile ricostruire come raggiungere il DBContentProvider iniziando gli URI con “content://”. Questo approccio si basa su intuizioni ottenute utilizzando Drozer, dove informazioni chiave si trovavano nella directory /Keys.
Drozer può indovinare e provare diversi URI:
Dovresti anche controllare il codice del ContentProvider per cercare query:
Inoltre, se non riesci a trovare query complete, potresti controllare quali nomi sono dichiarati dal ContentProvider nel metodo onCreate
:
La query sarà simile a: content://name.of.package.class/declared_name
Content Provider supportati da database
Probabilmente la maggior parte dei Content Provider è utilizzata come interfaccia per un database. Pertanto, se puoi accedervi, potresti essere in grado di estrarre, aggiornare, inserire e eliminare informazioni. Controlla se puoi accedere a informazioni sensibili o prova a modificarle per bypassare i meccanismi di autorizzazione.
Quando controlli il codice del Content Provider guarda anche per funzioni chiamate come: query, insert, update e delete:
Perché sarai in grado di chiamarle
Query content
Insert content
Interrogando il database imparerai il nome delle colonne, poi, potresti essere in grado di inserire dati nel DB:
Nota che in insert e update puoi usare --string per indicare stringa, --double per indicare un double, --float, --integer, --long, --short, --boolean
Update content
Conoscendo il nome delle colonne potresti anche modificare le voci:
Delete content
SQL Injection
È semplice testare per SQL injection (SQLite) manipolando i campi di proiezione e selezione che vengono passati al content provider. Quando interroghi il Content Provider ci sono 2 argomenti interessanti da cercare informazioni: --selection e --projection:
Puoi provare ad abusare di questi parametri per testare per SQL injections:
Scoperta automatica di SQLInjection da parte di Drozer
Content Provider supportati dal File System
I content provider possono essere utilizzati anche per accedere ai file:
Leggi file
Puoi leggere i file dal Content Provider
Path Traversal
Se puoi accedere ai file, puoi provare ad abusare di un Path Traversal (in questo caso non è necessario, ma puoi provare a usare "../" e trucchi simili).
Scoperta automatica del Path Traversal da parte di Drozer
Riferimenti
Last updated