Exploiting Content Providers
Explorando Provedores de Conteúdo
Introdução
Os dados são fornecidos de um aplicativo para outros mediante solicitação por um componente conhecido como provedor de conteúdo. Essas solicitações são gerenciadas através dos métodos da classe ContentResolver. Os provedores de conteúdo podem armazenar seus dados em vários locais, como um banco de dados, arquivos, ou em uma rede.
No arquivo Manifest.xml, é necessária a declaração do provedor de conteúdo. Por exemplo:
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 seguinte seção, a qual 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 Traversal de Caminho).
Obter informações de provedores de conteúdo expostos
É possível juntar como chegar ao DBContentProvider começando URIs com "content://". Esta abordagem é baseada em insights obtidos ao usar o Drozer, onde informações-chave foram localizadas no diretório /Keys.
O Drozer pode adivinhar e tentar várias URIs:
Deve também verificar o código do ContentProvider para procurar por consultas:
Além disso, se não conseguir encontrar consultas completas, poderia verificar quais nomes são declarados pelo ContentProvider no método onCreate
:
A consulta será assim: content://nome.do.pacote.classe/nome_declarado
Provedores de Conteúdo com Banco de Dados
Provavelmente a maioria dos Provedores de Conteúdo são usados como interface para um banco de dados. Portanto, se você conseguir acessá-lo, poderá extrair, atualizar, inserir e excluir informações. Verifique se consegue acessar informações sensíveis ou tente alterá-las para burlar mecanismos de autorização.
Ao verificar o código do Provedor de Conteúdo, procure também por funções com nomes como: query, insert, update e delete:
Pois você será capaz de chamá-las
Consulta de conteúdo
Inserir conteúdo
Ao consultar o banco de dados, você aprenderá o nome das colunas, então, você poderá inserir dados no BD:
Observe que na inserção e atualização 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 poderá modificar as entradas:
Deletar conteúdo
Injeção de SQL
É simples testar a injeção de SQL (SQLite) manipulando os campos de projeção e seleção que são passados para o provedor de conteúdo. Ao consultar o Provedor de Conteúdo, existem 2 argumentos interessantes para procurar informações: --selection e --projection:
Você pode tentar abusar desses parâmetros para testar as injeções de SQL:
Descoberta automática de SQLInjection pelo Drozer
Provedores de Conteúdo com Suporte ao 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
Travessia de Caminho
Se você pode acessar arquivos, você pode tentar abusar de uma Travessia de Caminho (neste caso, isso não é necessário, mas você pode tentar usar "../" e truques similares).
Descoberta automática de Traversal de Caminho pelo Drozer
Referências
Last updated