SQL Injection: cómo funciona y cómo defender tus bases de datos
El SQL Injection (SQLi) sigue siendo una de las vulnerabilidades más críticas en aplicaciones que interactúan con bases de datos. Aunque es una técnica conocida desde hace décadas, los errores de validación, concatenación insegura y permisos laxos siguen exponiendo sistemas a ataques que pueden comprometer datos confidenciales.
Qué es SQL Injection
SQL Injection es una técnica por la que un atacante inserta fragmentos de SQL malicioso en la entrada de la aplicación para manipular las consultas que la aplicación ejecuta en la base de datos. Si la aplicación construye consultas concatenando cadenas sin sanitizar, el atacante puede alterar la lógica, extraer datos o incluso ejecutar comandos administrativos.
Ejemplo clásico (vulnerable)
# Pseudocódigo vulnerable
username = input('user')
query = "SELECT * FROM users WHERE username = '" + username + "'"
result = db.execute(query)
Si el atacante pasa como username: ' OR '1'='1, la consulta deviene en SELECT * FROM users WHERE username = '' OR '1'='1', que es probablemente verdadera y devuelve muchos registros.
Tipos de SQLi
- In-band (Error-based / Union-based): el atacante recibe la respuesta directamente por la misma conexión.
- Blind SQLi: no se retornan datos directamente, pero el atacante infiere información mediante respuestas booleanas o tiempos de respuesta.
- Out-of-band: el atacante provoca exfiltración por un canal alterno (DNS, HTTP callbacks).
Defensas efectivas (prácticas y técnicas)
A continuación las medidas que debes aplicar en tu stack de forma prioritaria:
1) Consultas preparadas (prepared statements) y parametrizadas
Evita concatenar strings. Las consultas parametrizadas separan el código SQL de los datos, impidiendo que la entrada cambie la estructura de la consulta.
# Ejemplo en Python (psycopg2)
cur.execute("SELECT * FROM users WHERE username = %s", (username,))
2) ORM y capas de abstracción
Un ORM bien configurado (Entity Framework, Hibernate, SQLAlchemy) usa consultas parametrizadas por defecto. Aun así, evita ejecutar SQL crudo con concatenación.
3) Validación y saneamiento de entradas
Valida tipos, longitud y formato. Para campos que deben ser numéricos, fuerza conversión y rechazo si no lo es. Para campos de texto, no trates de limpiar SQL; la parametrización es la defensa real.
4) Principio de mínimos privilegios
Usa cuentas de base de datos con los permisos mínimos necesarios (SELECT/INSERT/UPDATE/DELETE según corresponda). No conectes tu aplicación con una cuenta admin que pueda cambiar esquemas o acceder a tablas sensibles.
5) Escaneo y pruebas automatizadas
Incluye pruebas de seguridad en tu pipeline (SAST/DAST). Herramientas como sqlmap, Burp Suite o scanners automáticos ayudan a detectar vectores de inyección.
6) WAF y reglas de detección
Un Web Application Firewall (WAF) bien configurado puede bloquear patrones comunes de SQLi antes de que lleguen a la aplicación. No lo uses como única defensa, pero sí como capa adicional.
Buenas prácticas operativas
- Registra consultas sospechosas y establece alertas.
- Monitoriza cambios en esquemas y accesos a tablas críticas.
- Aplica parches y actualizaciones al motor de base de datos y al framework web.
- Haz revisiones periódicas de permisos y credenciales.
Qué hacer si detectas una inyección
- Bloquea la vector de entrada (WAF o reglas temporales).
- Investiga el alcance: qué datos fueron accedidos o modificados.
- Restaura desde backups si es necesario y revisa integridad.
- Implementa las medidas arriba (parametrización, least privilege).
Checklist rápido para desarrolladores
- ¿Usas consultas parametrizadas en todas las consultas que reciben input?
- ¿Tienes roles DB con permisos mínimos para la app?
- ¿Tu pipeline incluye tests de seguridad automatizados?
- ¿Tienes WAF y alertas sobre patrones anómalos?
Conclusión
SQL Injection es un riesgo real y evitable. Implementando prácticas de codificación segura, límites de permisos y tests automáticos reduces la probabilidad de explotación a prácticamente cero. Si tu entorno necesita una auditoría o una limpieza rápida para eliminar vectores de SQLi, podemos ayudarte a priorizar y remediar lo crítico en pocas horas.
¿Quieres que revise tu aplicación y genere el plan de remediación? Contáctanos y lo hacemos en una sesión técnica.