Introducción a la Inyección SQL (SQLi)
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?
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?
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?
SQLi es una de las vulnerabilidades más peligrosas en aplicaciones web.
Usos comunes:
-
Acceder a información sensible (usuarios, contraseñas, tarjetas, correos, logs)
-
Saltar autenticación sin conocer usuario/contraseña
-
Acceder a paneles de administración
-
Leer y escribir archivos en el servidor
-
Insertar webshells → control total del servidor
-
Escalada de privilegios en la base de datos
-
Descargar o modificar toda la base de datos
SQLi → puede llevar directamente a compromiso total de la aplicación y del servidor.
🧠📌 Técnicas comunes de SQLi
-
Escapar comillas (') para salir de la entrada y escribir SQL
-
UNION-based SQLi → combinar varias consultas
-
Boolean-based SQLi → true/false para extraer información
-
Error-based SQLi → usar errores del servidor para ver datos
-
Time-based SQLi → inferir datos mediante retrasos (sleep)
-
Stacked queries → ejecutar varias consultas (si MySQL y servidor lo permiten)
🔐🛡️ Prevención de SQLi
✔ 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:
-
Pentesting
-
Bug bounty
-
Seguridad web
-
Auditorías de código
-
Desarrollo seguro