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

Tấn công SQL Injection - Điều này làm gì?

Cuộc tấn công thực sự làm gì

Có một chi tiết tinh tế nhưng thông minh về cuộc tấn công này mà những người trả lời khác đã bỏ qua. Lưu ý thông báo lỗi Duplicate entry ':sjw:1:ukt:1' for key 'group_key' . Chuỗi :sjw:1:ukt:1 thực sự là kết quả của một biểu thức được đánh giá bởi máy chủ MySQL của bạn. Nếu ứng dụng của bạn gửi lại chuỗi lỗi MySQL cho trình duyệt, thì thông báo lỗi có thể làm rò rỉ dữ liệu từ cơ sở dữ liệu của bạn.

Loại tấn công này được sử dụng trong trường hợp kết quả truy vấn không được gửi trở lại trình duyệt (tiêm SQL mù) hoặc khi một cuộc tấn công UNION SELECT cổ điển phức tạp để thực hiện. Nó cũng hoạt động trong các truy vấn CHÈN / CẬP NHẬT / XÓA.

Như Hawili lưu ý, truy vấn cụ thể ban đầu được cho là không làm rò rỉ bất kỳ thông tin nào, nó chỉ là một bài kiểm tra để xem liệu ứng dụng của bạn có dễ bị tấn công bởi loại nội dung này hay không.

Cuộc tấn công không không thành công như MvG đã đề xuất, gây ra lỗi này là mục đích của truy vấn.

Một ví dụ tốt hơn về cách có thể sử dụng điều này:

> SELECT COUNT(*),CONCAT((SELECT CONCAT(user,password) FROM mysql.user LIMIT 1),
>                        0x20, FLOOR(RAND(0)*2)) x
> FROM information_schema.tables GROUP BY x;
ERROR 1062 (23000): Duplicate entry 'root*309B17546BD34849D627A4DE183D3E35CD939E68 1' for key 'group_key'

Tại sao lỗi lại xuất hiện

Tại sao truy vấn gây ra lỗi này trong MySQL là một điều bí ẩn đối với tôi. Nó trông giống như một lỗi MySQL, vì GROUP BY được cho là xử lý các mục nhập trùng lặp bằng cách tổng hợp chúng. Thực tế, việc đơn giản hóa truy vấn của Hawili không gây ra lỗi!

Biểu thức FLOOR(RAND(0)*2) đưa ra các kết quả theo thứ tự sau, dựa trên đối số hạt ngẫu nhiên 0:

> SELECT FLOOR(RAND(0)*2)x FROM information_schema.tables;
+---+
| x |
+---+
| 0 |
| 1 |
| 1 | <-- error happens here
| 0 |
| 1 |
| 1 |
 ...

Bởi vì giá trị thứ 3 là bản sao của giá trị thứ 2, lỗi này được đưa ra. Bất kỳ bảng FROM nào có ít nhất 3 hàng đều có thể được sử dụng, nhưng bảng information_schema.tables là bảng phổ biến. Các phần COUNT (*) và GROUP BY là cần thiết để gây ra lỗi trong MySQL:

> SELECT COUNT(*),FLOOR(RAND(0)*2)x FROM information_schema.tables GROUP BY x;
ERROR 1062 (23000): Duplicate entry '1' for key 'group_key'

Lỗi này không xảy ra trong truy vấn tương đương với PostgreSQL:

# SELECT SETSEED(0);
# SELECT COUNT(*),FLOOR(RANDOM()*2)x FROM information_schema.tables GROUP BY x;
 count | x 
-------+---
    83 | 0
    90 | 1

(Xin lỗi vì đã trả lời trễ 1 năm, nhưng hôm nay tôi mới tình cờ gặp câu hỏi này. Câu hỏi này khiến tôi rất thú vị vì tôi không biết có nhiều cách để rò rỉ dữ liệu qua thông báo lỗi từ MySQL)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để xóa tự động tất cả các hàng tham chiếu nếu hàng mẹ bị xóa trong mysql?

  2. Tìm khối thời gian rảnh trong mysql và php?

  3. Khi nào tôi gọi bind_param nếu sử dụng các câu lệnh được chuẩn bị sẵn trong MySQLi trong một vòng lặp?

  4. MySQL Exception - Gặp phải lỗi nghiêm trọng trong quá trình đọc dữ liệu

  5. Cách chuyển đổi datetime sang UTC trong MySQL