Inyección SQL básica y mitigación con ejemplo

La inyección SQL es una técnica de inyección de código, que se utiliza para atacar aplicaciones basadas en datos, en la que se insertan sentencias SQL maliciosas en un campo de entrada para su ejecución (por ejemplo, para volcar el contenido de la base de datos al atacante).

  • La inyección de SQL se puede utilizar de diversas maneras para causar problemas graves.
  • Al aprovechar SQL Injection, un atacante podría eludir la autenticación, acceder, modificar y eliminar datos dentro de una base de datos.

Por un momento, ponte en el papel de un atacante. Su objetivo es simple. Desea que la base de datos ejecute cualquier declaración SQL inesperada. Solo está buscando que algo funcione porque eso revelará el hecho de que la aplicación tiene una vulnerabilidad potencial. Por ejemplo, considere el formulario de autenticación simple que se muestra en la Figura 1.

      Capture
                                     Figure 1

Código para la figura 1

<form action="/login.php" method="POST">
<p>Username: <input type="text" name="username" /></p>
<p>Password: <input type="text" name="password" /></p>
<p><input type="submit" value="Log In" /></p>
</form>

Ya puede hacer una suposición muy informada sobre el tipo de instrucción SQL que esta aplicación podría usar para verificar las credenciales de acceso. Lo más probable es que sea una instrucción SELECT. También puede adivinar la convención de nomenclatura utilizada en la tabla de la base de datos porque probablemente coincida con los nombres simples utilizados en el formulario HTML. Debido a que este formulario es para la autenticación, probablemente haya una cláusula WHERE que use

$_POST['username'] and $_POST['password'].

De todo esto, usted podría predecir lo siguiente:

<?php $sql = "SELECT count(*) FROM users WHERE 
              username = '{$_POST['username']}'AND 
              password = '...'"; ?>

Suponiendo que esta conjetura sea correcta, ¿qué puede hacer para manipular esta consulta? Imagina enviar el siguiente nombre de usuario:

akash' /*
SELECT count(*)FROM users WHERE username = 'akash' /*'AND password = '...'";
In this example, /* is used to begin a multi-line comment,
effectively terminating the query at that point. This has
been tested successfully with MySQL. A standard comment 
in SQL begins with --, and it's trivial to try both.

Esta consulta sugiere un intento de autenticación exitoso siempre que exista la cuenta akash, independientemente de la contraseña. Este ataque en particular se usa con frecuencia para robar cuentas. Por supuesto, se puede usar cualquier nombre de usuario (admin es un objetivo popular). Por lo tanto, al enviar un nombre de usuario mal formado, puede lograr iniciar sesión sin tener una cuenta válida.

Mitigación mediante declaraciones preparadas (consultas parametrizadas)

Hay muchas formas de defender la inyección de SQL. Una de las principales técnicas de defensa es «Declaraciones preparadas (consultas parametrizadas)». Esta técnica obliga al desarrollador a definir todo el código SQL y luego pasar cada parámetro a la consulta posterior. Este estilo permite que la base de datos diferencie entre código y datos, independientemente de la entrada del usuario.
Las declaraciones preparadas garantizan que un atacante no pueda cambiar la intención de una consulta, incluso si un atacante inserta comandos SQL. Por ejemplo, si un atacante ingresa el ID de usuario de ABC o ‘1’=’1, la consulta parametrizada no sería vulnerable y, en su lugar, buscaría un nombre de usuario que coincidiera literalmente con la string completa ABC o ‘1’=’1.
Laboral:

  1. Preparar: se crea una plantilla de declaración SQL y se envía a la base de datos. Ciertos valores se dejan sin especificar, llamados parámetros (etiquetados como «?»).
    Ejemplo:
    SELECT count(*)FROM users WHERE username = ? AND password = ?;
  2. Analizar: la base de datos analiza, compila y realiza la optimización de consultas en la plantilla de declaración SQL y almacena el resultado sin ejecutarlo.
  3. Ejecutar: en un momento posterior, la aplicación vincula los valores a los parámetros y la base de datos ejecuta la instrucción. La aplicación puede ejecutar la sentencia tantas veces como quiera con diferentes valores.

Implementación:

<?php 
$stmt = $dbConnection->prepare('SELECT count(*)FROM users WHERE username = ? AND password = ?');
  
$stmt->bind_param('ss', $username,$password);
  
$stmt->execute();
  
$result = $stmt->get_result();
  
echo $result;
?>

Este es solo un ejemplo simple de eludir la página de inicio de sesión del usuario, mientras que SQL Injection puede proporcionar a un atacante acceso no autorizado a datos confidenciales, incluidos datos de clientes, información de identificación personal (PII), secretos comerciales, propiedad intelectual y otra información confidencial. También hay una herramienta de automatización de inyección SQL, sqlmap , que se utiliza para realizar todo tipo de inyección SQL.
Por lo tanto, debemos aplicar la codificación segura para que el sistema esté protegido contra el compromiso.

Referencias:

Artículo relacionado:
Mitigación del ataque de inyección SQL mediante declaraciones preparadas (consultas parametrizadas)

Este artículo es una contribución de Akash Sharan . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *