it-swarm-vi.com

Làm cách nào để kiểm tra lỗ hổng SQL SQL trên trang web có trường nhập?

Những phương pháp nào có sẵn để kiểm tra lỗ hổng SQL SQL?

48
John S

Có một số cách để kiểm tra một ứng dụng cho các lỗ hổng như SQL Injection. Các xét nghiệm chia thành ba phương pháp khác nhau:

Tiêm mù:

Ví dụ về MySQL:

http://localhost/test.php?id=sleep(30)

Nếu câu lệnh SQL này được cơ sở dữ liệu diễn giải thì sẽ mất 30 giây để tải trang.

Thông báo lỗi :

http://localhost/test.php?id='"

Nếu báo cáo lỗi được được bật và yêu cầu này dễ bị tấn công sql thì lỗi sau sẽ được tạo ra:

Bạn có một lỗi trong cú pháp SQL của bạn; kiểm tra hướng dẫn tương ứng với phiên bản máy chủ MySQL của bạn để biết đúng cú pháp để sử dụng gần '"' ở dòng 5

Tiêm dựa trên Tautology :

http://localhost/test.php?username=' or 1=1 /*&password=1

Trong trường hợp này, việc cung cấp Tautology hoặc một câu lệnh luôn luôn đúng sẽ cung cấp kết quả có thể dự đoán được. Trong trường hợp này, kết quả có thể dự đoán được sẽ đăng nhập vào kẻ tấn công với người dùng đầu tiên trong cơ sở dữ liệu, thường là quản trị viên.

Có các công cụ tự động hóa việc sử dụng các phương thức trên để phát hiện SQL Injection trong ứng dụng web. Có các công cụ mã nguồn mở và miễn phí như WapitiSkipfish làm điều này. Sitewatch cung cấp dịch vụ miễn phí tốt hơn rất nhiều so với các công cụ nguồn mở này. Tôi có thể nói rằng vì tôi là nhà phát triển cho Sitewatch.

52
rook

Tốt nhất là không kiểm tra trang web của bạn để tiêm SQL. Tốt nhất của bạn chỉ cần tránh tiêm SQL tiềm năng. Không bao giờ hình thành các truy vấn SQL bằng cách tự xử lý chuỗi khi có đầu vào của người dùng. Sử dụng tham số ràng buộc trong tất cả các truy vấn (cũng vệ sinh tất cả dữ liệu người dùng nếu nó có thể được sử dụng theo bất kỳ cách có hại nào và đặt giới hạn hợp lý cho các truy vấn). Đó là truy vấn sql_execute("select user from user_db where id="+input_id) không an toàn (hãy tưởng tượng nếu input_id = "1 OR 1==1 --"), Nhưng stored_procedure = "select user from user_db where id = ? LIMIT 1;", sql_execute_with_param(stored_procedure, input_id); là an toàn.

Rõ ràng, điều này chỉ khi bạn đang cố gắng làm cho trang web của riêng bạn an toàn. Nếu bạn đang cố gắng tìm lỗ hổng trong các ứng dụng khác thì câu chuyện khác của nó và có khả năng chống lại FAQ trong đó nêu rõ trang web này không dành cho mũ đen. Nhưng OWASP có một bài viết rất hay về thử nghiệm cho - SQL SQL .

13
dr jimbob

Nếu bạn bắt đầu từ số không, tôi sẽ đề xuất một trong những điều sau đây:

  1. Thuê một người biết họ đang làm gì
  2. Sử dụng một công cụ tự động như một khoảng cách ban đầu. Một số tùy chọn bao gồm Burp Pro, ZAP và SQL Map.

Tuy nhiên, hãy nhớ rằng khi bạn gửi dữ liệu đầu vào lạ và có khả năng gây nguy hiểm cho ứng dụng web, bạn có khả năng gây tổn hại đáng kể đến tính toàn vẹn của ứng dụng.

Bạn có thể hoàn toàn phá vỡ ứng dụng web của mình hoặc bạn có thể lưu trữ dữ liệu đầu vào lạ trong cơ sở dữ liệu của ứng dụng, sau đó được kéo và phân tích cú pháp sau đó - và thậm chí có thể không bằng ứng dụng của bạn.

Nguyên tắc chung cho loại thử nghiệm này rất đơn giản: bạn chưa hoàn thành thử nghiệm cho đến khi bạn khôi phục từ bản sao lưu nổi tiếng. Bạn không nên xem xét ứng dụng của mình trong điều kiện hoạt động bình thường sau khi thử nghiệm tiêm tự động cho đến khi bạn thực hiện xong.

5
Daniel Miessler