Điều gì để ngăn chặn mã độc từ giả mạo tiêu đề của Origin Origin để khai thác CORS?


142

Theo cách tôi hiểu, nếu tập lệnh phía máy khách đang chạy trên một trang từ foo.com muốn yêu cầu dữ liệu từ bar.com, trong yêu cầu, nó phải chỉ định tiêu đề Origin: http://foo.comvà thanh phải đáp ứng Access-Control-Allow-Origin: http://foo.com.

Có gì để ngăn chặn mã độc từ trang web roh.com chỉ đơn giản là giả mạo tiêu đề Origin: http://foo.comđể yêu cầu các trang từ thanh?


2
Tôi tin rằng vấn đề là tên miền ban đầu mà trang được cung cấp từ (ở đây foo.com) phải cung cấp Access-Control-Allow-Origintiêu đề nếu không trình duyệt không cho phép yêu cầu bar.com.
Chris Hayes

2
Đọc qua bài viết này thực sự giúp tôi hiểu được quá trình xử lý giữa trình duyệt, máy chủ gốc và máy chủ đích. html5rocks.com/en/tutorials/cors
brendonparker

5
@ChrisHayes Đó không phải là cách CORS hoạt động. Bạn có thể đọc thêm về điều này một chút bằng cách xem thông số kỹ thuật hoặc trang wiki MDN tuyệt vời này về chủ đề này .
Ray Nicholus

1
@enamendonparker Vâng, đó là một bài viết tuyệt vời. Tác giả đó trả lời rất nhiều câu hỏi của CORS về SO, và cũng duy trì enable-cors.org .
Ray Nicholus

4
@RayNicholus Thú vị, tôi rõ ràng là cách. Cảm ơn các liên kết. Đánh giá bằng số phiếu trên bình luận của tôi Tôi không phải là người duy nhất chịu đựng ảo tưởng này. Tôi hy vọng hai người đó quay lại và học hỏi (và bỏ phiếu bầu của họ!).
Chris Hayes

Câu trả lời:


149

Các trình duyệt kiểm soát việc đặt Origintiêu đề và người dùng không thể ghi đè giá trị này. Vì vậy, bạn sẽ không thấy Origintiêu đề giả mạo từ trình duyệt. Người dùng độc hại có thể tạo một yêu cầu cuộn tròn tự đặt Origintiêu đề, nhưng yêu cầu này sẽ đến từ bên ngoài trình duyệt và có thể không có thông tin cụ thể về trình duyệt (như cookie).

Hãy nhớ rằng: CORS không bảo mật. Đừng dựa vào CORS để bảo mật trang web của bạn. Nếu bạn đang phục vụ dữ liệu được bảo vệ, hãy sử dụng cookie hoặc mã thông báo OAuth hoặc thứ gì đó không phải là Origintiêu đề để bảo mật dữ liệu đó. Các Access-Control-Allow-Origintiêu đề trong CORS chỉ mệnh lệnh mà nguồn gốc nên được phép đưa ra yêu cầu cross-xứ. Đừng dựa vào nó để làm gì thêm.


3
Điều này làm cho rất nhiều ý nghĩa. Nếu trình duyệt không cho phép JavaScript ghi đè tiêu đề Origin, thì không có vấn đề gì. Nếu bạn đang thực hiện các yêu cầu từ bên ngoài trình duyệt, bạn sẽ không có cookie. Tôi đoán rằng tôi đã nhầm lẫn bởi vì trong tất cả các tài liệu tôi đang đọc, không nơi nào nói rõ ràng rằng tiêu đề Origin không thể bị ghi đè. Cảm ơn!
Jay Lamont

