2015-09-09 14 views
5

Hãy để tôi bắt đầu bằng cách nói rằng tôi là người tự tin trong các biện pháp tôi đã thực hiện để đảm bảo các cuộc tấn công SQL Injection không thành công. Tất cả các giá trị truy vấn SQL được thực hiện thông qua các câu lệnh chuẩn bị hồ sơ hoạt động, và tất cả các toán tử nếu không mã hóa cứng được thực hiện thông qua một hệ thống danh sách trắng số. Có nghĩa là nếu ai đó muốn tìm kiếm qua "ILIKE", họ sẽ vượt qua 6 và nếu họ muốn tìm kiếm qua "=", họ sẽ vượt qua 1, v.v.Regex để phát hiện tiêm SQL cơ bản, nhưng không phải là phương tiện để ngăn ngừa tiêm SQL

Tôi cũng sử dụng BrakemanRails SQL Injection guide thường xuyên để xem lại mã.

Vì vậy, có ba lý do còn lại tôi muốn chặn các bộ phun SQL đã cố gắng.

  1. Chúng tôi nhận được rất nhiều script kiddies cố gắng để hack chúng tôi. Hầu hết các trường hợp này là đã bị chặn ít nhất một lần vì chúng tôi có một phần mở rộng tệp hệ thống danh sách trắng chặn hầu hết các tệp này khi chúng cố gắng yêu cầu tệp php. Một khi họ bị lọt vào danh sách đen lần đầu tiên, vào vòng hai họ thường cố gắng ném cuốn sách tiêm SQL vào chúng tôi. Vì vậy, tôi muốn gắn cờ các kiddies này sớm để tiết kiệm băng thông và nếu một diễn viên thực sự tấn công chúng tôi, nó sẽ là dễ dàng sắp xếp chúng ra khỏi tất cả các kiddies tập lệnh.
  2. Làm chậm mọi nỗ lực kiểm tra phòng thủ của chúng tôi. Điều này sẽ không thực sự ảnh hưởng đến các cuộc tấn công phân tán phức tạp, nhưng có thể làm chậm một diễn viên ở đâu đó giữa một kịch bản kiddie và một siêu hacker.
  3. Gắn cờ tất cả các yêu cầu bị chặn và thiết lập thông báo nhật ký mà chúng tôi sau đó sẽ được dịch vụ ghi nhật ký của chúng tôi thông báo để tăng nhận thức bảo mật của chúng tôi.

Hiện tại ý tưởng của tôi là chạy một trận đấu regex đơn giản dựa trên đường dẫn yêu cầu và tham số để gắn cờ nỗ lực tiêm SQL nguy hiểm nhất và danh sách đen các ips đó, như vậy, sử dụng rack-attack.

injection_regex = /SOMEREGEXHERE/ 

Rack::Attack.blacklist('sql injection blacklist') do |req| 
    Rack::Attack::Fail2Ban.filter(req.ip, :maxretry => 5, :findtime => 10.minutes, :bantime => 24.hours) do 
    CGI.unescape(req.query_string).match(injection_regex) || req.path.match(injection_regex) 
    end 
end 

Vấn đề của tôi mặc dù đang tạo ra một regex mà đúng cờ một nỗ lực SQL injection đơn giản, nhưng không gây ra bất kỳ vấn đề cho người dùng thông thường. Tôi hình một số dương tính giả là ok, và đó là lý do tại sao hệ thống danh sách đen ở trên không danh sách đen sau trận đấu đầu tiên. Trong tìm kiếm của tôi, tôi đã tìm thấy một số câu hỏi về chủ đề này, nhưng tất cả dường như đi like this one, người đặt câu hỏi về sử dụng regex để phát hiện SQL injection, một người khác trả lời bạn không nên dừng SQL injection theo cách này , người hỏi các câu hỏi trả lời rằng họ sẽ không sử dụng regex để dừng lại, nhưng chỉ đơn thuần là để phát hiện, sau đó một loạt các bình luận hữu ích không theo sau. Vì vậy, thậm chí có một khả năng cho một regex như vậy để làm việc chỉ như một phương tiện phát hiện, với tối thiểu sai tích cực, hoặc là một con thỏ như vậy toàn bộ rằng nó sẽ không có giá trị nỗ lực ?.

+1

tôi chắc chắn rằng nó có thể ở mức độ nào. Tuy nhiên, nơi để bắt đầu là đặt một danh sách những thứ bạn muốn tìm kiếm. Khi bạn có danh sách đó, bạn có thể làm việc để tạo mẫu để tìm chúng. –

+1

Bạn đã xem [this] (http://www.symantec.com/connect/articles/detection-sql-injection-and-cross-site-scripting-attacks) chưa? Một giải pháp cho vấn đề của bạn có thể là tạo ra một số cấp độ với các regexes trong đó một đầu vào đi qua. Nếu bất kỳ cấp độ phù hợp đó là một cảnh báo. –

Trả lời

Các vấn đề liên quan