Blog

Programadores que conquistan la seguridad: Comparte y aprende - Inyección SQL

December 6, 2018
Jaap Karan Singh

En términos sencillos, SQL (o Lenguaje de Consulta Estructurado) es el lenguaje utilizado para comunicarse con bases de datos relacionales; es el lenguaje de consulta que emplean los desarrolladores, administradores de bases de datos y aplicaciones para gestionar la enorme cantidad de datos que se generan cada día.

Nuestros datos se están convirtiendo rápidamente en uno de los productos más valiosos del mundo... y cuando algo es valioso, los delincuentes querrán hacerse con ello para su propio beneficio.

Los atacantes utilizan la inyección SQL —una de las vulnerabilidades de datos más antiguas (desde 1998!) y persistentes que existen— para robar y modificar información confidencial en millones de bases de datos de todo el mundo. Es insidioso, y los desarrolladores deben entender la inyección SQL (así como la forma de defenderse de ella) si queremos mantener nuestros datos a salvo.

Con ese fin, analizaremos tres aspectos clave de la inyección SQL:

  • Cómo funciona
  • Por qué es tan peligrosa
  • Cómo defenderse de ella

Entender la inyección SQL

La inyección SQL puede entenderse mediante una sola palabra: contexto.

Dentro de una aplicación existen dos contextos: uno para los datos y otro para el código. El contexto del código le indica al equipo qué ejecutar y lo separa de los datos que deben procesarse.

La inyección SQL ocurre cuando un atacante introduce datos que el intérprete SQL confunde con código.

Un ejemplo es un campo de entrada en un sitio web, donde un atacante introduce ‘’’ OR 1=1" y se añade al final de una consulta SQL. Cuando se ejecuta esta consulta, devuelve "verdadero" para cada fila de la base de datos. Esto significa que se devolverán todos los registros de la tabla consultada.

Las implicaciones de la inyección SQL pueden ser catastróficas. Si esto ocurre en una página de inicio de sesión, podría devolver todos los registros de usuario, incluyendo posiblemente nombres de usuario y contraseñas. Si una simple consulta para extraer datos tiene éxito, también lo tendrán las consultas para modificarlos.

Echemos un vistazo a algo de código vulnerable para que puedas ver cómo es una vulnerabilidad de inyección SQL en la práctica.

Observa este código:

String query = "SELECT account balance FROM user_data WHERE user_name = "
+ request.getParameter("customerName");
try {
   Statement statement = connection.createStatement( ... );
   ResultSet results = statement.executeQuery( query );
}

El código aquí simplemente añade la información del parámetro del cliente al final de la consulta SQL sin ninguna validación. Cuando esto sucede, un atacante puede introducir código en un campo de entrada o en los parámetros de la URL y este será ejecutado.

Lo fundamental no es que los atacantes solo puedan añadir ‘’’ OR 1=1" a cada consulta SELECT, sino que un atacante puede manipular cualquier tipo de consulta SQL (INSERT, UPDATE, DELETE, DROP, etc.) y ampliarla con cualquier cosa que la base de datos admita. Existen excelentes recursos y herramientas disponibles en el dominio público que muestran lo que es posible hacer.

Pronto aprenderemos a corregir este problema. Primero, entendamos cuánto daño puede causar.

Por qué la inyección SQL es tan peligrosa

Aquí hay solo tres ejemplos de brechas causadas por inyección SQL:

  • El sitio web de la Junta Electoral de Illinois sufrió una brecha debido a vulnerabilidades de inyección SQL. Los atacantes robaron los datos personales de 200,000 ciudadanos estadounidenses. La naturaleza de la vulnerabilidad encontrada significaba que los atacantes también podrían haber modificado los datos, aunque no lo hicieron.
  • Hetzner, una empresa de alojamiento web sudafricana, sufrió una brecha que afectó a 40,000 registros de clientes. Una vulnerabilidad de inyección SQL permitió el posible robo de todos los registros de clientes en su base de datos.
  • Un proveedor de servicios financieros católicos en Minnesota, Estados Unidos, sufrió una brecha mediante inyección SQL. Se robaron detalles de cuentas, incluidos números de cuenta, de casi 130,000 clientes.

Los datos confidenciales pueden utilizarse para tomar el control de cuentas, restablecer contraseñas, robar dinero o cometer fraudes.

