Inyección SQL (SQLi)
La inyección SQL es una técnica de ataque que explota vulnerabilidades en la capa de base de datos de una aplicación web. Un atacante inserta o "inyecta" código SQL malicioso en los campos de entrada que la aplicación pasa a su base de datos, permitiendo acceso no autorizado a datos, modificación de registros o incluso control total del servidor de base de datos.
Cómo Funciona Inyección SQL (SQLi)
La inyección SQL funciona cuando una aplicación incorpora datos proporcionados por el usuario directamente en consultas SQL sin la validación o sanitización adecuada. El atacante elabora entradas que alteran la estructura de la consulta prevista, convirtiendo una consulta de lectura de datos en una que extrae, modifica o elimina información.
Identificar puntos de inyección
El atacante busca campos de entrada — formularios de inicio de sesión, barras de búsqueda, parámetros de URL, valores de cookies — que interactúan con la base de datos. Cada campo que influye en una consulta SQL es un objetivo potencial.
Probar la vulnerabilidad
Se insertan caracteres especiales de SQL (comillas simples, comentarios dobles) para provocar errores de base de datos. Un error como 'You have an error in your SQL syntax' confirma que la entrada llega directamente a las consultas SQL.
Elaborar la carga maliciosa
El atacante construye sentencias SQL que se ejecutan junto con la consulta original. Por ejemplo: ' OR '1'='1 omite la autenticación, UNION SELECT extrae datos de otras tablas, y consultas apiladas pueden modificar o eliminar datos.
Extraer o manipular datos
Usando técnicas como UNION-based, error-based, o blind SQLi, el atacante extrae sistemáticamente credenciales, información personal, registros financieros o el esquema completo de la base de datos.
Ejemplos Reales
Brecha de Equifax
Una de las mayores brechas de datos de la historia expuso información personal de 147 millones de personas, incluyendo números de Seguro Social, fechas de nacimiento y direcciones. La brecha se originó por una vulnerabilidad de inyección en Apache Struts.
Hackeo de Heartland Payment Systems
La inyección SQL permitió a los atacantes instalar software de captura en los sistemas de procesamiento de pagos, comprometiendo 130 millones de números de tarjetas de crédito. El incidente costó a Heartland más de $140 millones.
Brecha de TalkTalk Telecom
Los atacantes explotaron inyección SQL para robar datos personales de 157,000 clientes, incluyendo información bancaria. TalkTalk fue multada con £400,000 por el ICO del Reino Unido y perdió 101,000 clientes.
Impacto y Evaluación de Riesgo
La inyección SQL puede comprometer toda la capa de datos de una aplicación. Los atacantes pueden eludir la autenticación, extraer bases de datos completas, modificar o eliminar registros, y en algunos casos ejecutar comandos del sistema operativo. Es consistentemente clasificada entre las vulnerabilidades web más críticas porque afecta directamente la confidencialidad, integridad y disponibilidad de los datos.
Cómo Detectar Inyección SQL (SQLi)
Monitorear consultas de base de datos en busca de patrones inesperados: sentencias UNION, comentarios SQL (-- o /*), funciones como SLEEP() o BENCHMARK(). Analizar logs del WAF en busca de cargas típicas de SQLi. Usar herramientas de pruebas de seguridad de aplicaciones (SAST/DAST) durante el desarrollo. Implementar alertas para errores de base de datos originados desde puntos de acceso web.
Cómo Prevenir Inyección SQL (SQLi)
Usar consultas parametrizadas (sentencias preparadas) para todas las interacciones con la base de datos — esta es la defensa principal. Implementar procedimientos almacenados como capa adicional. Aplicar validación de entrada con listas blancas de caracteres permitidos. Desplegar un WAF con conjuntos de reglas de inyección SQL. Aplicar privilegios mínimos en las cuentas de base de datos. Escapar la entrada del usuario al construir consultas dinámicas como último recurso.
Ejemplos de Código
-- Vulnerable: user input concatenated directly
query = "SELECT * FROM users
WHERE username = '" + userInput + "'
AND password = '" + passInput + "'";
-- Attacker input: ' OR '1'='1' --
-- Resulting query:
SELECT * FROM users
WHERE username = '' OR '1'='1' --'
AND password = '';
import psycopg2
# SAFE: parameterized query
cursor.execute(
"SELECT * FROM users WHERE username = %s AND password = %s",
(username, hashed_password)
)
// SAFE: using parameterized query with pg
const result = await pool.query(
'SELECT * FROM users WHERE username = $1 AND password = $2',
[username, hashedPassword]
);
PowerWAF bloquea automáticamente Inyección SQL (SQLi) antes de que llegue a tu servidor.
Implementa en minutos. Sin cambios de código. Plan gratuito disponible.
Los cupos del plan gratuito son limitados