2013-10-24 15 views
9

Apache Tomcat (ít nhất là trước Tomcat 6 xem chú thích) xử lý dấu gạch chéo được mã hóa phần trăm (% 2F) trong đường dẫn URI giống như dấu gạch chéo thông thường (tức là dấu tách đường dẫn).Tại sao Apache Tomcat xử lý các dấu gạch chéo được mã hóa (% 2F) làm dấu tách đường?

Vì vậy, ví dụ: trang servlets ví dụ về Tomcat có thể được truy cập tại

  • http://localhost:8080/examples/servlets/ và tại
  • http://localhost:8080/examples%2Fservlets/

này không có ý nghĩa đối với tôi. Toàn bộ điểm mã hóa phần trăm ký tự dành riêng như "/" là để tránh nó được coi là ký tự dành riêng (trong trường hợp này là dấu tách đường dẫn). Ngoài ra, hành vi này là (một) nguyên nhân của lỗ hổng CVE-2007-0450. Tuy nhiên, tôi cho rằng phải có lý do cho việc này.

  • Có bất kỳ lý do tại sao kỹ thuật Tomcat xử lý (ok, dùng để điều trị)% 2F như một dấu phân cách đường dẫn?

  • Có một số trường hợp hành vi này hữu ích không?


Footnote: Tôi nhận ra rằng hành vi mặc định do CVE-2007-0450 Tomcat đã được thay đổi để từ chối slashes trăm mã hóa trong đường dẫn. Tuy nhiên, nếu kiểm tra này bị vô hiệu hóa (ALLOW_ENCODED_SLASH), hành vi cũ vẫn còn.

Trả lời

8

Nó liên quan đến thời điểm Tomcat đứng sau proxy ngược httpd. Trong một số trường hợp, URI được mã hóa một phần để xử lý% 2F là cần thiết để hoàn tác mã hóa đó.

Nó tạo ra một số vấn đề bảo mật đã được sửa cố định trong cùng một thời điểm CVE-2007-0450 đã được sửa. Đối với nền, hãy xem các tùy chọn ForwardURIxxx trong tài liệu mod_jk: http://tomcat.apache.org/connectors-doc/reference/apache.html Điều đó bao gồm một vài trường hợp bạn vẫn có thể muốn tính năng này (nhưng vì các vấn đề bảo mật có thể xảy ra mà tôi tránh nó nếu có thể).

Hành vi mặc định hiện là httpd để chuyển URI sang Tomcat không thay đổi và cho Tomcat xử lý các ký tự được mã hóa chính xác như vậy.

+0

Đánh dấu, có cách nào để yêu cầu Tomcat * không * xử lý% 2F làm dấu phân cách đường dẫn không? Tôi nhận ra nó từ chối yêu cầu hoàn toàn trừ khi đề xuất được đề cập ở đây được thiết lập, nhưng sau đó, tôi muốn ".../foo% 2Fbar/..." được coi là một phần tử đường dẫn có giá trị "foo/bar" và không phải như thể nó là ".../foo/bar/..." –

+0

Tôi không sợ. giải mã% xảy ra khá sớm và một khi giải mã xảy ra Tomcat không thể biết sự khác biệt giữa bản gốc/và đã được giải mã từ% 2F. Bạn có thể sử dụng mã hóa kép tức là% 252F nhưng tôi không khuyên bạn nên sử dụng nó vì đó là loại điều đã dẫn đến các vấn đề bảo mật trong quá khứ. –

+2

Tôi đã thực hiện một số thử nghiệm với Tomcat 7 và thấy rằng nó không chấp nhận% 2F trong đường dẫn của URL: nó trả về mã trạng thái HTTP 400 "Yêu cầu Xấu". Nếu tôi vượt qua% 2F trong một tham số là hoạt động tốt. Nếu tôi sử dụng% 2C trong URI được chuyển thành ',' để Tomcat thực sự xử lý% 2F theo cách đặc biệt. –

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