41
Nếu ai đó muốn giả mạo một cái gì đó, thì họ có thể làm như vậy. Sử dụng khá nhiều ngôn ngữ kịch bản lệnh, họ có thể tạo các yêu cầu http. Perl và Python có các thư viện http giúp việc này khá dễ dàng. Các thư viện lưu trữ và gửi cookie, cho phép bạn thêm các tiêu đề tùy ý và cung cấp nhiều thông tin gỡ lỗi. Vì vậy, các tiêu đề CORS chỉ gây khó khăn hơn cho javascript độc hại trên một diễn đàn mà bạn đọc để làm điều gì đó khó chịu với tài khoản ngân hàng của bạn trên một tên miền khác khi bạn đăng nhập vào cả hai trong trình duyệt của mình.
Mnebuerquo

9
Và chỉ cần làm rõ, người dùng độc hại có thể chỉ cần tạo ra một phiên bản trình duyệt đã được vá để cho phép họ kiểm soát thủ công đối với tiêu đề Origin và sau đó mạo danh một cách hoàn hảo một người dùng bình thường, cookie, AJAX và tất cả.
Jordan Rieger

10
"Các trình duyệt kiểm soát việc đặt tiêu đề Xuất xứ và người dùng không thể ghi đè giá trị này." Tôi chắc chắn rất dễ sử dụng một công cụ như Fiddler2 hoặc Charles để sửa đổi các tiêu đề một khi yêu cầu rời khỏi trình duyệt.
Asa

3
người dùng độc hại có thể đơn giản sinh ra một phiên bản trình duyệt đã được vá để cho phép họ kiểm soát thủ công đối với tiêu đề Origin Nếu bạn có quyền truy cập vào máy đến điểm mà bạn có thể 'đơn giản sinh ra một phiên bản trình duyệt được vá' (thực ra nghe không đơn giản với tôi), tại sao không trực tiếp đọc cookie từ đĩa? Chúng được lưu trữ trong văn bản đơn giản mà bạn biết. Trong cuộc sống thực, kịch bản chéo trang là một mối đe dọa thực sự, trong khi kịch bản tấn công của bạn chỉ là giả tạo và không thực tế.
Stijn de Witt

35

TLDR: Không có gì ngăn chặn mã độc từ giả mạo nguồn gốc. Khi điều đó xảy ra, máy chủ của bạn sẽ không bao giờ biết về nó và sẽ hành động theo yêu cầu. Đôi khi những yêu cầu đó là đắt tiền. Vì vậy, không sử dụng CORS thay cho bất kỳ loại bảo mật nào.


Gần đây tôi đã chơi xung quanh với CORS và tôi đã tự hỏi mình câu hỏi tương tự. Những gì tôi đã tìm thấy là trình duyệt có thể đủ thông minh để biết yêu cầu CORS giả mạo khi thấy yêu cầu, nhưng máy chủ của bạn không thông minh.

Điều đầu tiên tôi tìm thấy là Origintiêu đề là tên tiêu đề bị cấm HTTP không thể sửa đổi theo chương trình. Điều đó có nghĩa là bạn có thể sửa đổi nó trong khoảng 8 giây bằng cách sử dụng Tiêu đề sửa đổi cho Google Chrome .

Để kiểm tra điều này, tôi thiết lập hai miền Máy khách và một miền Máy chủ. Tôi đã bao gồm một danh sách trắng CORS trên Máy chủ, cho phép các yêu cầu CORS từ Máy khách 1 nhưng không phải từ Máy khách 2. Tôi đã thử nghiệm cả hai máy khách và thực sự các yêu cầu CORS của Máy khách 1 đã thành công trong khi Máy khách 2 không thành công.

Sau đó, tôi giả mạo Origintiêu đề của Client 2 để khớp với Client 1. Máy chủ đã nhận được Origintiêu đề giả mạo và đã vượt qua kiểm tra danh sách trắng (hoặc thất bại nếu bạn là một anh chàng nửa người nửa ly). Sau đó, Máy chủ đã thực hiện một cách nghiêm túc bằng cách tiêu thụ tất cả các tài nguyên mà nó được thiết kế để tiêu thụ (cuộc gọi cơ sở dữ liệu, gửi email đắt tiền, gửi tin nhắn sms thậm chí còn đắt hơn, v.v.). Khi đã xong, máy chủ vui vẻ gửi Access-Control-Allow-Origintiêu đề giả mạo trở lại trình duyệt.

