Các dịch vụ web JSON có dễ bị tấn công CSRF không?


82

Tôi đang xây dựng một dịch vụ web sử dụng riêng JSON cho nội dung yêu cầu và phản hồi của nó (tức là không có tải trọng được mã hóa biểu mẫu).

Một dịch vụ web có dễ bị tấn công CSRF không nếu những điều sau là đúng?

  1. POSTVí dụ: bất kỳ yêu cầu nào không có đối tượng JSON cấp cao nhất {"foo":"bar"}sẽ bị từ chối với 400. Ví dụ: một POSTyêu cầu có nội dung 42sẽ bị từ chối.

  2. Bất kỳ POSTyêu cầu nào có loại nội dung khác application/jsonsẽ bị từ chối với 400. Ví dụ: một POSTyêu cầu có loại nội dung application/x-www-form-urlencodedsẽ bị từ chối.

  3. Tất cả các yêu cầu GET sẽ An toàn và do đó không sửa đổi bất kỳ dữ liệu phía máy chủ nào.

  4. Khách hàng được xác thực thông qua cookie phiên mà dịch vụ web cung cấp cho họ sau khi họ cung cấp cặp tên người dùng / mật khẩu chính xác thông qua POST với dữ liệu JSON, chẳng hạn {"username":"user@example.com", "password":"my password"}.

Câu hỏi phụ: Các yêu cầu PUTDELETEcó bao giờ dễ bị tấn công bởi CSRF không? Tôi hỏi vì có vẻ như hầu hết (tất cả?) Trình duyệt không cho phép các phương pháp này trong các biểu mẫu HTML.

CHỈNH SỬA: Đã thêm mục # 4.

CHỈNH SỬA: Cho đến nay, có rất nhiều nhận xét và câu trả lời tốt, nhưng không ai đưa ra một cuộc tấn công CSRF cụ thể mà dịch vụ web này dễ bị tấn công.


tokenize yêu cầu của bạn qua phiên & giá trị cookie cặp, sanitize bất cứ điều gì chỉ bạn đang kích hoạt thông qua JSON gửi, thêm muối cho thêm hương vị
Brandt Solovij

Tôi không nghĩ rằng có đủ thông tin ở đây để cung cấp một câu trả lời tốt. Bạn đang sử dụng phương pháp xác thực nào? Người tiêu dùng dự định của dịch vụ web là ai (ví dụ, người dùng của trang web trên cùng một máy chủ như dịch vụ của bạn?)
McGarnagle

1
Tất cả các xác thực hiện tại của bạn là hoàn toàn hợp lý và hạn chế bề mặt tấn công của bạn, nhưng chúng không thực sự giải quyết bất cứ điều gì liên quan đến lỗ hổng CSRF.
Cheekysoft 13/12/12


2
@ DavidBalažic Véc tơ gì? Nếu bạn đang nói về AJAX, các chính sách cùng nguồn gốc sẽ ngăn chặn điều đó.
djsmith

Câu trả lời:


73

Rèn yêu cầu CSRF tùy ý với các loại phương tiện truyền thông tùy ý là hiệu quả chỉ có thể với XHR, bởi vì một phương pháp của hình thức được giới hạn GET và POST và một nội dung thư POST của hình thức cũng giới hạn trong ba định dạng application/x-www-form-urlencoded, multipart/form-datatext/plain . Tuy nhiên, với mã hóa dữ liệu biểu mẫu text/plain, vẫn có thể giả mạo các yêu cầu chứa dữ liệu JSON hợp lệ .

Vì vậy, mối đe dọa duy nhất đến từ các cuộc tấn công CSRF dựa trên XHR. Và những điều đó sẽ chỉ thành công nếu chúng có cùng nguồn gốc, vì vậy về cơ bản từ trang web của bạn bằng cách nào đó (ví dụ: XSS). Hãy cẩn thận để không nhầm lẫn khi tắt CORS (tức là không đặt Access-Control-Allow-Origin: *) làm biện pháp bảo vệ. CORS chỉ đơn giản là ngăn không cho khách hàng đọc phản hồi. Toàn bộ yêu cầu vẫn được máy chủ gửi và xử lý.


9
Như tôi đã nhận xét về câu trả lời được liên kết của bạn, tôi khẳng định rằng văn bản / trơn thực sự có thể được sử dụng để giả mạo JSON nếu máy chủ không yêu cầu ứng dụng / json, sử dụng các kỹ thuật tương tự như pentestmonkey.net/blog/csrf-xml-post-request .

8
Câu trả lời đó đúng cho đến ngày hôm nay, nhưng có lẽ sẽ sai ngay thôi. W3C đang xem xét thêm enctype = "application / json" vào tiêu chuẩn HTML: darobin.github.io/formic/specs/json Vì vậy, đừng dựa vào loại nội dung POST để bảo mật lâu dài, hãy sử dụng mã thông báo chống CSRF.
LordOfThePigs,

@LordOfThePigs Việc giả mạo JSON hợp lệ đã có thể thực hiện được với văn bản / thuần túy .
Gumbo,

@Gumbo đúng, nhưng bạn hiện không thể đặt enctype application/jsonđược dùng để ngăn chặn các cuộc tấn công CSRF trong câu trả lời này. Tiêu chuẩn được đề xuất sẽ cho phép bạn đặt enctype thành application/json, điều này sẽ đánh bại các kiểm tra loại nội dung được nêu trong câu trả lời và mở ứng dụng lên CSRF.
LordOfThePigs,

