Inyección SQL: qué es, ejemplos y cómo evitarla
La inyección SQL es una de las fallas más viejas de la web y sigue siendo una de las más graves: permite que un atacante lea, modifique o borre la base de datos de un sitio a través de un simple formulario. Clientes, pedidos, claves: todo lo que guarda la base queda expuesto. Le explicamos qué es, cómo funciona con ejemplos simples, qué tipos existen y cómo evitarla.
¿Prefiere que lo revisemos nosotros? Diagnóstico gratis, sin claves.
¿Consulta urgente? Escríbanos por WhatsApp al 095 283 123
Qué es la inyección SQL
Casi todos los sitios dinámicos guardan su información en una base de datos y la consultan con un lenguaje llamado SQL. Cuando un visitante busca un producto o inicia sesión, el sitio arma una consulta SQL con lo que escribió.
La inyección SQL ocurre cuando el sitio pega el texto del usuario directamente dentro de la consulta, sin separarlo. Si el atacante escribe algo que tiene sentido para la base de datos, puede cambiar lo que hace la consulta: en lugar de buscar un producto, pedir todos los usuarios con sus claves.
Forma parte de la categoría «Inyección» del OWASP Top 10, la misma que el XSS.
Un ejemplo simple de inyección SQL
Imagine un formulario de inicio de sesión que arma esta consulta con lo que escribe el usuario:
SELECT * FROM usuarios WHERE usuario = 'TEXTO_USUARIO' AND clave = 'TEXTO_CLAVE'
Si el atacante escribe como usuario admin' --, la consulta queda así:
SELECT * FROM usuarios WHERE usuario = 'admin' --' AND clave = '...'
En SQL, -- significa «lo que sigue es un comentario». La parte que verificaba la clave desaparece, y el atacante entra como administrador sin conocer la clave.
Es el ejemplo clásico, pero la idea es la misma en un buscador, un filtro de productos o un parámetro de la dirección: cualquier lugar donde el texto del usuario termine dentro de una consulta.
¿Quiere saber qué tiene abierto su sitio?
Lo revisamos desde afuera, sin claves y sin instalar nada. Si no encontramos nada relevante, se lo decimos igual.
Qué puede hacer un atacante con una inyección SQL
Leer la base de datos completa
Clientes, correos, direcciones, pedidos y las claves de los usuarios (aunque estén cifradas, se pueden atacar fuera de línea).
Filtración de datosEntrar como administrador
Saltándose el inicio de sesión.
Modificar datos
Cambiar precios, crear usuarios administradores, insertar código malicioso en las páginas.
Borrar información
Tablas enteras.
En algunos casos, tomar el servidor
Según la configuración, leer archivos del servidor o ejecutar comandos.
Los tipos de inyección SQL
| Tipo | Cómo obtiene los datos | Dificultad para detectarla |
|---|---|---|
| Clásica (in-band) | El resultado aparece directamente en la página o en un mensaje de error | Baja: se ve a simple vista |
| Ciega por contenido (boolean-based) | Pregunta «sí o no» y deduce la respuesta según cómo cambia la página | Media |
| Ciega por tiempo (time-based) | Hace que la base tarde más o menos en responder según la respuesta | Alta: no hay ninguna diferencia visible |
| Fuera de banda (out-of-band) | Hace que la base mande los datos a un servidor del atacante | Alta |
Las inyecciones ciegas son las más comunes hoy, porque los sitios ya no muestran los errores de la base de datos. Las herramientas automáticas que usan los atacantes las explotan igual, consulta por consulta.
Inyección SQL en WordPress
El núcleo de WordPress usa consultas preparadas y no es vulnerable de por sí. Las inyecciones SQL que se publican aparecen en plugins y temas que arman consultas a mano, sobre todo en:
Filtros y buscadores personalizados
De tiendas, inmobiliarias o directorios.
Parámetros de ordenamiento y paginación
Que se pegan en la consulta.
Funciones AJAX
Que reciben datos sin validar y que, a veces, se pueden llamar sin iniciar sesión.
Cuando se publica una inyección SQL en un plugin popular, los bots empiezan a probarla en miles de sitios en cuestión de horas. Por eso la defensa más efectiva para el dueño de un sitio es actualizar rápido y tener un firewall que bloquee los intentos mientras tanto. → Actualizar WordPress sin romper el sitio · Qué es un WAF
Cómo evitar la inyección SQL
- 01
Usar consultas preparadas (parametrizadas)
La defensa principal: la consulta se escribe con marcadores y los datos del usuario se mandan por separado, de modo que la base nunca los interpreta como código. En PHP, con PDO o mysqli y sentencias preparadas. En WordPress, con
$wpdb->prepare(). - 02
Validar lo que entra
Si un campo espera un número, aceptar solo números. Si espera «asc» o «desc», aceptar solo esas dos palabras (una lista de valores permitidos).
- 03
Dar a la aplicación los permisos mínimos
El usuario con el que el sitio se conecta a la base de datos no necesita permisos para borrar tablas ni leer otras bases.
- 04
No mostrar los errores de la base de datos
Los mensajes de error detallados le dan pistas al atacante. En producción, se registran pero no se muestran.
- 05
Poner un firewall delante
Un WAF bloquea los patrones de inyección conocidos y gana tiempo mientras se corrige la falla.
- 06
Probar
Los escáneres detectan muchas inyecciones, pero las de lógica más compleja requieren pruebas manuales. → Pentest web
Cómo saber si su sitio fue atacado
Usuarios administradores que nadie creó
O claves que cambiaron solas.
Contenido o scripts insertados
En páginas y entradas.
Registros del servidor con pedidos extraños
Llenos de comillas,
UNION,SELECToSLEEPen los parámetros.Clientes que reciben phishing con datos que solo tenía su empresa
Si ve algo de esto, puede haber una filtración y una infección al mismo tiempo. → Limpieza de sitio hackeado · Cómo escanear WordPress en busca de malware
Para saber si los plugins de su sitio tienen inyecciones SQL publicadas, el análisis de vulnerabilidades compara todo lo que tiene instalado con las bases de fallas conocidas.
Servicios relacionados
Preguntas frecuentes
¿Qué es una inyección SQL?
Una falla que permite a un atacante meter instrucciones propias en las consultas que un sitio hace a su base de datos, para leer, modificar o borrar información.
¿Cómo se evita la inyección SQL?
Con consultas preparadas (parametrizadas), validación de los datos que entran, permisos mínimos en la base de datos y sin mostrar los errores en producción.
¿WordPress es vulnerable a la inyección SQL?
El núcleo no, porque usa consultas preparadas. Las fallas aparecen en plugins y temas que arman consultas a mano.
¿Qué es una inyección SQL ciega?
Una inyección en la que el sitio no muestra el resultado; el atacante deduce los datos por cómo cambia la página o por cuánto tarda en responder.
¿Un firewall evita la inyección SQL?
Bloquea muchos intentos conocidos y gana tiempo, pero la corrección definitiva es arreglar o actualizar el código vulnerable.
Más sobre ataques web
Tipos de malware que afectan a sitios web (y cómo reconocerlos)
Cuando se habla de "malware" se piensa en virus que infectan una computadora. Pero los sitios web tienen su propio catálogo de…
LeerQué es XSS (cross-site scripting) y cómo prevenirlo
El XSS es una de las fallas más comunes en sitios web: permite que un atacante haga ejecutar su propio código en…
LeerOWASP Top 10 (2025) explicado con ejemplos
El OWASP Top 10 es la lista de referencia de los riesgos de seguridad más críticos en aplicaciones web. La usan desarrolladores,…
Leer¿Sus plugins tienen fallas publicadas?
Lo revisamos desde afuera, sin claves, y le decimos qué está expuesto y qué conviene actualizar primero.
¿Consulta urgente? WhatsApp 095 283 123