Incluso la información que no se considera confidencial o de identificación personal puede utilizarse para otros ataques. La información de la dirección o los últimos cuatro dígitos de su número de identificación gubernamental pueden usarse para suplantar su identidad ante empresas o restablecer su contraseña.

Cuando un ataque tiene éxito, los clientes pueden perder la confianza en la empresa. Recuperarse de los daños a los sistemas o de las multas regulatorias puede costar millones de dólares.

Pero no tiene por qué terminar así para usted.

Derrote la inyección SQL

La inyección SQL puede evitarse etiquetando claramente las partes de su aplicación, de modo que el equipo sepa si una parte determinada es un dato o código que debe ejecutarse. Esto se puede lograr mediante consultas parametrizadas.

Cuando las consultas SQL utilizan parámetros, el intérprete SQL utilizará el parámetro únicamente como dato. No lo ejecuta como código.

Por ejemplo, un ataque como "OR 1=1" no funcionará. La base de datos buscará la cadena "OR 1=1" y no la encontrará en la base de datos. Simplemente se encogerá de hombros y dirá: "Lo siento, no puedo encontrar eso para usted".

Un ejemplo de una consulta parametrizada en Java se ve así:

Code example showing use of parameterized SQL queries to securely insert user data.

La mayoría de los marcos de desarrollo proporcionan defensas integradas contra la inyección SQL.

Los mapeadores objeto-relacionales (ORM), como Entity Framework en la familia .NET, parametrizarán las consultas de forma predeterminada. Esto se encargará de la inyección SQL sin ningún esfuerzo por su parte.

Sin embargo, debe saber cómo funciona su ORM específico. Por ejemplo, Hibernate, un ORM popular en el mundo Java, aún puede ser vulnerable a la inyección SQL si se utiliza incorrectamente.

La parametrización de consultas es la primera y mejor defensa, pero existen otras. Los procedimientos almacenados también admiten parámetros SQL y pueden utilizarse para evitar la inyección SQL. Tenga en cuenta que los procedimientos almacenados también deben estar creados correctamente para que esto funcione.

// Esto REALMENTE debería validarse también
String custname = request.getParameter("customerName");
// realizar validación de entrada para detectar ataques
String query = "SELECT account_balance FROM user_data WHERE user_name = ? ";

PreparedStatement pstmt = connection.preparedStatement( query );
pstmt.setString(1, custname);
ResultSet results = pstmt.executeQuery( );

Valide y sanee siempre sus entradas. Dado que algunos caracteres, como "OR 1=1", no serán ingresados por un usuario legítimo de su aplicación, no hay necesidad de permitirlos. Puede mostrar un mensaje de error al usuario o eliminarlos de su entrada antes de procesarla.

Dicho esto, no dependa únicamente de la validación y el saneamiento para protegerse. Personas ingeniosas han encontrado formas de evitarlos. Son buenas estrategias de Defensa en Profundidad (DiD), pero la parametrización es la forma segura de cubrir todas las bases.

Otra buena estrategia de DiD es utilizar el "principio de menor privilegio" dentro de la base de datos y crear listas blancas de entrada. Aplicar el menor privilegio significa que su aplicación no tiene poder ilimitado dentro de la base de datos. Si un atacante lograra obtener acceso, el daño que puede causar es limitado.

OWASP ofrece una excelente hoja de referencia sobre inyección SQL que muestra cómo gestionar esta vulnerabilidad en diversos lenguajes y plataformas... pero si quieres ir un paso más allá, puedes participar en un desafío de inyección SQL en tu lenguaje preferido en nuestra plataforma ahora mismo; aquí tienes algunos de los más populares para empezar:

Inyección SQL en C#

Inyección SQL en Node.js

Inyección SQL en Python Django

Inyección SQL en Java Spring

El viaje comienza

Has avanzado mucho en la comprensión de la inyección SQL y los pasos necesarios para solucionarla. ¡Genial!

Hemos analizado cómo se produce la inyección SQL; normalmente, un atacante utiliza datos de entrada para controlar las consultas de tu base de datos con fines malintencionados.

También hemos visto los daños causados por la explotación de vulnerabilidades de inyección SQL: cuentas comprometidas y millones de dólares perdidos... una pesadilla, y además muy costosa.