10
Có vẻ như bản nháp đã xử lý trước cuộc tấn công này. Phần 5 chỉ định rằng các application/jsonbài đăng trên biểu mẫu phải tuân theo cùng một chính sách nguồn gốc, nghĩa là cuộc tấn công không mạnh hơn XHR.
James_pic

3

Có, nó là có thể. Bạn có thể thiết lập một máy chủ của kẻ tấn công, máy chủ này sẽ gửi lại chuyển hướng 307 đến máy chủ đích đến máy nạn nhân. Bạn cần sử dụng flash để gửi ĐĂNG thay vì sử dụng Biểu mẫu.

Tham khảo: https://bugzilla.mozilla.org/show_bug.cgi?id=1436241

Nó cũng hoạt động trên Chrome.


1

Có thể thực hiện CSRF trên các dịch vụ Restful dựa trên JSON bằng cách sử dụng Ajax. Tôi đã thử nghiệm điều này trên một ứng dụng (sử dụng cả Chrome và Firefox). Bạn phải thay đổi contentType thành văn bản / thuần túy và dataType thành JSON để đáp ứng yêu cầu preflight. Sau đó, bạn có thể gửi yêu cầu, nhưng để gửi sessiondata, bạn cần đặt cờ withCredentials trong yêu cầu ajax của mình. Tôi thảo luận chi tiết hơn về vấn đề này ở đây (bao gồm tài liệu tham khảo):

http://wsecblog.blogspot.be/2016/03/csrf-with-json-post-via-ajax.html


Điều đó là không cần thiết. Nếu máy chủ đọc các yêu cầu bản rõ dưới dạng JSON, một biểu mẫu được mã hóa dưới dạng bản rõ là đủ để tạo ra yêu cầu đó, như Gumbo đã đề cập. Máy chủ API chỉ nên từ chối yêu cầu văn bản rõ.
Franklin Yu

-1

Tôi có một số nghi ngờ liên quan đến điểm 3. Mặc dù nó có thể được coi là an toàn vì nó không làm thay đổi dữ liệu ở phía máy chủ, nhưng dữ liệu vẫn có thể được đọc và rủi ro là chúng có thể bị đánh cắp.

http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx/


1
Điều đó chỉ hoạt động nếu đối tượng cấp cao nhất được API trả về là một mảng JSON, vì Javascript cho phép ghi đè phương thức khởi tạo Mảng. Một đối tượng cấp cao nhất là an toàn. Thông tin thêm tại flask.pocoo.org/docs/0.10/security/#json-security .
btubbs

Theo chính tác giả, " Tôi không nghĩ rằng bất kỳ trình duyệt hiện đại nào có lỗ hổng này nữa ".
Franklin Yu

-6

Một dịch vụ web có dễ bị tấn công CSRF không nếu những điều sau là đúng?

Đúng. Nó vẫn là HTTP.

Các yêu cầu PUT và DELETE có bao giờ dễ bị CSRF không?

Đúng

có vẻ như hầu hết (tất cả?) trình duyệt không cho phép các phương pháp này trong các biểu mẫu HTML

Bạn có nghĩ rằng trình duyệt là cách duy nhất để thực hiện một yêu cầu HTTP không?


3
Chỉ vì một dịch vụ sử dụng HTTP không làm cho nó dễ bị CSRF. Bạn có thể xác định một vectơ tấn công CSRF thực tế mà dịch vụ này, như được mô tả, dễ bị tấn công không? Và tất nhiên, tôi không nghĩ rằng trình duyệt là cách duy nhất để thực hiện một yêu cầu HTTP, nhưng trình duyệt đó là cách phổ biến nhất (duy nhất?) Để người dùng bị lừa đưa ra một yêu cầu giả mạo, xuyên trang mà họ không chờ đợi.
djsmith

Nói cách khác, chỉ cho tôi một vectơ tấn công CSRF cụ thể sử dụng PUT để lừa người dùng gửi yêu cầu PUT tới dịch vụ web của tôi (như được mô tả). Tôi tin rằng điều đó là không thể.
djsmith

@symcbean: Bạn có thể vui lòng đăng tài liệu tham khảo hoặc bảo vệ câu trả lời của mình không? Tôi đã không bình chọn cho câu trả lời này, trước tiên tôi muốn bạn đánh tiếng. Cảm ơn.
dotancohen

Google lại ngừng hoạt động? Bỏ qua vấn đề loại nội dung, các phiên bản cũ của Flash (các phiên bản flash gần đây hơn có mô hình kiểm soát thống trị chéo - nhưng nó khác với HTML5) - còn về buôn lậu jar - pseudo-flaw.net/content/web-baries/corrupt -jars (Java thực thi trong ngữ cảnh hoạt động nhưng có thể gọi javascript trong ngữ cảnh thụ động). Sau đó có DNS rebinding tấn công và tấn công MITM
symcbean

Các plugin trình duyệt có thể đọc cookie CSRF của bạn và gửi bất kỳ tiêu đề nào họ muốn, vì vậy ngay cả các cơ chế thực thi CSRF tiêu chuẩn của defacto cũng dễ bị tấn công bởi một plugin trình duyệt độc hại.
djsmith
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.