2010-04-09 35 views
10

CẬP NHẬT: GWT 2.3 giới thiệu cơ chế tốt hơn để chống lại các cuộc tấn công XSRF. Xem http://code.google.com/webtoolkit/doc/latest/DevGuideSecurityRpcXsrf.htmlGWT RPC - Liệu nó có đủ để bảo vệ chống lại CSRF không?


cơ chế RPC GWT của làm những điều sau đây trên tất cả các yêu cầu HTTP -

  1. Sets hai yêu cầu tùy chỉnh tiêu đề - X-GWT-hoán vị và X-GWT-Module-Base
  2. Sets loại nội dung dưới dạng văn bản/x-gwt-rpc; charset = utf-8

Yêu cầu HTTP luôn là POST và phía máy chủ Phương thức GET ném ngoại lệ (phương pháp không được hỗ trợ).

Ngoài ra, nếu các tiêu đề này không được đặt hoặc có giá trị sai, máy chủ không xử lý ngoại lệ "có thể là CSRF?" Hoặc một cái gì đó để có hiệu lực.

Câu hỏi là: Điều này có đủ để ngăn chặn CSRF không? Có cách nào để đặt tiêu đề tùy chỉnh và thay đổi loại nội dung trong phương thức giả mạo yêu cầu chéo trang web thuần túy không?

Trả lời

6

Nếu GWT RPC này đang được trình duyệt sử dụng thì có thể dễ bị CSRF 100%. Loại nội dung có thể được đặt trong phần tử html <form>. X-GWT-PermutationX-GWT-Module-Base không có trong danh sách đen của banned headers của Flash. Do đó có thể tiến hành tấn công CSRF bằng flash. Phần tử tiêu đề duy nhất mà bạn có thể tin cậy để bảo vệ CSRF là "referer", nhưng đây không phải là cách tiếp cận tốt nhất. Sử dụng bảo vệ CSRF dựa trên mã thông báo bất cứ khi nào có thể.

Dưới đây là một số khai thác mà tôi đã viết nên làm sáng tỏ một số sự tấn công tối nghĩa mà tôi đang mô tả. Việc khai thác flash cho điều này sẽ trông giống như thishere là khai thác js/html thay đổi loại nội dung.

Khai thác của tôi được viết cho Flex 3.2 và các quy tắc đã thay đổi trong Flex 4 (Flash 10) Dưới đây là latest rules, hầu hết các tiêu đề có thể được thao tác cho các yêu cầu chỉ POST.

flash kịch bản có sử dụng navigateTo() cho CSRF: https://github.com/TheRook/CSRF-Request-Builder

+2

XmlHttpRequest, Flash và một loạt các công nghệ khác có thể đặt tiêu đề trình duyệt tùy chỉnh - nhưng chính sách có nguồn gốc giống nhau và sẽ ngăn một trang web khác đưa ra yêu cầu. Trừ khi máy chủ có một crossdomain.xml khoan dung, hoặc đang trả về Access-Control-Allow-Origin cho các trang web tùy ý, yêu cầu sẽ hoạt động như thế nào? Điều đó chỉ để lại cho chúng tôi các biểu mẫu/hình ảnh/iframe và các loại tương tự, trong đó chính sách gốc không áp dụng. Nhưng tôi không biết cách mà họ có thể đặt tiêu đề http tùy chỉnh. Vì vậy, nó dễ bị tổn thương như thế nào? –

+0

.. và có, tôi đồng ý mã thông báo dựa trên CSRF bảo vệ là cách tốt nhất, nhưng tôi muốn hiểu lỗ hổng với cách tiếp cận của họ. –

+0

@sri Câu hỏi rất hay. Để rút ra sự khai thác này, bạn phải tận dụng lợi thế của một thuộc tính ít được biết đến của flash. Tôi đã đăng 2 khai thác làm những gì tôi đang mô tả, tôi khuyến khích bạn sử dụng chúng. (Nếu bạn không có phần mềm dễ bị tổn thương ở mức tối thiểu, bạn có thể thấy rằng yêu cầu POST đang được gửi đến một miền khác, nhưng tập lệnh không thể "xem" phản hồi do SOP) – rook

0

Tôi không chắc chắn, nếu có một cách dễ dàng (Tôi muốn được vô cùng quan tâm đến việc tìm kiếm mà ra, quá!), Nhưng ít nhất có vẻ là một số cách nâng cao để đạt được yêu cầu trang web chéo tùy ý với các tiêu đề tùy ý: http://www.springerlink.com/content/h65wj72526715701/ Tôi chưa mua giấy, nhưng phần tóm tắt và giới thiệu âm thanh rất thú vị.

Có lẽ ai đó ở đây đã đọc phiên bản đầy đủ của bài báo và có thể mở rộng một chút?

+0

