Sự cốBảo vệ chống lại cuộc tấn công tiêm 'sqITFOR DELAY' sql injection?
Chúng tôi cần phòng thủ chống tấn công 'WAITFOR DELAY' sql injection trong ứng dụng java của chúng tôi.
nền
[Đây là dài. Chuyển đến 'Giải pháp?' bên dưới nếu bạn đang vội vàng]
Ứng dụng của chúng tôi chủ yếu sử dụng câu lệnh đã chuẩn bị và báo cáo có thể gọi (thủ tục lưu trữ) khi truy cập cơ sở dữ liệu.
Ở một vài nơi, chúng tôi tự động tạo và thực thi truy vấn để chọn. Trong mô hình này, chúng tôi sử dụng một đối tượng tiêu chí để xây dựng truy vấn tùy thuộc vào tiêu chí đầu vào của người dùng. Ví dụ, nếu người dùng xác định giá trị cho first_name và last_name, kết quả truy vấn luôn trông giống như sau:
SELECT first_name,last_name FROM MEMBER WHERE first_name ='joe' AND last_name='frazier'
(Trong ví dụ này, người dùng sẽ có quy định "joe" và "frazier" như/input của mình Nếu người dùng có nhiều hay ít critieria chúng tôi sẽ có các truy vấn dài hơn hoặc ngắn hơn. Chúng tôi nhận thấy rằng phương pháp này dễ hơn việc sử dụng các câu lệnh đã chuẩn bị và nhanh hơn/nhiều hơn các thủ tục lưu sẵn).
Vụ tấn công
Một kiểm toán lỗ hổng đã báo cáo một thất bại sql injection. Kẻ tấn công tiêm giá trị 'frazier WAITFOR TRÌ HOÃN '00: 00: 20' cho tham số 'last_name, dẫn đến sql này:
SELECT first_name,last_name FROM MEMBER WHERE first_name ='joe' AND last_name='frazier' WAITFOR DELAY '00:00:20'
Kết quả: truy vấn thực hiện thành công, nhưng mất 20 giây để thực thi. Kẻ tấn công có thể kết nối tất cả các kết nối cơ sở dữ liệu của bạn trong nhóm db và tắt trang web của bạn một cách hiệu quả.
Một số quan sát về cuộc tấn công này 'WAITFOR TRÌ HOÃN'
Tôi đã nghĩ rằng vì chúng tôi sử dụng Statement executeQuery (String), chúng tôi sẽ được an toàn từ sql injection. executeQuery (String) sẽ không thực hiện DML hoặc DDL (xóa hoặc giảm). Và các chuỗi lệnh executeQuery (String) trên bán dấu hai chấm, do đó mô hình 'Bảng Bobby' sẽ thất bại (tức là người dùng nhập 'yếu hơn; thành viên DROP TABLE' cho tham số. http://xkcd.com/327/)
Cuộc tấn công 'WAITFOR' khác nhau trong một khía cạnh quan trọng: WAITFOR sửa đổi lệnh 'SELECT' hiện tại, và không phải là một lệnh riêng biệt.
Cuộc tấn công chỉ hoạt động trên 'thông số cuối cùng' trong truy vấn kết quả. ví dụ: 'WAITFOR' phải xảy ra vào cuối của báo cáo sql
Solution, giá rẻ Hack, hoặc cả hai?
Giải pháp rõ ràng nhất đòi hỏi chỉ cần gắn "AND 1 = 1" vào mệnh đề where.
Các sql dẫn đến thất bại ngay lập tức và lá kẻ tấn công:
SELECT first_name,last_name FROM MEMBER WHERE first_name ='joe' AND last_name='frazier' WAITFOR DELAY '00:00:20' AND 1=1
Các câu hỏi
- Đây có phải là một giải pháp khả thi cho cuộc tấn công WAITFOR?
- Ứng dụng có chống lại các lỗ hổng tương tự khác không?
- Tôi nghĩ rằng tùy chọn tốt nhất sẽ đòi hỏi bằng cách sử dụng câu lệnh đã chuẩn bị. Nhiều công việc hơn, nhưng ít bị tổn thương hơn.
tiếc là người duy nhất nó là chính bạn. Nếu bạn tiếp tục, thay vì trì hoãn, "HOẶC 1 = 1", bạn có thể kết thúc cho phép bất kỳ ai và mọi người đăng nhập. Đừng cố lừa mình nghĩ rằng bạn có thể quản lý để outsmart tất cả những người muốn thử phá vỡ trang web của bạn. Bạn là một người, nếu trang web của bạn phổ biến, họ rất nhiều. Nếu không, thì có lẽ không thành vấn đề, nếu có, bạn làm. –
quy tắC# 1: không tổng hợp và thực thi mã từ các nguồn không đáng tin cậy ... –