Kiểm tra lỗ hổng SQL Injection

Các cuộc tấn công SQL Injection gây ra những rủi ro to lớn cho các ứng dụng web phụ thuộc vào một cơ sở dữ liệu phụ trợ để tạo ra nội dung động. Trong kiểu tấn công này, tin tặc thao túng một ứng dụng web trong nỗ lực tiêm các lệnh SQL của chính họ vào các lệnh do cơ sở dữ liệu phát hành. Ví dụ, xem bài viết SQL Injection tấn công trên cơ sở dữ liệu. Trong bài viết này, chúng tôi xem xét một số cách bạn có thể kiểm tra các ứng dụng web của mình để xác định xem chúng có dễ bị tấn công SQL Injection hay không.

Tự động quét SQL Injection

Một khả năng là sử dụng trình quét lỗ hổng ứng dụng web tự động, chẳng hạn như WebInspect của HP, AppScan của IBM hoặc Hailstorm của Cenzic. Tất cả các công cụ này đều cung cấp các cách thức tự động, dễ dàng để phân tích các ứng dụng web của bạn cho các lỗ hổng SQL Injection tiềm ẩn. Tuy nhiên, chúng khá đắt, chạy với giá lên đến $ 25,000 cho mỗi chỗ ngồi.

Các thử nghiệm SQL Injection thủ công

Nhà phát triển ứng dụng kém phải làm gì? Bạn thực sự có thể chạy một số thử nghiệm cơ bản để đánh giá các ứng dụng web của bạn cho các lỗ hổng SQL Injection bằng cách sử dụng không có gì hơn một trình duyệt web. Đầu tiên, một lời cảnh cáo: các bài kiểm tra tôi mô tả chỉ tìm kiếm các lỗi SQL Injection cơ bản. Họ sẽ không phát hiện các kỹ thuật tiên tiến và hơi tẻ nhạt khi sử dụng. Nếu bạn có đủ khả năng, hãy sử dụng máy quét tự động. Tuy nhiên, nếu bạn không thể xử lý thẻ giá đó, kiểm tra thủ công là một bước đầu tiên tuyệt vời.

Cách dễ nhất để đánh giá liệu ứng dụng có dễ bị tấn công hay không là thử nghiệm với các cuộc tấn công tiêm vô hại mà sẽ không thực sự gây hại cho cơ sở dữ liệu của bạn nếu chúng thành công nhưng sẽ cung cấp cho bạn bằng chứng rằng bạn cần khắc phục sự cố. Ví dụ, giả sử bạn có một ứng dụng web đơn giản, tìm kiếm một cá nhân trong cơ sở dữ liệu và cung cấp thông tin liên hệ như là kết quả. Trang đó có thể sử dụng định dạng URL sau:

http://myfakewebsite.com/directory.asp?lastname=chapple&firstname=mike

Chúng ta có thể giả định rằng trang này thực hiện tra cứu cơ sở dữ liệu, sử dụng một truy vấn tương tự như sau:

CHỌN điện thoại TỪ thư mục WHERE lastname = 'chapple' và firstname = 'mike'

Hãy thử nghiệm với điều này một chút. Với giả định của chúng tôi ở trên, chúng tôi có thể thực hiện thay đổi đơn giản cho URL để kiểm tra các cuộc tấn công SQL injection:

http://myfakewebsite.com/directory.asp?lastname=chapple&firstname=mike'+AND+(select+count(*)+from+fake)+%3e0+OR+'1'%3d'1

Nếu ứng dụng web chưa được bảo vệ đúng cách chống lại SQL injection, nó chỉ đơn giản là cắm tên giả này vào câu lệnh SQL mà nó thực hiện đối với cơ sở dữ liệu, dẫn đến:

CHỌN điện thoại TỪ thư mục WHERE lastname = 'chapple' và firstname = 'mike' AND (chọn số (*) từ giả)> 0 OR '1' = '1'

Bạn sẽ nhận thấy rằng cú pháp trên hơi khác một chút so với URL gốc. Tôi đã tự do chuyển đổi biến được mã hóa URL cho các tương đương ASCII của họ để làm cho việc theo dõi ví dụ dễ dàng hơn. Ví dụ:% 3d là mã hóa URL cho ký tự '='. Tôi cũng đã thêm một số ngắt dòng cho các mục đích tương tự.

Đánh giá kết quả

Bài kiểm tra xuất hiện khi bạn cố gắng tải trang web có URL được liệt kê ở trên. Nếu ứng dụng web hoạt động tốt, nó sẽ loại bỏ các dấu nháy đơn khỏi đầu vào trước khi chuyển truy vấn tới cơ sở dữ liệu. Điều này sẽ đơn giản dẫn đến một tra cứu kỳ lạ cho một người nào đó với một tên đầu tiên bao gồm một bó SQL! Bạn sẽ thấy thông báo lỗi từ ứng dụng tương tự như ứng dụng bên dưới:

Lỗi: Không tìm thấy người dùng có tên mike + AND + (chọn + số (*) + từ + giả mạo) +% 3e0 + OR + 1% 3d1 Chapple!

Mặt khác, nếu ứng dụng dễ bị tấn công SQL injection, nó sẽ truyền câu lệnh trực tiếp tới cơ sở dữ liệu, dẫn đến một trong hai khả năng. Đầu tiên, nếu máy chủ của bạn đã kích hoạt các thông báo lỗi chi tiết (bạn không nên!), Bạn sẽ thấy một cái gì đó như thế này:

Microsoft OLE DB Nhà cung cấp cho trình điều khiển ODBC lỗi '80040e37' [Microsoft] [ODBC SQL Server Driver] [SQL Server] Tên đối tượng không hợp lệ 'giả'. /directory.asp, dòng 13

Mặt khác, nếu máy chủ web của bạn không hiển thị thông báo lỗi chi tiết, bạn sẽ nhận được một lỗi chung chung hơn, chẳng hạn như:

Lỗi Máy chủ Nội bộ Máy chủ gặp lỗi nội bộ hoặc cấu hình sai và không thể hoàn thành yêu cầu của bạn. Vui lòng liên hệ với quản trị viên máy chủ để thông báo về thời gian xảy ra lỗi và bất kỳ điều gì bạn có thể đã làm có thể đã gây ra lỗi. Thông tin thêm về lỗi này có thể có sẵn trong nhật ký lỗi máy chủ.

Nếu bạn nhận được một trong hai lỗi ở trên, ứng dụng của bạn dễ bị tấn công SQL injection! Một số bước mà bạn có thể thực hiện để bảo vệ các ứng dụng của mình chống lại các cuộc tấn công SQL Injection bao gồm: