0%
Inicio 9 Glossary Item 9 SQL Injection
« Back to Glossary Index

Nivel Principiante

Imagina que tienes una página web con un formulario de inicio de sesión donde pones tu nombre de usuario y tu contraseña. Si alguien malintencionado en lugar de poner su nombre de usuario, pone un código especial, la página puede confundirlo y, en lugar de solo buscar su nombre de usuario, podría ejecutar una orden para, por ejemplo, dar acceso a todos o borrar toda tu base de datos. El SQL Injection es ese ataque: es como si alguien le diera una orden a tu base de datos a través de un formulario, engañándola para que haga algo que no debe hacer.

Nivel Intermedio

Una SQL Injection (Inyección SQL) es una vulnerabilidad de seguridad que ocurre cuando un atacante inserta una porción de código SQL malicioso en la entrada de datos de una aplicación, con la intención de manipular la consulta que se envía a la base de datos. Este tipo de ataque se aprovecha de las aplicaciones que construyen consultas SQL dinámicamente con datos no validados o sin sanear provenientes de un usuario.

El objetivo del ataque puede ser:

  • Eludir la autenticación: Acceder a la cuenta de un usuario sin conocer su contraseña.
  • Robar información: Extraer datos sensibles de la base de datos, como contraseñas, información de tarjetas de crédito o datos personales.
  • Modificar o borrar datos: Alterar o eliminar registros de la base de datos.
  • Controlar el servidor: En algunos casos, un ataque exitoso puede permitir al atacante ejecutar comandos en el servidor.

Nivel Avanzado

Técnicamente, el ataque de SQL Injection se produce cuando la entrada de datos de un usuario se concatena directamente en una consulta SQL.

Un ejemplo clásico es una consulta que busca un usuario en una base de datos:

<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">SELECT * FROM usuarios WHERE nombre_usuario = '" + userInput + "' AND contraseña = '" + userPassword + "';</pre>

Si el atacante introduce ' OR '1'='1 en el campo nombre_usuario, la consulta resultante en el servidor sería:

<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">SELECT * FROM usuarios WHERE nombre_usuario = '' OR '1'='1' AND contraseña = '...';</pre>

Dado que '1'='1' siempre es verdadero, la condición WHERE siempre se cumple, lo que permite al atacante eludir la autenticación y acceder a la cuenta.

La principal defensa contra este tipo de ataque es el uso de declaraciones preparadas (Prepared Statements) y parámetros vinculados (Bind Parameters). En lugar de concatenar la entrada del usuario en la consulta, se utiliza una plantilla de consulta donde los datos del usuario se pasan como parámetros de forma separada. El motor de la base de datos distingue entre la lógica de la consulta y los datos, lo que hace que cualquier entrada maliciosa sea tratada como un valor de cadena en lugar de código ejecutable. Otras medidas de seguridad incluyen la validación de la entrada del usuario, la sanitización de los datos y el uso de un principio de privilegio mínimo para las credenciales de la base de datos.

« Volver al índice del glosario