Inyección SQL (SQLi)
Quick Definition
Una técnica de ataque que explota vulnerabilidades en la capa de base de datos de una aplicación insertando código SQL malicioso en las consultas.
¿Qué es Inyección SQL?
La Inyección SQL (SQLi) es una de las vulnerabilidades de aplicaciones web más antiguas y peligrosas. Ocurre cuando un atacante es capaz de insertar o "inyectar" código SQL malicioso en una consulta que una aplicación envía a su base de datos. Esto sucede cuando la entrada del usuario se filtra incorrectamente o no está correctamente parametrizada.
Los ataques de inyección SQL pueden:
- Evadir autenticación para obtener acceso no autorizado
- Leer datos sensibles de la base de datos
- Modificar o eliminar datos
- Ejecutar operaciones administrativas en la base de datos
- En algunos casos, ejecutar comandos en el sistema operativo
Hay varios tipos de inyección SQL:
- SQLi In-band: El atacante usa el mismo canal para lanzar el ataque y recopilar resultados (basado en error, basado en UNION)
- SQLi Ciego: Sin mensajes de error visibles; el atacante infiere datos basándose en el comportamiento de la aplicación
- SQLi Out-of-band: Los datos se recuperan usando canales diferentes (DNS, peticiones HTTP)
Ejemplos
Considere un formulario de login donde la consulta del backend es:
SELECT * FROM usuarios WHERE usuario='$user' AND password='$pass' Un atacante ingresando admin'-- como nombre de usuario convertiría la consulta en:
SELECT * FROM usuarios WHERE usuario='admin'--' AND password='...' El -- comenta el resto de la consulta, permitiendo login sin contraseña.
Preguntas Frecuentes
¿Cómo protegen los WAF contra la inyección SQL?
Los WAF usan coincidencia de patrones y detección basada en firmas para identificar intentos de inyección SQL en peticiones HTTP. Buscan palabras clave SQL sospechosas, caracteres especiales y patrones de ataque conocidos en cadenas de consulta, datos de formularios y encabezados. Los WAF avanzados también usan análisis de comportamiento para detectar ataques novedosos.
¿Son las consultas parametrizadas suficientes para prevenir la inyección SQL?
Las consultas parametrizadas (prepared statements) son la defensa más efectiva contra la inyección SQL a nivel de aplicación. Sin embargo, los WAF proporcionan defensa en profundidad atrapando ataques en el borde, protegiendo aplicaciones legacy, y proporcionando protección mientras se parchea el código.