Tài liệu tôi đã đọc nói rằng Access-Control-Allow-Origingiá trị nhận được phải khớp Originchính xác với giá trị được gửi trong yêu cầu. Chúng khớp nhau, vì vậy tôi rất ngạc nhiên khi thấy thông báo sau trong Chrome:

XMLHttpRequest không thể tải http://server.dev/test. Tiêu đề 'Kiểm soát truy cập-Cho phép-Xuất xứ' có giá trị http://client1.dev không bằng nguồn gốc được cung cấp. Nguồn gốc http://client2.dev do đó không được phép truy cập.

Các tài liệu tôi đọc dường như không chính xác. Tab mạng của Chrome hiển thị rõ ràng cả tiêu đề yêu cầu và phản hồi http://client1.dev, nhưng bạn có thể thấy trong lỗi mà Chrome bằng cách nào đó biết nguồn gốc thực sự http://client2.devvà từ chối chính xác phản hồi. Điều này không thành vấn đề tại thời điểm này vì máy chủ đã chấp nhận yêu cầu giả mạo và tiêu tiền của tôi.


2
@Nocturno, cảm ơn bạn vì ví dụ. Hãy để tôi thêm quan sát của tôi. CORS liên quan đến các tính năng an toàn của trình duyệt. Nếu một trình duyệt an toàn được sửa đổi từ trạng thái nguyên sơ của nó, điều đó có thể được hiểu là trình duyệt có thể thiếu tính năng an toàn.
Luka itnik

10
Không rực rỡ chút nào. Nó hoàn toàn bỏ lỡ quan điểm của CORS. Nếu bạn đang ở vị trí để chặn các yêu cầu có nguồn gốc từ máy của người dùng, bạn chỉ cần đọc cookie của họ, cài đặt keylogger, viruss và tất cả những mối đe dọa thực sự khác. CORS có mặt để bảo vệ người dùng trung thực đăng nhập vào trang A khỏi tập lệnh độc hại bằng cách nào đó đã được đưa vào trang web B. Tập lệnh trên trang B (có thể là đoạn mã Javascript trong bài đăng trên diễn đàn không được thoát khỏi trang B) hành động trên trang A trong tài khoản của người dùng (ví dụ: xóa nội dung, v.v.), sử dụng cookie phiên từ trang A.
Stijn de Witt

3
Điều này được gọi là kịch bản chéo trang và không có CORS có thể được thực hiện mà không cần phải giành quyền kiểm soát máy của người dùng. Đó là toàn bộ vấn đề. Không cần kiểm soát máy của người dùng vì khi yêu cầu trang web Trình duyệt được sử dụng để tự động thêm cookie phiên vào yêu cầu để nó trông giống như một yêu cầu hợp lệ từ chính người dùng khi thực tế nó đến từ một tập lệnh khác Địa điểm. Chính sách cùng nguồn gốc ngăn chặn nó và CORS được sử dụng để liệt kê các tên miền cần được cấp quyền truy cập ngay cả khi chúng ở trên một nguồn gốc khác.
Stijn de Witt

3
@Nocturno Vâng, tôi có thể hơi thô thiển, xin lỗi về điều đó. Điểm ban đầu của bạn đứng. Chính sách cùng nguồn gốc là một tính năng bảo mật của trình duyệt và CORS là một cơ chế làm suy yếu tính bảo mật đó bằng cách liệt kê một số tên miền. OP cần phải hiểu rằng việc giả mạo tiêu đề Origin không thực sự khả thi như một 'cuộc tấn công' vì nó không mang lại cho bạn bất cứ điều gì không thể có với ví dụ như curl.
Stijn de Witt

3
@Nocturno Tôi nghĩ câu mở đầu của bạn hơi sai lệch. There's nothing stopping malicious code from spoofing the origin-> Có, javascript không thể thiết lập Origin. Có, người dùng có thể sửa đổi trình duyệt / sử dụng fiddler của họ để thay đổi nguồn gốc, nhưng đó không phải là điều mà CORS đang bảo vệ; trang web do kẻ tấn công kiểm soát không thể thay đổi Origin, đó là tất cả những gì quan trọng.
RJFalconer

