Una inyección SQL (SQLi) se encuentra entre los tipos de ciberataques más predecibles y fáciles de defender. Desafortunadamente, las inyecciones SQL también se encuentran entre las tácticas de ciberdelincuencia más efectivas, principalmente porque son fáciles de realizar y muchas empresas no implementan las contramedidas necesarias.
Una inyección SQL también tiene consecuencias devastadoras (brechas de datos, intrusos que obtienen acceso de root, uso indebido de cuentas, etc.), razón por la cual la prevención de inyecciones debe estar en la parte superior de su lista de tareas de ciberseguridad.
Este artículo lo guiará a través de todo lo que un equipo de seguridad debe saber sobre las inyecciones SQL. Explicaremos qué es la inyección SQL, mostraremos las diferentes tácticas que utilizan los piratas informáticos para explotar fallas relacionadas con SQL y presentaremos las formas más efectivas de proteger una base de datos de intentos de SQLi.
¿Qué es la inyección SQL?

Una inyección SQL (SQLi) es un ciberataque en el que alguien inyecta instrucciones SQL maliciosas en una aplicación para comprometer archivos dentro de la base de datos asociada. Los delincuentes utilizan SQLi para atacar aplicaciones y sitios web que se basan en una base de datos SQL (es decir, MySQL, Oracle, PostgreSQL, Microsoft SQL Server, etc.).
Las inyecciones SQL suelen producirse debido a una validación de entrada deficiente y a la falta de parametrización adecuada en las aplicaciones basadas en SQL. Los atacantes explotan estas fallas para engañar a la aplicación para que ejecute comandos no deseados en el servidor de bases de datos, lo que permite a los piratas informáticos:
- Acceder a datos.
- Extraer archivos.
- Eliminar o modificar datos.
La mayoría de las vulnerabilidades SQLi surgen en la cláusula WHERE de una consulta SELECT. Sin embargo, una falla puede ocurrir en cualquier ubicación dentro de la consulta. Otras ubicaciones comunes donde surgen fallas SQLi son:
- Instrucciones INSERT (dentro de los valores insertados).
- Instrucciones SELECT (dentro de los nombres de tablas/columnas o la cláusula ORDER BY).
- Instrucciones UPDATE (dentro de los valores actualizados o la cláusula WHERE).
Si hay una falla explotable en la base de datos, una inyección SQL es fácil de realizar incluso para un pirata informático novato. Los atacantes suelen encontrar objetivos vulnerables utilizando búsquedas avanzadas en Google (el llamado Google Dorking) y luego alimentan las URL encontradas a un bot automatizado que realiza inyecciones.
A pesar de esta simplicidad, algunas de las marcas más grandes del mundo han sido víctimas de inyecciones SQL en los últimos años (LinkedIn, Target, Yahoo, Equifax, 7-Eleven, Epic Games, Zappos, TalkTalk, Sony Pictures, etc.).
Estadísticas de inyección SQL
Aquí hay algunas estadísticas recientes que debe conocer sobre las inyecciones SQL:
- En 2022, se agregaron 1162 nuevas vulnerabilidades SQLi a CVE (Common Vulnerabilities and Exposures), la base de datos de información públicamente divulgada sobre problemas de seguridad.
- Las bases de datos SQL fueron la principal fuente de vulnerabilidades de aplicaciones web en 2022, representando alrededor del 33% de todas las fallas.
- Dos de cada tres ataques web incluyen un intento de inyectar un comando SQL malicioso.
- Los expertos en seguridad sospechan que el 21% de las organizaciones actualmente tienen una vulnerabilidad explotable relacionada con SQL.
- En 2022, alrededor del 42% de todos los intentos de piratería en sistemas públicos fueron inyecciones SQL. La amenaza se extiende a los sistemas internos, pero en menor medida (aproximadamente el 12%).
- Las investigaciones sugieren que un 35% récord de instituciones educativas tiene una vulnerabilidad SQLi explotable.
Posibles consecuencias de la inyección SQL
Las inyecciones SQL a menudo tienen consecuencias graves y de gran alcance para las organizaciones que son víctimas de estos ataques. Esto es lo que los actores maliciosos pueden lograr con una inyección SQL:
- Analizar la base de datos y obtener información sobre su versión y estructura, información que resulta valiosa en futuros ataques (por ejemplo, una carga útil de ransomware destinada a cifrar archivos específicos en una base de datos).
- Recuperar datos confidenciales de la base de datos (por ejemplo, nombres de usuario, contraseñas, direcciones de correo electrónico, detalles de tarjetas de crédito, etc.).
- Modificar, insertar o eliminar archivos dentro de la base de datos, causando corrupción y pérdida de integridad de los datos.
- Obstruir la lógica de una aplicación.
- Explotar los recursos del servidor y causar degradación del rendimiento o fallas.
- Omitir el mecanismo de autenticación y obtener acceso a una cuenta sin conocer las credenciales.
- Escalar privilegios y obtener acceso al servidor subyacente.
- Interferir con las operaciones comerciales normales y causar tiempo de inactividad, pérdida de ingresos e insatisfacción del cliente.
- Utilizar el servidor subyacente para lanzar un ataque DDoS.
- Implementar malware o configurar recursos para brechas más avanzadas (por ejemplo, un ataque APT).
Dependiendo de la naturaleza de los datos vulnerados y las leyes aplicables, una inyección SQL también puede dar lugar a acciones legales y sanciones regulatorias.
¿Cómo funciona la inyección SQL?
Una inyección SQL se produce cuando un pirata informático envía consultas SQL maliciosas (solicitudes para realizar alguna acción en una base de datos de aplicaciones) a un sitio web o servicio basado en web a través de un formulario o cuadro de búsqueda. Un atacante envía una entrada especialmente diseñada que incluye código SQL junto con datos legítimos. De esa manera, un pirata informático engaña a la aplicación para que ejecute comandos SQL no deseados.
Por ejemplo, una aplicación basada en web tiene un formulario de inicio de sesión con dos campos, uno para nombres de usuario y otro para contraseñas. La aplicación construye la siguiente consulta SQL para verificar la validez de las credenciales cuando alguien envía una entrada:
SELECT * FROM users WHERE username = 'input_username' AND password = 'input_password';
Por lo tanto, cuando un usuario legítimo escribe “admin1” como nombre de usuario y “SuSIOP8f&)@^Sx2” como contraseña, se ejecuta la siguiente instrucción SQL en el servidor de la base de datos:
SELECT * FROM users WHERE username = 'admin1' AND password = 'SuSIOP8f&)@^Sx2';
Esta consulta luego autentica al usuario que proporcionó credenciales válidas. Sin embargo, un atacante podría ingresar lo siguiente en el campo de nombre de usuario:
' OR '1'='1
Una vez que la aplicación envía esta solicitud, la consulta se convierte en:
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = 'input_password';
Dado que ‘1’=’1′ siempre es verdadero, la consulta se convierte efectivamente en:
SELECT * FROM users WHERE username = '' OR true AND password = 'input_password';
Esta consulta manipulada permite a un atacante omitir la verificación de contraseña y obtener acceso no autorizado. La consulta devuelve todas las filas donde el nombre de usuario está vacío o es verdadero.
En la mayoría de los casos, no hay indicios de que alguien esté realizando inyecciones SQL en una base de datos. El único signo de un ataque es un número excesivo de solicitudes en un corto período de tiempo, una señal de alerta que a menudo pasa desapercibida por el equipo de seguridad.
Tipos de inyección SQL
Hay tres tipos principales de inyecciones SQL según la forma en que un atacante interactúa con la aplicación de destino y su base de datos: inyecciones SQL en banda, inferenciales y fuera de banda. Echemos un vistazo más de cerca a cada categoría.

