Exploiting Content Providers
Explotando Proveedores de Contenido
Introducción
Los datos son suministrados de una aplicación a otras a solicitud de un componente conocido como proveedor de contenido. Estas solicitudes son gestionadas a través de los métodos de la clase ContentResolver. Los proveedores de contenido pueden almacenar sus datos en varias ubicaciones, como una base de datos, archivos o a través de una red.
En el archivo Manifest.xml, se requiere la declaración del proveedor de contenido. Por ejemplo:
Para acceder a content://com.mwr.example.sieve.DBContentProvider/Keys
, se necesita el permiso READ_KEYS
. Es interesante notar que la ruta /Keys/
es accesible en la siguiente sección, que no está protegida debido a un error del desarrollador, quien aseguró /Keys
pero declaró /Keys/
.
Quizás puedas acceder a datos privados o explotar alguna vulnerabilidad (SQL Injection o Path Traversal).
Obtener información de content providers expuestos
Es posible juntar cómo llegar al DBContentProvider comenzando URIs con “content://”. Este enfoque se basa en los conocimientos adquiridos al usar Drozer, donde se encontraba información clave en el /Keys directorio.
Drozer puede adivinar y probar varios URIs:
Deberías también revisar el código de ContentProvider para buscar consultas:
Además, si no puedes encontrar consultas completas, podrías ver qué nombres están declarados por el ContentProvider en el método onCreate
:
La consulta será como: content://name.of.package.class/declared_name
Content Providers respaldados por bases de datos
Probablemente la mayoría de los Content Providers se utilizan como interfaz para una base de datos. Por lo tanto, si puedes acceder a ella, podrías extraer, actualizar, insertar y eliminar información. Verifica si puedes acceder a información sensible o intenta cambiarla para eludir mecanismos de autorización.
Al revisar el código del Content Provider, busca también funciones nombradas como: query, insert, update y delete:
Porque podrás llamarlas
Consultar contenido
Insertar contenido
Consultando la base de datos aprenderás el nombre de las columnas, luego, podrías ser capaz de insertar datos en la DB:
Nota que en insertar y actualizar puedes usar --string para indicar cadena, --double para indicar un doble, --float, --integer, --long, --short, --boolean
Actualizar contenido
Conociendo el nombre de las columnas también podrías modificar las entradas:
Eliminar contenido
Inyección SQL
Es simple probar la inyección SQL (SQLite) manipulando los campos de proyección y selección que se pasan al proveedor de contenido. Al consultar el Proveedor de Contenido hay 2 argumentos interesantes para buscar información: --selection y --projection:
Puedes intentar abusar de estos parámetros para probar inyecciones SQL:
Descubrimiento automático de SQLInjection por Drozer
Proveedores de Contenido respaldados por el Sistema de Archivos
Los proveedores de contenido también se pueden usar para acceder a archivos:
Leer archivo
Puedes leer archivos del Proveedor de Contenido
Traversal de Ruta
Si puedes acceder a archivos, puedes intentar abusar de un Traversal de Ruta (en este caso, esto no es necesario, pero puedes intentar usar "../" y trucos similares).
Descubrimiento automático de Path Traversal por Drozer
Referencias
Last updated