12

Chỉ là một gói khiêm tốn:

H: Chính sách nguồn gốc tương tự (SOP) chỉ được thi hành bởi các trình duyệt?
A: Vâng. Đối với tất cả các cuộc gọi bạn thực hiện trong trình duyệt, SOP chắc chắn được trình duyệt áp dụng. Máy chủ có thể hoặc không thể kiểm tra nguồn gốc của yêu cầu.

H: Nếu một yêu cầu không tuân thủ SOP, trình duyệt có chặn yêu cầu đó không?
A: Không, nó vượt quá thẩm quyền của trình duyệt. Các trình duyệt chỉ cần gửi các yêu cầu nguồn gốc chéo và chờ phản hồi để xem liệu cuộc gọi được báo hiệu hợp pháp bởi máy chủ thông qua Access-Control- * tiêu đề. Nếu máy chủ không gửi lại Access-Control-Allow-Origintiêu đề, không phản hồi lại nguồn gốc của người gọi hoặc không gửi lại *trong tiêu đề, thì tất cả những gì trình duyệt sẽ làm là kiềm chế không cung cấp phản hồi cho người gọi.

Q: Có nghĩa là tôi không thể giả mạo Origin?
Trả lời: Trong trình duyệt và sử dụng tập lệnh, bạn không thể ghi đè Originvì nó nằm trong sự kiểm soát của trình duyệt. Tuy nhiên, nếu bạn muốn tự hack, bạn có thể giả mạo các cuộc gọi ra khỏi trình duyệt CỦA BẠN bằng cách sử dụng các tiện ích mở rộng trình duyệt hoặc các công cụ khác mà bạn cài đặt trên máy. Bạn cũng có thể phát hành HTTPcác cuộc gọi sử dụng curl, Python, C#, vv và thay đổi Origintiêu đề để các máy chủ lừa.

Q: Vậy nếu tôi có thể lừa máy chủ bằng cách thay đổi Origin, điều đó có nghĩa CORSlà không an toàn?
A: CORS per se im lặng về bảo mật - tức là xác thực và ủy quyền các yêu cầu. Tùy thuộc vào máy chủ để kiểm tra các yêu cầu và xác thực / ủy quyền cho chúng theo bất kỳ cơ chế nào chúng hoạt động với như cookie và tiêu đề. Phải nói rằng, nó có thể bảo vệ chúng ta nhiều hơn một chút trong trường hợp các cuộc tấn công như XSS:

Ví dụ: Giả sử bạn đã đăng nhập vào trang web của mình và một tập lệnh độc hại cố gắng gửi yêu cầu đến trang web ngân hàng của bạn để hỏi về số dư của bạn: một cuộc tấn công XSS được phản ánh . Trang web ngân hàng của bạn tin tưởng các thông tin đến từ (ở đây thay mặt) trang web của bạn để yêu cầu được xác thực và HTTPphản hồi nhằm mục đích mã độc được phát hành. Nếu trang web ngân hàng của bạn không quan tâm đến việc chia sẻ điểm cuối của nó với các nguồn gốc khác, thì nó không bao gồmAccess-Control-Allow-Origintiêu đề trong phản ứng. Bây giờ, khi nhận được yêu cầu, trình duyệt nhận ra rằng yêu cầu đó là yêu cầu Nguồn gốc chéo, nhưng phản hồi không cho thấy rằng máy chủ rất vui khi chia sẻ tài nguyên (ở đây là điểm cuối truy vấn số dư) với trang web của bạn. Vì vậy, nó phá vỡ dòng chảy, do đó kết quả trả về sẽ không bao giờ đạt đến mã độc.


Đẹp, tốt hơn / rõ ràng hơn câu trả lời được chấp nhận IMO
3dGrabber
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.