Inyecciones SQL (3/4). Operador LIKE; Explicación y PoC
En esta serie de 4 partes, estaré explicando los diferentes tipos de Inyecciones SQL que hay de una forma muy básica a nivel principiante, en la cual iremos aumentando la dificultad capitulo a capitulo.
Y hoy explicaremos el operador Like en las inyecciones SQL.
Pero, antes que nada. ¿Qué es una inyección SQL?
Una inyección SQL consiste en la inserción de código SQL por medio de los datos de entrada desde la parte del cliente hacia la aplicación. Es decir, por medio de la inserción de este código el atacante puede modificar las consultar originales que debe realizar la aplicación y ejecutar otras totalmente distintas con la intención de acceder a la herramienta, obtener información de alguna de las tablas o borrar los datos almacenados, entre otras muchas cosas.
Como consecuencias de estos ataques y dependiendo de los privilegios que tenga el usuario de la base de datos bajo el que se ejecutan las consultas, se podría acceder no sólo a las tablas relacionadas con la aplicación, sino también a otras tablas pertenecientes a otras bases de datos alojadas en ese mismo servidor.
o comentado anteriormente es posible gracias a que el uso de ciertos caracteres en los campos de entrada de información por parte del usuario, ya sea mediante el uso de los campos de los formularios que son enviados al servidor mediante POST o bien por medio de los datos enviados mediante GET en las urls de las páginas web, posibilitan coordinar varias consultas SQL o ignorar el resto de la consulta, permitiendo ejecutar la consulta que elija, de ahí que sea necesario realizar un filtrado de esos datos enviados para evitar problemas.
Así lo explique en un articulo anterior sobre Inyecciones SQL, con mayor detalle teórico.
¿Qué es el operado Like en las Inyecciones SQL?
El SQL Like es un tipo de operador lógico que se usa para poder determinar si una cadena de caracteres específica coincide con un patrón específico. Se utiliza normalmente en una sentencia Where para buscar un patrón específico de una columna.
Este operador puede ser de utilidad en los casos donde necesitamos realizar un apareamiento de patrones en vez de iguales o no iguales. El SQL Like se utiliza cuando se desea devolver la fila, si una cadena de caracteres específica coincide con un patrón específico. El patrón puede ser una combinación de caracteres regulares al igual que caracteres de comodín (*,%, ¿, etc.).
Para poder devolver una fila, los caracteres normales se deben hacer coincidir exactamente con los caracteres especificados en la cadena de caracteres. Los caracteres comodín pueden combinarse con partes arbitrarias de la cadena de caracteres.
PoC
El primer paso es identificar los parámetros que podrían usarse potencialmente en una consulta SQL para comunicarse con la base de datos subyacente. En este ejemplo, encontramos que el método «/home» obtiene datos mediante el nombre de la página y muestra el contenido.


Ahora veamos si podemos generar un error inyectando una comilla simple.

Al hacerlo, la sintaxis de la consulta SQL se vuelve incorrecta. Esto se debe a que la entrada proporcionada por el usuario se concatena directamente en la consulta SQL.
db.get( «SELECT UserName, email FROM users WHERE UserName LIKE ‘%» + username + «%’ ORDER BY UserId»
Necesitamos inyectar caracteres para que la consulta SQL sea sintácticamente correcta.
Después de eso, inyectamos un operador lógico que sea verdadero (como `and 1=1`). Esto debería hacer que la aplicación funcione como se espera, sin errores.

Ya que sabemos que la aplicación es vulnerable a inyecciones SQL, vamos a utilizar esta vulnerabilidad para leer información sensible de la base de datos. Este proceso podría automatizarse con herramientas como SQLMAP. Sin embargo, para este ejemplo, intentemos explotar la inyección SQL manualmente con el operador UNION el cual explique en el anterior articulo

Esta consulta da como resultado un error, y esto se debe a que la consulta original comenzó con dos columnas, usuario y email:

Observa cómo «usuario» y «email» se convirtieron en marcadores de posición para los datos que queremos recuperar de la base de datos.
Con esto hemos determinado el número de columnas que necesitamos, el siguiente paso es consultar las tablas del sistema para verificar qué tablas están almacenadas en la base de datos. A partir del mensaje de error en la primera imagen, podemos deducir que se está utilizando una base de datos SQLite. Dado que la aplicación no devolvió un error, nuestra suposición es correcta.

Vamos a descubrir los nombres de las tablas y las columnas de la tabla que queremos extraer. Dado que la aplicación solo muestra el primer resultado, debemos jugar con la cláusula SQL `LIMIT`.
La cláusula LIMIT se utiliza para restringir el número de filas que se devuelven en el resultado de una consulta. Esto es especialmente útil cuando quieres controlar la cantidad de datos que obtienes o cuando necesitas obtener resultados de manera paginada, es decir te permite controlar el tamaño del conjunto de resultados, lo que es útil para extraer datos de manera eficiente o para investigar la base de datos de forma más específica durante una inyección SQL.

Ahora tenemos toda la información necesaria para extraer datos de la tabla de usuarios.Utilizaremos la cláusula SQL `LIMIT` nuevamente para obtener credenciales de más usuarios.