Inyecciones SQL en banda
Las inyecciones SQL en banda se producen cuando un atacante utiliza el mismo canal de comunicación (es decir, banda) para lanzar el ataque y recopilar resultados. El actor malicioso envía código SQL manipulado, y la respuesta de la aplicación proporciona retroalimentación directa sobre el éxito del ataque.
Estas son las diferentes técnicas de inyección SQL en banda:
- Inyecciones SQL clásicas: un atacante inyecta código SQL malicioso en un campo de entrada para manipular la consulta de la base de datos. Las inyecciones clásicas son la opción ideal para omitir la autenticación o recuperar archivos de la base de datos.
- Inyecciones SQL basadas en errores: un pirata informático activa intencionalmente mensajes de error SQL para recopilar información sobre el esquema o el contenido de la base de datos.
- Inyecciones SQL basadas en unión: un atacante utiliza el operador UNION SQL para combinar los resultados de la consulta original con los resultados de otra consulta. De esa manera, un atacante recupera datos de otras tablas de la base de datos.
- Inyecciones SQL de segundo orden: un actor malicioso no ejecuta la entrada, sino que la almacena en una base de datos. La entrada almacenada se activa en una nueva consulta SQL cuando un usuario accede a alguna funcionalidad específica de la aplicación.
Las tácticas en banda son el tipo más común de inyección SQL. Estos ataques también son más fáciles de realizar que otras SQLi inferenciales o fuera de banda.
Inyecciones SQL inferenciales (Blind SQLi)
Las inyecciones SQL inferenciales ocurren cuando un atacante envía código SQL malicioso pero no recibe retroalimentación directa de la aplicación de destino. En cambio, el atacante infiere información del comportamiento del servidor (de ahí el término “SQLi ciega”).
Hay dos tipos distintos de inyecciones SQL inferenciales:
- Inyecciones SQL ciegas basadas en tiempo: un pirata informático utiliza retrasos en las consultas SQL para medir las respuestas de la aplicación e inferir información sobre la base de datos. Por ejemplo, un pirata informático podría usar una consulta SQL para ordenar un retraso de tres segundos si la primera letra del nombre de la primera base de datos es A. Si la respuesta tarda tres segundos, el atacante sabe que la consulta es válida.
- Inyecciones SQL ciegas basadas en booleanos: un atacante envía una serie de preguntas de sí o no basadas en booleanos a la base de datos de la aplicación web. El pirata informático observa el comportamiento de la aplicación y recopila gradualmente información sobre la estructura y el contenido de la base de datos.
Una inyección SQL inferencial es una opción común para alguien que intenta asignar la estructura de la base de datos.
Inyecciones SQL fuera de banda
Las inyecciones SQL fuera de banda se producen cuando alguien envía código SQL malicioso a la aplicación de destino y la engaña para que envíe datos a un punto final remoto controlado por el atacante. Estas son las técnicas de inyección SQL fuera de banda más comunes:
- Inyecciones SQL XML: si una aplicación utiliza consultas XML para interactuar con una base de datos, un actor malicioso puede manipular los datos de entrada para inyectar código XML malicioso y alterar el comportamiento de la consulta.
- Inyecciones SQL basadas en montón: este tipo de inyección SQL se dirige al mecanismo de asignación de memoria de la aplicación. Un atacante inyecta una entrada maliciosa para interrumpir o corromper la memoria de la aplicación, causando fallas u obteniendo acceso no autorizado.
- Inyecciones de procedimientos almacenados: esta técnica se dirige a las aplicaciones que utilizan procedimientos almacenados para interactuar con la base de datos. Un atacante inyecta una entrada maliciosa en los parámetros del procedimiento para obtener acceso a los datos o manipularlos.
Las técnicas fuera de banda son el tipo menos común y más complejo de inyección SQL. Los piratas informáticos recurren a estos métodos si el servidor de destino es demasiado lento o inestable para las inyecciones SQL inferenciales o en banda (o en casos específicos en los que una aplicación bloquea o desinfecta ciertos tipos de respuestas).
Cómo prevenir la inyección SQL
A continuación, se muestran algunas de las formas más efectivas de garantizar que su base de datos nunca sea víctima de una inyección SQL.
Adoptar prácticas de codificación segura de bases de datos
Adopte prácticas y principios de codificación segura de bases de datos para garantizar que los desarrolladores escriban código resistente a las vulnerabilidades comunes relacionadas con SQL.
Aquí hay algunas prácticas que son muy efectivas para prevenir las inyecciones SQL:
- Validar y desinfectar todas las entradas del usuario.
- Permitir solo los formatos y caracteres de entrada esperados en sus formularios.
- Utilizar consultas parametrizadas e instrucciones preparadas al interactuar con bases de datos.
- Si las consultas parametrizadas o las instrucciones preparadas no son una opción, escape la entrada del usuario antes de incluirla en una consulta para convertir los caracteres potencialmente peligrosos en equivalentes seguros.
- Almacenar datos confidenciales (contraseñas, claves de API, tokens, etc.) en archivos de configuración seguros o variables de entorno en lugar de codificar datos en el código base.
- Evitar la construcción de consultas dinámicamente mediante la concatenación de cadenas.
- Utilizar la codificación de salida para garantizar que los datos se muestren como contenido y no como código ejecutable.
- Realizar revisiones de código de pares periódicas para identificar y corregir posibles vulnerabilidades.
Además, asegúrese de que los desarrolladores solo utilicen bibliotecas y marcos de seguridad bien establecidos que hayan sido revisados a fondo.
Utilizar un firewall de aplicaciones web (WAF)
Un firewall de aplicaciones web (WAF) filtra todo el tráfico entre la aplicación web y su base de datos. Los WAF analizan el tráfico entrante e inspeccionan los datos en busca de:
- Patrones de ataque conocidos.
- Anomalías.
- Comportamiento sospechoso.
Un WAF se basa en varias técnicas para identificar y bloquear solicitudes maliciosas (por ejemplo, detección basada en firmas, análisis de comportamiento, aprendizaje automático, etc.). Estos firewalls bloquean los intentos de inyección SQL en tiempo real antes de que lleguen a su código de base de datos.
Mantener el software actualizado
Las organizaciones deben mantener el software actualizado con los últimos parches de seguridad. Asegúrese de que los siguientes elementos tengan las últimas actualizaciones:
- Sistemas operativos.
- Servidores web.
- Sistemas de gestión de bases de datos (MySQL, PostgreSQL, Microsoft SQL Server, etc.).
- Sistemas de gestión de contenido (WordPress, Joomla, Drupal, etc.).
- Marcos de aplicaciones (Django, Ruby on Rails, Laravel, etc.).
- Firewalls.
- Navegadores web.
- Bibliotecas, marcos, complementos y extensiones de terceros.
- Bibliotecas de autenticación y autorización.
- Software del servidor (por ejemplo, SSH, FTP, herramientas de administración remota, etc.).
Además, si sus aplicaciones orientadas a la web se integran con API o servicios de terceros, asegúrese de que estén utilizando las últimas versiones de su software.
Nunca almacenar datos confidenciales en texto plano
El cifrado de datos valiosos garantiza que, incluso si un atacante logra extraer archivos con una inyección SQL, los datos robados permanecen ilegibles sin las claves de descifrado.
Implemente el cifrado tanto para datos en reposo (almacenados en la base de datos) como en tránsito (transferidos entre la aplicación y la base de datos). Recuerde que su estrategia de cifrado es tan buena como sus prácticas de gestión de claves, así que asegúrese de que su equipo sepa cómo mantener seguras las claves criptográficas.
Probar periódicamente las debilidades SQLi
Probar las vulnerabilidades de inyección SQL es una parte crítica de la prevención de ataques. Aquí hay algunas prácticas que valen la pena:
- Revise periódicamente su código fuente para identificar posibles vulnerabilidades de inyección SQL. Preste especial atención a las áreas donde las consultas utilizan directamente las entradas del usuario basadas en web.
- Experimente con las cargas útiles conocidas de inyección SQL para verificar la resistencia de su aplicación a las técnicas de ataque estándar.
- Manipule las entradas para activar errores de base de datos y analice si los mensajes revelan algo de valor.
- Utilice herramientas automatizadas de análisis de vulnerabilidades para identificar rápidamente fallas comunes.
- Realice pruebas tanto de caja blanca (con conocimiento del funcionamiento interno de la aplicación) como de caja negra (sin conocimiento interno).
- Siempre pruebe las entradas con caracteres especiales, palabras clave SQL y cargas útiles para garantizar una desinfección adecuada.
- Pruebe cómo su aplicación y base de datos manejan las consultas parametrizadas y las instrucciones preparadas.
- Inyecte consultas que causen retrasos en el servidor y observe las diferencias en el tiempo que tarda la aplicación en responder.
- Pruebe las inyecciones basadas en booleanos con consultas que se basan en condiciones verdadero/falso (por ejemplo, OR 1=1 y OR 1=2).
- Compruebe cómo responde su aplicación a las diferentes consultas UNION.
- Envíe el carácter de comilla simple en su campo de entrada y busque errores u otras anomalías.
- Envíe una carga útil OAST diseñada para activar una interacción de red fuera de banda cuando se ejecuta dentro de una consulta SQL. Luego, verifique si hay alguna interacción resultante.
Recuerde realizar pruebas de inyección SQL regularmente. Es una excelente idea realizar algunos chequeos cada vez que el equipo realiza cambios significativos en el código, actualizaciones o adiciones de funciones.
Garantizar un manejo seguro de errores
Nunca muestre mensajes de error detallados en el navegador web del cliente. En cambio, proporcione mensajes de error genéricos o ventanas emergentes fáciles de usar que no compartan información sobre el funcionamiento interno de su aplicación.
Las inyecciones SQL basadas en errores son una táctica popular para el reconocimiento del sistema, por lo que debe asegurarse de que un actor malicioso no pueda aprender nada útil al causar errores intencionalmente.
Capacitar en concientización sobre SQLi
Eduque a su equipo sobre los riesgos, las técnicas y las mejores prácticas relacionadas con las inyecciones SQL para mejorar su postura de seguridad. Organice sesiones de capacitación periódicas en ciberseguridad para todo el personal técnico (desarrolladores de software, control de calidad, administradores de sistemas, equipos de DevOps, etc.).
Una alta conciencia de las amenazas SQLi reduce la superficie de ataque general para las inyecciones. Los desarrolladores con conocimientos también tienen más probabilidades de escribir código seguro e identificar fallas en las primeras etapas del desarrollo.
Una empresa bien preparada nunca debería ser víctima de SQLi
Las inyecciones SQL son una técnica de piratería común con consecuencias a menudo graves. Por lo tanto, es vital proteger su negocio de esta amenaza. Afortunadamente, seguir las mejores prácticas y probar periódicamente las fallas es suficiente para contrarrestar el riesgo de SQLi. Configure las precauciones que se describen en este artículo y asegúrese de que sus bases de datos no sean vulnerables a las inyecciones SQL.
Pingback: Eliminando Vulnerabilidades: Cómo Proteger Web de Inyección SQL