Introducción a la Inyección SQL (SQLi)

Introducción

La mayoría de las aplicaciones web actuales utilizan bases de datos para almacenar información: usuarios, contenido, configuraciones, etc.
Para ser dinámicas, las aplicaciones envían consultas SQL al back-end cada vez que un usuario realiza una acción.
Cuando parte de esa consulta incluye datos proporcionados por el usuario, aparece el riesgo de inyección SQL (SQLi).


🏗️ 🔄 ¿Cómo funciona una aplicación con Base de Datos?

Arquitectura típica

Usuario → Aplicación Web → Servidor → Base de Datos (MySQL en este módulo)

La aplicación toma valores ingresados por el usuario (formularios, parámetros GET, cookies…) y los inserta en consultas SQL como:

SELECT * FROM usuarios WHERE nombre = '$usuario';

Si la entrada no está sanitizada, un atacante puede modificar la consulta real.


💉🔥 ¿Qué es una Inyección SQL?

Definición rápida

SQLi es cuando un atacante puede inyectar código SQL malicioso en una consulta legítima, alterando su funcionamiento.

Lo típico es romper la estructura original con:

'
"
)
y después escribir SQL adicional.

Ejemplo simple:

Entrada maliciosa:

' OR 1=1 --

Consulta resultante:

SELECT * FROM usuarios WHERE nombre='' OR 1=1 --';

→ Resultado: inicio de sesión sin credenciales válidas.


🧨⚙️ ¿Qué puede lograr un atacante con SQLi?

Impacto potencial

SQLi es una de las vulnerabilidades más peligrosas en aplicaciones web.

Usos comunes:

SQLi → puede llevar directamente a compromiso total de la aplicación y del servidor.


🧠📌 Técnicas comunes de SQLi

Principales formas de explotación:
  1. Escapar comillas (') para salir de la entrada y escribir SQL

  2. UNION-based SQLi → combinar varias consultas

  3. Boolean-based SQLi → true/false para extraer información

  4. Error-based SQLi → usar errores del servidor para ver datos

  5. Time-based SQLi → inferir datos mediante retrasos (sleep)

  6. Stacked queries → ejecutar varias consultas (si MySQL y servidor lo permiten)


🔐🛡️ Prevención de SQLi

Buenas prácticas esenciales:

✔ Validar y sanitizar entradas
✔ Usar consultas preparadas y sentencias parametrizadas
✔ Evitar concatenación de strings en SQL
✔ Dar mínimos privilegios a la base de datos del back-end
✔ Filtrar caracteres especiales
✔ Deshabilitar errores SQL en producción
✔ Escapar correctamente datos dinámicos
✔ WAF opcionales para mitigación adicional

Las aplicaciones vulnerables suelen fallar en una o varias de estas medidas.


📚 Cierre

La Inyección SQL es una vulnerabilidad grave pero simple de entender:
ocurre cuando el servidor confía demasiado en lo que el usuario envía.

Dominar SQLi es esencial para: