Skip to main content
CriticalProtected by PowerWAF

Inyección SQL (SQLi)

CategoríaInyecciónOWASPA03:2021 – InyecciónPrimera aparición1998Tiempo de lectura8 minVerificado2026-02-15
DEFINICIÓN

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.

1

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.

2

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.

3

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.

4

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

2017

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.

2008

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.

2015

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 Query (DO NOT USE)
-- 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 = '';
Secure: Parameterized Query (Python)
import psycopg2

# SAFE: parameterized query
cursor.execute(
"SELECT * FROM users WHERE username = %s AND password = %s",
(username, hashed_password)
)
Secure: Prepared Statement (Node.js)
// 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

Preguntas Frecuentes

La inyección SQL ataca la base de datos del servidor insertando SQL malicioso en las consultas. XSS (Cross-Site Scripting) ataca a los usuarios del navegador inyectando JavaScript malicioso en las páginas web. SQLi compromete datos del lado del servidor; XSS compromete sesiones del lado del cliente.
Sí. Las consultas parametrizadas (sentencias preparadas) son la defensa más efectiva. Separan el código SQL de los datos, haciendo imposible que la entrada del usuario altere la estructura de la consulta. Todos los frameworks modernos las soportan nativamente.
La inyección SQL ciega ocurre cuando la aplicación no muestra errores de base de datos pero aún es vulnerable. El atacante infiere información haciendo preguntas verdadero/falso (boolean-based) o midiendo tiempos de respuesta (time-based), extrayendo datos un bit a la vez.