Hemos visto cómo prevenir la inyección SQL:

  • Parametrización de consultas
  • Uso de mapeadores objeto-relacional y procedimientos almacenados
  • Validación y creación de listas blancas de entradas de usuario

Ahora te toca a ti. La práctica es la mejor forma de seguir aprendiendo y alcanzar la maestría, así que ¿por qué no echas un vistazo a nuestros recursos de aprendizaje sobre inyección SQL y pruebas nuestra demo gratuita de la plataforma? Estarás en camino de convertirte en un Secure Code Warrior.

Eslogan

Controle el desarrollo impulsado por IA antes de su lanzamiento

Mida el riesgo asistido por IA, aplique políticas de codificación segura en el momento de la confirmación y acelere la entrega segura en todo su ciclo de vida de desarrollo de software (SDLC).

Reservar una demostración
Biblioteca de recursos

Explorar más blogs

Acceda a contenido especializado sobre programación segura, gobernanza de IA y gestión de riesgos de software.

ver todo
Caso de estudio
Etiqueta de filtro
Este es un texto dentro de un bloque div.

Una cultura de seguridad: cómo Sage creó su programa de defensores

Descubre cómo Sage reforzó su seguridad con un enfoque flexible y centrado en las relaciones, logrando formar a más de 200 expertos en seguridad y alcanzar una reducción de riesgos cuantificable.

Más información
Icono de ventana de navegador con las letras KVK en negrita y dos líneas horizontales azules debajo sobre un fondo azul degradado.
Caso de estudio
Etiqueta de filtro
Este es un texto dentro de un bloque div.

Kamer van Koophandel: Seguridad a escala impulsada por los desarrolladores

La Cámara de Comercio (Kamer van Koophandel) comparte cómo integró la programación segura en el desarrollo diario mediante certificaciones basadas en roles, evaluaciones comparativas de puntuación de confianza y una cultura de responsabilidad compartida en seguridad.

Más información
Logotipo de Insurance Australia Group con texto y un icono en azul y gris dentro del diseño de una ventana de navegador web.
Caso de estudio
Etiqueta de filtro
Este es un texto dentro de un bloque div.

Cómo un «Juego de Códigos» guía a IAG Group hacia un futuro de programación más seguro

IAG Group es la entidad detrás de muchas de las principales compañías de seguros en la región de Asia-Pacífico, que suscribe pólizas para millones de clientes por un valor aproximado de 11.400 millones de dólares australianos en primas anuales.

Más información
Blog
Etiqueta de filtro
Este es un texto dentro de un bloque div.

Mes de la Concienciación sobre Ciberseguridad 2026: Comprender la seguridad de la IA es fundamental para la defensa empresarial

Hemos llegado a un punto en el que la mayoría de las principales empresas de IA han pedido públicamente una ralentización global en el desarrollo de la IA para que las medidas de seguridad puedan ponerse al día, pero la verdad es que ya se han materializado graves problemas de seguridad. Esto deja a innumerables líderes de seguridad y equipos ejecutivos en una situación urgente, a medida que los costes monetarios y de riesgo de la implementación de la IA siguen acumulándose.

Más información
Blog
Etiqueta de filtro
Este es un texto dentro de un bloque div.

Habilitador 8: Branding de su programa

Un programa de codificación segura necesita algo más que un buen contenido para tener éxito. El Habilitador 8 muestra cómo el branding transforma la participación en una experiencia codiciada basada en el estatus.

Más información
Blog
Etiqueta de filtro
Este es un texto dentro de un bloque div.

Cada empleado está ahora en la primera línea de la ciberseguridad de la IA

El panorama tecnológico empresarial está cambiando a una velocidad que pocos previeron hasta que fue demasiado tarde. Hemos cruzado oficialmente el umbral del código escrito por humanos y la asistencia básica de copilotos hacia la era del Ciclo de Vida de Desarrollo Agéntico (ADLC). Si bien los agentes de IA autónomos prometen una eficiencia sin precedentes en múltiples funciones, también traen consigo una clase completamente nueva de riesgos regulatorios y de seguridad.

Más información

Proteja el desarrollo basado en IA antes de su lanzamiento

Identifique riesgos de desarrollo, aplique políticas y prevenga vulnerabilidades en todo el ciclo de vida de su software.

Reservar una demostración
No se encontraron elementos.