Exploiting Content Providers
Explotando Proveedores de Contenido
Introducción
Los datos son suministrados de una aplicación a otras a petición por un componente conocido como un 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, la cual no está protegida debido a un error del desarrollador, quien aseguró /Keys
pero declaró /Keys/
.
Tal vez puedas acceder a datos privados o explotar alguna vulnerabilidad (Inyección SQL o Traversal de Ruta).
Obtener información de proveedores de contenido expuestos
Es posible reconstruir cómo llegar al DBContentProvider comenzando URIs con "content://". Este enfoque se basa en información clave obtenida al usar Drozer, donde se ubicaba información clave en el directorio /Keys.
Drozer puede adivinar y probar varios URIs:
Deberías también revisar el código del ContentProvider para buscar consultas:
Además, si no puedes encontrar consultas completas, podrías verificar qué nombres son declarados por el ContentProvider en el método onCreate
:
La consulta será como: content://nombre.del.paquete.clase/nombre_declarado
Proveedores de contenido respaldados por bases de datos
Probablemente la mayoría de los Proveedores de Contenido se utilizan como interfaz para una base de datos. Por lo tanto, si puedes acceder a él, podrías ser capaz de extraer, actualizar, insertar y eliminar información. Verifica si puedes acceder a información sensible o intenta cambiarla para burlar los mecanismos de autorización.
Al revisar el código del Proveedor de Contenido, busca también funciones con nombres como: query, insert, update y delete:
Porque podrás llamarlas
Consulta de contenido
Insertar contenido
Al consultar la base de datos aprenderás el nombre de las columnas, luego podrás insertar datos en la BD:
Nota que en la inserción y actualización 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 sencillo 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: --selección y --proyección:
Puedes intentar abusar de estos parámetros para probar las inyecciones SQL:
Descubrimiento automático de inyección SQL por Drozer
Proveedores de contenido respaldados por el sistema de archivos
Los proveedores de contenido también podrían ser utilizados para acceder a archivos:
Leer un archivo
Puedes leer archivos desde el Proveedor de Contenido
Traversing de Ruta
Si puedes acceder a archivos, puedes intentar abusar de un Traversal de Ruta (en este caso no es necesario, pero puedes intentar usar "../" y trucos similares).
Descubrimiento automático de Traversal de Ruta por Drozer
Referencias
Última actualización