it-swarm-vi.com

Tại sao chính sách Xuất xứ tương tự lại quan trọng như vậy?

Tôi thực sự không thể hiểu đầy đủ cùng tên miền Origin nghĩa là gì. Tôi biết điều đó có nghĩa là khi nhận tài nguyên từ một tên miền khác (giả sử là tệp JS), nó sẽ chạy từ ngữ cảnh của tên miền phục vụ nó (như mã Google Analytics), có nghĩa là nó không thể sửa đổi dữ liệu hoặc đọc dữ liệu trên miền "bao gồm tài nguyên".

Vì vậy, nếu tên miền a.com đang nhúng tệp js từ google.com trong nguồn của nó, js sẽ chạy từgoogle.com và nó không thể truy cập DOM\cookies\bất kỳ yếu tố nào khác trên a.com - Tôi có đúng không?

Đây là một định nghĩa cho cùng một chính sách Xuất xứ mà tôi thực sự không thể hiểu:

Chính sách Xuất xứ giống nhau là một cơ chế chính được triển khai trong các trình duyệt được thiết kế để giữ cho nội dung đến từ các nguồn gốc khác nhau không can thiệp lẫn nhau. Về cơ bản, nội dung nhận được từ một trang web được phép đọc và sửa đổi nội dung khác nhận được từ cùng một trang nhưng không được phép truy cập nội dung nhận được từ các trang khác.

Điều đó thực sự có ý nghĩa gì? Bạn có thể vui lòng cho tôi một ví dụ thực tế cuộc sống?

Một câu hỏi khác là: mục đích của tiêu đề Origin là gì và làm thế nào để các yêu cầu tên miền chéo vẫn tồn tại? Tại sao nó không ảnh hưởng đến bảo mật hoặc chính sách Xuất xứ tương tự?

143
YSY

Tại sao chính sách Xuất xứ tương tự lại quan trọng?

Giả sử bạn đã đăng nhập vào Facebook và truy cập một trang web độc hại trong tab trình duyệt khác. Nếu không có cùng chính sách JavaScript, JavaScript trên trang web đó có thể làm bất cứ điều gì với tài khoản Facebook của bạn mà bạn được phép làm. Ví dụ: đọc tin nhắn riêng tư, đăng cập nhật trạng thái, phân tích cây HTML DOM sau khi bạn nhập mật khẩu trước khi gửi biểu mẫu.

Nhưng tất nhiên Facebook muốn sử dụng JavaScript để nâng cao trải nghiệm người dùng. Vì vậy, điều quan trọng là trình duyệt có thể phát hiện ra rằng JavaScript này được tin cậy để truy cập tài nguyên Facebook. Đó là nơi chính sách Origin xuất hiện: Nếu JavaScript được bao gồm từ trang HTML trên facebook.com, nó có thể truy cập tài nguyên facebook.com.

Bây giờ thay thế Facebook bằng trang web ngân hàng trực tuyến của bạn và rõ ràng đây là một vấn đề.

Nguồn gốc là gì?

Tôi thực sự không thể hiểu đầy đủ ý nghĩa của tên miền Origin. Tôi biết điều đó có nghĩa là khi nhận tài nguyên từ một tên miền khác (giả sử là tệp JS), nó sẽ chạy từ ngữ cảnh của tên miền phục vụ nó (như mã phân tích google), có nghĩa là nó không thể sửa đổi dữ liệu hoặc đọc dữ liệu trên miền "bao gồm tài nguyên".

Điều này không chính xác: Nguồn gốc của tệp JavaScript được xác định bởi miền của trang HTML bao gồm tệp đó. Vì vậy, nếu bạn bao gồm mã Google Analytics với -tag <script>, nó có thể làm bất cứ điều gì cho trang web của bạn nhưng không có quyền Origin giống nhau trên trang web Google.

Làm thế nào để truyền thông tên miền chéo làm việc?

Chính sách Xuất xứ tương tự không được thi hành cho tất cả các yêu cầu. Trong số những người khác, <script> - và <img> -tags có thể tìm nạp tài nguyên từ bất kỳ miền nào. Các hình thức gửi bài và liên kết đến các tên miền khác là có thể, quá. Cách khung và iframe hiển thị thông tin từ các miền khác nhưng tương tác với nội dung đó bị hạn chế.

Có một số cách tiếp cận để cho phép các lệnh gọi XMLHttpRequest (ajax) đến các miền khác một cách an toàn, nhưng chúng không được các trình duyệt phổ biến hỗ trợ tốt. Cách phổ biến để cho phép liên lạc với một tên miền khác là JSONP :

Nó dựa trên một <script> -tag. Thông tin, sẽ được gửi đến một tên miền khác, được mã hóa trong URL dưới dạng tham số. JavaScript được trả về bao gồm một lệnh gọi hàm với thông tin được yêu cầu làm tham số:

<script type="text/javascript" src="http://example.com/
     ?some-variable=some-data&jsonp=parseResponse">
</script>

JavaScript được tạo động từ example.com có ​​thể trông giống như:

parseResponse({"variable": "value", "variable2": "value2"})

Cross Site Scripting là gì?

Cross Site Scripting là một lỗ hổng cho phép kẻ tấn công tiêm mã JavaScript vào trang web, do đó nó bắt nguồn từ kẻ bị tấn công trang web từ quan điểm trình duyệt.

Điều này có thể xảy ra nếu đầu vào của người dùng không được vệ sinh đầy đủ. Ví dụ: chức năng tìm kiếm có thể hiển thị chuỗi "Kết quả tìm kiếm của bạn cho [userinput]". Nếu [userinput] không thoát được, kẻ tấn công có thể tìm kiếm:

<script>alert(document.cookie)</script>

Trình duyệt không có cách nào để phát hiện ra rằng mã này không được cung cấp bởi chủ sở hữu trang web, vì vậy nó sẽ thực thi nó. Ngày nay kịch bản chéo trang là một vấn đề lớn, vì vậy có nhiều công việc được thực hiện để ngăn chặn lỗ hổng này. Đáng chú ý nhất là cách tiếp cận Chính sách bảo mật nội dung .

122
Hendrik Brummermann

Điều đó thực sự có ý nghĩa gì? Bạn có thể vui lòng cho tôi một ví dụ thực tế cuộc sống?

Ví dụ tấn công 1: Giả mạo yêu cầu đa trang web (CSRF) với dạng HTML

Trên trang tại evil.com kẻ tấn công đã đặt:

<form method="post" action="http://bank.com/trasfer">
    <input type="hidden" name="to" value="ciro">
    <input type="hidden" name="ammount" value="100000000">
    <input type="submit" value="CLICK TO CLAIM YOUR PRIZE!!!">
</form>

Nếu không có biện pháp bảo mật hơn nữa, điều này sẽ:

  • yêu cầu không được gửi. SOP không cấm yêu cầu này được gửi.
  • nó bao gồm các cookie xác thực từ bank.com đăng nhập bạn

Đó là mẫu mã thông báo đồng bộ hóa, một mình, ngay cả khi không có SOP, ngăn điều này hoạt động.

Mẫu mã thông báo đồng bộ hóa

Đối với mọi hình thức trên bank.com, nhà phát triển tạo một chuỗi ngẫu nhiên một lần dưới dạng tham số ẩn và chỉ chấp nhận yêu cầu nếu máy chủ nhận được tham số.

Ví dụ: Trình trợ giúp HTML của Rails tự động thêm authenticity_token tham số cho HTML, vì vậy biểu mẫu hợp pháp sẽ trông như sau:

<form action="http://bank.com/transfer" method="post">
  <p><input type="hidden" name="authenticity_token"
            value="j/DcoJ2VZvr7vdf8CHKsvjdlDbmiizaOb5B8DMALg6s=" ></p>
  <p><input type="hidden" name="to"      value="ciro"></p>
  <p><input type="hidden" name="ammount" value="100000000"></p>
  <p><button type="submit">Send 100000000$ to Ciro.</button></p>
</form>

như đã đề cập tại: https: //stackoverflow.com/questions/941594/under Hiểu-the-Rails-authenticity-token/26895980 # 26895980

Vì vậy nếu evil.com thực hiện một yêu cầu bài đăng, anh ta sẽ không bao giờ đoán mã thông báo đó và máy chủ sẽ từ chối giao dịch!

Xem thêm: mẫu mã thông báo đồng bộ hóa tại OWASP .

Ví dụ tấn công 2: Giả mạo yêu cầu đa trang web (CSRF) bằng JavaScript AJAX

Nhưng sau đó, điều gì ngăn cản evil.com từ việc thực hiện 2 yêu cầu với JavaScript, giống như một trình duyệt hợp pháp sẽ làm:

  1. XHR GET cho mã thông báo
  2. XHR POST chứa mã thông báo tốt

vì thế evil.com sẽ thử một cái gì đó như thế này (jQuery vì lười biếng):

$.get('http://bank.com/transfer')
// Parse HTML reply and extract token.
$.post('http://bank.com/transfer', {
  to: 'ciro',
  ammount: '100000000',
  authenticity_token: extracted_token
})

Đây là nơi SOP phát huy tác dụng. Mặc dù $.get$.post thực sự gửi yêu cầu được xác thực giống như biểu mẫu HTML, trình duyệt của người gửi ngăn mã JavaScript đọc lại phản hồi HTML, vì yêu cầu được gửi đến một tên miền riêng!

Bảng điều khiển dành cho nhà phát triển Chromium hiển thị lỗi cho loại:

Truy cập vào XMLHttpRequest tại ' http: //bank.com ' từ Origin ' http: //evil.com ' đã bị chặn bởi chính sách CORS: Không Tiêu đề 'Kiểm soát truy cập-Cho phép-Xuất xứ' hiện diện trên tài nguyên được yêu cầu.

đã được hỏi tại: https: //stackoverflow.com/questions/20035101/why-does-my-javascript-code-get-a-no-access-control-allow-Origin-header-is- pr

Tại sao không chỉ gửi cookie yêu cầu chéo thay thế?

Điều gì xảy ra nếu việc triển khai có quy tắc như: "cho phép mọi yêu cầu, nhưng chỉ gửi cookie trên miền hiện tại XHR"? Điều đó có đơn giản hơn không?

Nhưng điều đó vẫn sẽ cho phép một kiểu tấn công khác: khi xác thực không dựa trên cookie, mà dựa trên nguồn (IP) của yêu cầu!

Ví dụ: bạn đang ở trong mạng nội bộ của công ty và từ đó bạn có thể truy cập máy chủ nội bộ, không thể nhìn thấy từ bên ngoài và phục vụ dữ liệu bí mật.

Có phải tất cả các yêu cầu Xuất xứ chéo đều bị cấm không?

Thậm chí quên CORS, không , chúng tôi làm chúng mỗi ngày!

Từ [~ # ~] mdn [~ # ~] :

  • Viết chéo nguồn gốc thường được cho phép: liên kết, chuyển hướng và gửi biểu mẫu.

    [Nhận xét của tôi]: ví dụ: khi bạn nhấp vào một liên kết, bạn thường mong muốn đăng nhập vào trang web và điều đó yêu cầu thực hiện một yêu cầu GET xác thực trả về trang mới.

  • Việc nhúng chéo nguồn gốc thường được cho phép: hình ảnh, CSS bên ngoài và Javascript, iframe.

  • Việc đọc Cross-Origin thường không được phép: XHR (ví dụ ở trên), iframe read.

    Tuy nhiên, truy cập đọc thường bị rò rỉ bằng cách nhúng. Ví dụ: bạn có thể đọc chiều rộng và chiều cao của hình ảnh được nhúng, hành động của tập lệnh được nhúng hoặc tính khả dụng của tài nguyên được nhúng (và do đó có thể nếu người dùng đăng nhập hoặc không đăng nhập một miền nhất định)

Cụ thể, có thể sử dụng một biểu mẫu trong evil.com làm cho yêu cầu được xác thực POST đến bank.com. Đây là lý do tại sao SOP là không đủ: cũng cần có mã thông báo đồng bộ hóa.

Xem thêm: CSRF tại OSWAP .

Các phương pháp phòng ngừa khác

Đừng lo lắng. Tôi thấy thật khó khăn để quấn đầu mình quá.

Về mặt lý thuyết, hóa ra Google Analytics có thể làm bất cứ điều gì họ muốn cho người dùng của bạn. (<script> tags tạo ngoại lệ để hạn chế chính sách cùng nguồn gốc)

Đó là một trong những lý do lớn nhất [~ # ~] xss [~ # ~] Các cuộc tấn công là một điều xấu và một lý do Mozilla thiết kế Chính sách bảo mật nội dung mà bây giờ đang trên đường để trở thành chuẩn hóa . (Việc triển khai HTML5 hộp cát iframe cũng có thể hữu ích)

Vì họ không thể thoát khỏi khả năng tương thích ngược, chính sách cùng nguồn gốc là về việc ngăn chặn những thứ như <iframe>XMLHttpRequest từ các thủ thuật như sử dụng cookie "Ghi nhớ tôi" hoặc hộp thoại đăng nhập nói dối để truy cập tài khoản của bạn. (Tiêu đề X-Frame-Options cho phép bạn khóa khung hình xuống hơn nữa để bảo vệ chống lại những thứ như Clickjacking .)

Tiêu đề Origin được sử dụng bởi một cơ chế có tên "Chia sẻ tài nguyên nguồn gốc chéo" cho phép các trang web cấp các ngoại lệ giới hạn cho chính sách cùng nguồn gốc để tương tác giữa các trang web an toàn. (được hỗ trợ đầy đủ trong tất cả các trình duyệt hiện tại ngoại trừ Opera và Internet Explorer và một phần trong IE8 + sử dụng đối tượng XDomainRequest độc quyền bỏ qua cookie)

Về cơ bản, khi bạn cố gắng tạo XMLHttpRequest sang một tên miền khác, trình duyệt sẽ thực hiện một trong hai điều :

  1. Nếu đó là yêu cầu GET hoặc POST đáp ứng các giới hạn nhất định (mà các nhà sản xuất tiêu chuẩn đã xác định không thêm rủi ro cho [~ # ~] csrf [~ # ~ ] các cuộc tấn công) sau đó trình duyệt chỉ chuyển yêu cầu qua.

  2. Mặt khác, nó thực hiện cái được gọi là "yêu cầu được chiếu trước", trong đó trước tiên nó sẽ gửi một yêu cầu OPTIONS và chỉ thực hiện những gì bạn yêu cầu nếu kiểm tra vượt qua yêu cầu OPTIONS.

Trong cả hai trường hợp, trình duyệt sẽ thêm tiêu đề Origin cho biết trang đích đang gọi. (Nó giống như tiêu đề Referer, nhưng được yêu cầu và được chỉ định chặt chẽ hơn để đảm bảo bảo mật chính xác)

Sau đó, máy chủ ở đầu nhận (máy chủ phụ thuộc nhiều vào chính sách Nguồn gốc bảo vệ tương tự) sau đó có thể ủy quyền cho yêu cầu bằng cách bao gồm Access-Control-Allow-Origin tiêu đề chứa * hoặc giá trị của tiêu đề Origin của yêu cầu.

Nếu không, trình duyệt chỉ cần loại bỏ phản hồi và trả về lỗi cho cuộc gọi lại Javascript. MDN đi sâu vào chi tiết (1)(2) về những gì diễn ra dưới mui xe trong cả hai kịch bản cũng như những tiêu đề khác mà hệ thống đích có thể đặt để tiếp tục thư giãn an ninh trong một thời gian kiểm soát. (ví dụ: Cho phép truy cập vào các tiêu đề HTTP tùy chỉnh bạn đang cài đặt)

GET yêu cầu và tập hợp con được phép của POST yêu cầu đã có thể được sử dụng cho các cuộc tấn công CSRF thông qua các cơ chế khác trừ khi ứng dụng web đích được bảo vệ đúng cách, do đó, đã quyết định rằng không có lợi ích nào để nhân đôi số lượng yêu cầu HTTP liên quan đến các dịch vụ vận hành như Thư viện Phông chữ của Google.

19
ssokolow

Thực tế trong trường hợp này, nguồn gốc của tập lệnh phân tích Google là a.com

Trích dẫn từ JavaScript: Hướng dẫn dứt khoát :

Điều quan trọng là phải hiểu rằng Bản gốc của tập lệnh không liên quan đến chính sách Xuất xứ giống nhau: điều quan trọng là Nguồn gốc của tài liệu mà tập lệnh được nhúng.

1
nandin