Sto cercando di capire come un sito web può essere hackerato usando addslashes
in PHP e MySQL per scopi didattici.
Dopo aver letto questo argomento e questo argomento , cerco di capire come può aggirare con qualcosa come 0xbf27
che può essere convertito in 0xbf5c27
utilizzando addslashes
.
Quindi eseguo manualmente una query per l'impostazione del set di caratteri.
set character set 'gbk';
Il carattere per questo scopo deve essere 뼧
che è bf27
. Secondo ciò che dicono negli argomenti di cui sopra, deve essere convertito in qualcosa come bf5c27
ma quando lo collaudo nel mio laboratorio con un codice PHP come questo:
$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>' );
E quando inserisco 뼧
nel mio campo di testo, la query esatta che viene eseguita è:
SELECT first_name, last_name FROM users WHERE user_id = '뼧';
Quindi sembra che non sia successo niente di speciale!
Dopo questo provo a creare un altro script PHP per capire cosa sta succedendo, quindi costruisco un semplice script senza alcuna esecuzione MySQL (test.php) come:
<html>
<head>
<title>PHP Test</title>
</head>
<body>
<?php
$command = $_REQUEST[ 'id' ];;
$output = addslashes($command);
echo "<pre>$output</pre>"; ?>
</body>
</html>
Quindi eseguo il file con URL come:
http://127.0.0.1/test.php?id=뼧
E se vedi il codice PHP sopra riportato, echos:
뼧
Il codice esadecimale di sopra 3 caratteri è:
eb bc a7
Bene, penso a quello che è successo,
Le mie domande sono:
-
Quali sono
뼧
che mi ha mostrato? (Sembrava qualcosa di insolito perché non conteneva nulla come5c
o27
? -
Perché il primo script non mostra qualcosa come sopra tre caratteri in
echo $query;
? -
Come posso eseguirlo veramente come descrivono (In 2 argomenti sopra)?
Aggiornamento 1: Grazie a ciò Goktay Kaykusuz dice che capisco che ho un problema nella mia codifica. il POC per questo è che lo collaudo su Terminale e cambia nuovamente:
<html>
<head>
<title>PHP Test</title>
</head>
<body>
<pre>뼧</pre> </body>
</html>
quindi ho capito che converte il risultato in UTF8 (in Chrome) ma in Terminale funziona normalmente.
Ma il problema è ancora vivo perché funziona senza alcun aggiramento meraviglioso (è proprio quello che dovrebbe essere una semplice stringa.)