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:
-
¿Qué son
뼧
que me mostró? (Parecía algo inusual porque no contiene nada como5c
o27
? -
¿Por qué el primer script no muestra algo como más de tres caracteres en
echo $query;
? -
¿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)