Inyección de SQL a través de tiras de adición

9

Estoy tratando de entender cómo se puede hackear un sitio web mediante el uso de addslashes en PHP y MySQL con fines educativos.

Después de leer este tema y este tema , trato de entender cómo se puede pasar por alto con algo como 0xbf27 que se puede convertir a 0xbf5c27 mediante el uso de addslashes .

Así que ejecuto manualmente una consulta para configurar el conjunto de caracteres.

set character set 'gbk'; 

El carácter para este propósito debe ser que es bf27 . De acuerdo con lo que dicen en los temas anteriores, se debe convertir a algo como bf5c27 pero cuando lo pruebo en mi laboratorio con un código PHP como esto:

$query  = "SELECT first_name, last_name FROM users WHERE user_id = '".addslashes($id)."';";
echo $query;
$result = mysql_query($query) or die( '<pre>' . mysql_error() . '</pre>' );

Y cuando inserto en mi campo de texto, la consulta exacta que se ejecuta es:

SELECT first_name, last_name FROM users WHERE user_id = '뼧';

¡Parece que no pasó nada especialmente!

Después de esto, trato de construir otro script PHP para entender lo que está pasando, así que construyo un script simple sin ninguna ejecución de MySQL (test.php) como:

 <html>
 <head>
  <title>PHP Test</title>
 </head>
 <body>
 <?php 
$command = $_REQUEST[ 'id' ];;
$output = addslashes($command);
echo "<pre>$output</pre>"; ?> 
 </body>
</html>

Luego ejecuto el archivo con una URL como:

http://127.0.0.1/test.php?id=뼧

Y si ves el código PHP anterior, osa:

뼧 

El código hexadecimal de los 3 caracteres anteriores es:

eb bc a7

Bueno, solo pienso en lo que pasó,

Mis preguntas son:

  1. ¿Qué son 뼧 que me mostró? (Parecía algo inusual porque no contiene nada como 5c o 27 ?

  2. ¿Por qué el primer script no muestra algo como más de tres caracteres en echo $query; ?

  3. ¿Cómo puedo realizarlo realmente como lo describen (en los dos temas anteriores)?

Actualización 1: Gracias a lo que Goktay Kaykusuz dice que entiendo que tengo un problema en mi codificación. el POC para eso es que lo pruebo en la Terminal y se resalta:

<html>
 <head>
  <title>PHP Test</title>
 </head>
 <body>
 <pre>뼧</pre> </body>
</html>

por lo que entiendo que convierte el resultado a UTF8 (en Chrome) pero en Terminal funciona normalmente.

Pero el problema sigue vivo porque funciona sin ningún desvío maravilloso (es lo que debería ser una simple cadena)

    
pregunta ᔕIᑎᗩ KᗩᖇᐯᗩᑎᗪI 11.07.2016 - 16:09
fuente

1 respuesta

2

Lo gracioso, he experimentado con un convertidor de codificación en línea. Creo que tienes un problema de codificación en el lado del cliente.

Cuando incrusté la cadena dentro del código PHP, funcionó.

$test_var = chr(0xbf) . chr(0x27);
echo(bin2dex(addslashes($test_var)));

Resultó en: bf5c27

El problema es cuando obtiene la variable de la URL:

después de tiras de suma () da como resultado ebbca7

¿' después de tiras de suma () da como resultado bf5c27

pero el convertidor de codificación en línea muestra bf27 para y bf 27 para ¿' .

¿Puede establecer la codificación de su configuración de PHP en GBK y UTF-8 en php.ini, luego intente con los caracteres ¿' nuevamente? Los ejemplos en los enlaces que has dado no hacen eco de la salida directamente, por lo que puedes haber codificado en el lado del cliente como he mencionado.

    
respondido por el Goktay Kaykusuz 13.07.2016 - 18:27
fuente

Lea otras preguntas en las etiquetas