Tôi đặt ra để flash mã nguồn mà tôi đã viết mà sửa đổi tiêu đề http và đăng bài để khai thác một lỗ hổng csrf. – rook

+0

@rook: nhưng vui lòng đăng lại. – user2284570

3

Tôi biết tôi đã hỏi câu hỏi này, nhưng sau khoảng một ngày nghiên cứu (nhờ con trỏ từ Rook!), Tôi nghĩ tôi có câu trả lời.

Những gì GWT cung cấp ngoài hộp sẽ không bảo vệ bạn khỏi CSRF. Bạn phải thực hiện các bước được ghi lại trong Security for GWT Applications để luôn được bảo mật.

GWT RPC đặt tiêu đề "kiểu nội dung" thành "văn bản/x-gwt-rpc; charset = utf-8". Mặc dù tôi không tìm thấy cách để thiết lập điều này bằng cách sử dụng các biểu mẫu HTML, nhưng nó rất tầm thường để làm như vậy trong nháy mắt.

Tiêu đề tùy chỉnh - X-GWT-Permutation và X-GWT-Module-Base, hơi phức tạp hơn một chút. Không thể đặt chúng bằng cách sử dụng HTML. Ngoài ra, chúng không thể được đặt bằng Flash trừ khi máy chủ của bạn cho phép cụ thể trong crossdomain.xml. Xem Flash Player 10 Security.

Bên cạnh đó, khi một tập tin SWF muốn gửi header HTTP tùy chỉnh bất cứ nơi nào khác hơn là máy chủ riêng của mình xuất xứ, phải có một chính sách tập tin trên máy chủ HTTP mà yêu cầu được được gửi . Tệp chính sách này phải liệt kê máy chủ lưu trữ của tệp SWF là nguồn gốc (hoặc một nhóm lớn hơn) như được phép gửi yêu cầu tùy chỉnh tiêu đề đến máy chủ lưu trữ đó.

Bây giờ RPC của GWT có hai hương vị. Có RPC định dạng tuần tự hóa tùy chỉnh cũ và phiên bản RPC dựa trên JSON mới. AFAICT, mã máy khách luôn đặt các tiêu đề yêu cầu này. RPC kiểu cũ hiện không thực thi các tiêu đề này ở phía máy chủ, và do đó có thể tấn công CSRF. Kiểu mới de-RPC thực thi các tiêu đề này và do đó có thể hoặc không thể tấn công chúng.

Nói chung, tôi muốn nói nếu bạn quan tâm đến bảo mật, hãy đảm bảo bạn gửi mã thông báo CSRF mạnh mẽ theo yêu cầu của mình và không dựa vào GWT để ngăn chặn nó cho bạn.

+0

@ sri, Dưới đây là các quy tắc mới để đặt tiêu đề: http://www.eonflex.com/flex/4.1/langref/flash/net/URLRequestHeader.html Bạn chỉ có thể đặt chúng trên POST và các quy tắc phổ biến là màu đen được liệt kê, theo tất cả thông tin bạn đã đăng phần tử tiêu đề "X-GWT-Permutation" có thể được kiểm soát cho các yêu cầu POST bằng cách sử dụng phương pháp tôi đã sử dụng trong quá trình tải lên tệp cross-site-file của mình. – rook

+0

Kiểm tra mã ví dụ này thay đổi phần tử tiêu đề 'pragma: no-cache': http://www.eonflex.com/flex/4.1/langref/flash/net/URLRequestHeader.html#URLRequestHeader%28%29 Nếu bạn gặp khó khăn khi biên dịch mã của tôi, bạn nên thử biên dịch ví dụ. – rook

+0

Câu trả lời của bạn là chính xác những gì tôi đang tìm kiếm, nhưng nó có từ năm 2010. Tôi đang cố gắng viết một cuộc tấn công PoC CSRF chống lại RPC kiểu cũ, sử dụng một phiên bản flash hiện đại. Bạn có biết nếu điều này vẫn còn có thể? Vì mục tiêu _doesn't_ có _crossdomain, xml_. Có vẻ như máy khách Flash của tôi đang gửi yêu cầu cho _crossdomain, xml_ đến máy chủ, nhận ra không có tệp như vậy và sau đó không tiến hành phát hành tải trọng CSRF của tôi. Có phiên bản mới của Flash về cơ bản ngăn chặn loại tấn công này, ngay cả trên RPC kiểu cũ? – Juicy

4

GWT 2.3 giới thiệu cơ chế tốt hơn để chống lại các cuộc tấn công XSRF. Xem GWT RPC XSRF protection

+1

đã cập nhật câu hỏi để mọi người truy cập trang này có thể dễ dàng tìm thấy. Cảm ơn! –

+0

có bất kỳ bên độc lập nào xác minh rằng triển khai XsrfTokenServlet hiện tại (GWT 2.8.1) cung cấp một cách an toàn để bảo vệ chống lại XSRF không? – user1050755

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