CORS - Misconfigurations & Bypass
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Cross-Origin Resource Sharing (CORS) standard omogućava serverima da definišu ko može da pristupi njihovim resursima i koje HTTP metode zahteva su dozvoljene iz spoljašnjih izvora.
Politika iste domene nalaže da server koji zahteva resurs i server koji hostuje resurs dele isti protokol (npr., http://
), naziv domena (npr., internal-web.com
), i port (npr., 80). Prema ovoj politici, samo web stranice sa iste domene i porta imaju dozvoljen pristup resursima.
Primena politike iste domene u kontekstu http://normal-website.com/example/example.html
ilustrovana je na sledeći način:
http://normal-website.com/example/
Da: Identičan protokol, domena i port
http://normal-website.com/example2/
Da: Identičan protokol, domena i port
https://normal-website.com/example/
Ne: Drugačiji protokol i port
http://en.normal-website.com/example/
Ne: Drugačija domena
http://www.normal-website.com/example/
Ne: Drugačija domena
http://normal-website.com:8080/example/
Ne: Drugi port*
*Internet Explorer zanemaruje broj porta prilikom primene politike iste domene, čime omogućava ovaj pristup.
Access-Control-Allow-Origin
HeaderOvaj header može dozvoliti više izvora, null
vrednost, ili wildcard *
. Međutim, nijedan pretraživač ne podržava više izvora, a korišćenje wildcard *
podložno je ograničenjima. (Wildcard mora biti korišćen sam, a njegovo korišćenje zajedno sa Access-Control-Allow-Credentials: true
nije dozvoljeno.)
Ovaj header je izdat od strane servera kao odgovor na zahtev za resursom iz druge domene koji je pokrenula web stranica, pri čemu pretraživač automatski dodaje Origin
header.
Access-Control-Allow-Credentials
HeaderPo default-u, zahtevi iz druge domene se šalju bez kredencijala kao što su kolačići ili Authorization header. Ipak, server iz druge domene može dozvoliti čitanje odgovora kada su kredencijali poslati postavljanjem Access-Control-Allow-Credentials
header-a na true
.
Ako je postavljen na true
, pretraživač će preneti kredencijale (kolačiće, autorizacione heder-e, ili TLS klijentske sertifikate).
Kada se pokreće zahtev između domena pod specifičnim uslovima, kao što su korišćenje nestandardne HTTP metode (bilo šta osim HEAD, GET, POST), uvođenje novih zaglavlja, ili korišćenje posebne vrednosti zaglavlja Content-Type, može biti potreban pre-flight zahtev. Ovaj preliminarni zahtev, koji koristi OPTIONS
metodu, služi da obavesti server o namerama nadolazećeg cross-origin zahteva, uključujući HTTP metode i zaglavlja koja namerava da koristi.
Protokol Cross-Origin Resource Sharing (CORS) zahteva ovu pre-flight proveru kako bi se utvrdila izvodljivost tražene cross-origin operacije verifikovanjem dozvoljenih metoda, zaglavlja i pouzdanosti porekla. Za detaljno razumevanje uslova koji zaobilaze potrebu za pre-flight zahtevom, pogledajte sveobuhvatan vodič koji pruža Mozilla Developer Network (MDN).
Važno je napomenuti da odsustvo pre-flight zahteva ne ukida obavezu da odgovor nosi autorizacijska zaglavlja. Bez ovih zaglavlja, pregledač je onemogućen u svojoj sposobnosti da obradi odgovor iz cross-origin zahteva.
Razmotrite sledeću ilustraciju pre-flight zahteva koji ima za cilj korišćenje PUT
metode zajedno sa prilagođenim zaglavljem pod nazivom Special-Request-Header
:
U odgovoru, server može vratiti zaglavlja koja ukazuju na prihvaćene metode, dozvoljeni izvor i druge detalje CORS politike, kao što je prikazano u nastavku:
Access-Control-Allow-Headers
: Ova zaglavlja specificira koja zaglavlja mogu biti korišćena tokom stvarnog zahteva. Postavlja ga server da označi dozvoljena zaglavlja u zahtevima od klijenta.
Access-Control-Expose-Headers
: Kroz ovo zaglavlje, server obaveštava klijenta o tome koja zaglavlja mogu biti izložena kao deo odgovora pored jednostavnih zaglavlja odgovora.
Access-Control-Max-Age
: Ova zaglavlja označava koliko dugo rezultati pre-flight zahteva mogu biti keširani. Server postavlja maksimalno vreme, u sekundama, koje se informacije vraćene pre-flight zahtevom mogu ponovo koristiti.
Access-Control-Request-Headers
: Koristi se u pre-flight zahtevima, ovo zaglavlje postavlja klijent da obavesti server o tome koja HTTP zaglavlja klijent želi da koristi u stvarnom zahtevu.
Access-Control-Request-Method
: Ova zaglavlja, takođe korišćena u pre-flight zahtevima, postavlja klijent da označi koja HTTP metoda će biti korišćena u stvarnom zahtevu.
Origin
: Ova zaglavlja automatski postavlja pregledač i označava poreklo cross-origin zahteva. Koristi ga server da proceni da li bi dolazni zahtev trebao biti dozvoljen ili odbijen na osnovu CORS politike.
Napomena da obično (u zavisnosti od tipa sadržaja i postavljenih zaglavlja) u GET/POST zahtevu ne šalje se pre-flight zahtev (zahtev se šalje direktno), ali ako želite da pristupite zaglavljima/telu odgovora, mora sadržati Access-Control-Allow-Origin zaglavlje koje to dozvoljava. Stoga, CORS ne štiti od CSRF (ali može biti od pomoći).
Access-Control-Request-Local-Network
: Ova zaglavlja se uključuje u zahtev klijenta da označi da je upit usmeren na resurs lokalne mreže. Služi kao oznaka da obavesti server da zahtev potiče iz lokalne mreže.
Access-Control-Allow-Local-Network
: U odgovoru, serveri koriste ovo zaglavlje da komuniciraju da je traženi resurs dozvoljeno deliti sa entitetima van lokalne mreže. Deluje kao zeleno svetlo za deljenje resursa preko različitih mrežnih granica, osiguravajući kontrolisan pristup uz održavanje sigurnosnih protokola.
Validan odgovor koji dozvoljava zahtev lokalne mreže takođe treba da ima u odgovoru zaglavlje Access-Controls-Allow-Local_network: true
:
Napomena da linux 0.0.0.0 IP radi na bypass ovih zahteva za pristup localhost-u jer se ta IP adresa ne smatra "lokalnom".
Takođe je moguće bypass-ovati zahteve za lokalnu mrežu ako koristite javnu IP adresu lokalnog krajnjeg uređaja (kao što je javna IP adresa rutera). Jer u nekoliko slučajeva, čak i ako se pristupa javnoj IP, ako je iz lokalne mreže, pristup će biti odobren.
Napomena da čak i ako sledeća konfiguracija može izgledati veoma permisivno:
Ovo nije dozvoljeno od strane pregledača i stoga akreditivi neće biti poslati sa zahtevom koji je dozvoljen ovim.
Primećeno je da je postavljanje Access-Control-Allow-Credentials
na true
preduslov za većinu pravih napada. Ova postavka omogućava pregledaču da šalje akreditive i čita odgovor, čime se povećava efikasnost napada. Bez ovoga, korist od toga da pregledač izda zahtev umesto da to uradi sam smanjuje se, jer korišćenje korisnikovih kolačića postaje neizvodljivo.
Postoji izuzetak gde mrežna lokacija žrtve deluje kao oblik autentifikacije. Ovo omogućava korišćenje pregledača žrtve kao proksija, zaobilaženje autentifikacije zasnovane na IP-u za pristup intranet aplikacijama. Ova metoda deli sličnosti u uticaju sa DNS rebinding, ali je jednostavnija za iskorišćavanje.
Origin
u Access-Control-Allow-Origin
Scenarij iz stvarnog sveta gde se vrednost Origin
zaglavlja odražava u Access-Control-Allow-Origin
je teoretski malo verovatan zbog ograničenja u kombinovanju ovih zaglavlja. Međutim, programeri koji žele da omoguće CORS za više URL-ova mogu dinamički generisati zaglavlje Access-Control-Allow-Origin
kopirajući vrednost zaglavlja Origin
. Ovaj pristup može uvesti ranjivosti, posebno kada napadač koristi domen sa imenom koje izgleda legitimno, obmanjujući logiku validacije.
null
poreklanull
poreklo, određeno za situacije kao što su preusmeravanja ili lokalne HTML datoteke, ima jedinstvenu poziciju. Neke aplikacije stavljaju ovo poreklo na belu listu kako bi olakšale lokalni razvoj, nenamerno omogućavajući bilo kojoj veb stranici da imitira null
poreklo putem sandbox iframe-a, čime se zaobilaze CORS ograničenja.
Kada se susretnete sa belom listom domena, ključno je testirati mogućnosti za zaobilaženje, kao što je dodavanje domena napadača na belu listu ili iskorišćavanje ranjivosti preuzimanja poddomena. Pored toga, regularni izrazi korišćeni za validaciju domena mogu zanemariti nijanse u konvencijama imenovanja domena, što predstavlja dodatne mogućnosti za zaobilaženje.
Regex obrasci obično se fokusiraju na alfanumeričke, tačku (.) i crticu (-), zanemarujući druge mogućnosti. Na primer, naziv domena napravljen da uključuje karaktere koje pregledači i regex obrasci drugačije tumače može zaobići bezbednosne provere. Kako Safari, Chrome i Firefox obrađuju karaktere donje crte u poddomenima ilustruje kako se takve razlike mogu iskoristiti za zaobilaženje logike validacije domena.
Za više informacija i podešavanja ove provere zaobilaženja: https://www.corben.io/advanced-cors-techniques/ i https://medium.com/bugbountywriteup/think-outside-the-scope-advanced-cors-exploitation-techniques-dad019c68397
Programeri često implementiraju odbrambene mehanizme kako bi se zaštitili od CORS eksploatacije beljenjem domena koji su dozvoljeni da traže informacije. I pored ovih mera opreza, bezbednost sistema nije nepogrešiva. Prisutnost čak i jednog ranjivog poddomena unutar belih listi domena može otvoriti vrata CORS eksploataciji kroz druge ranjivosti, kao što je XSS (Cross-Site Scripting).
Da ilustrujemo, razmotrite scenario u kojem je domen, requester.com
, stavljen na belu listu da pristupa resursima sa drugog domena, provider.com
. Konfiguracija na serverskoj strani može izgledati ovako:
U ovoj postavci, svi poddomeni requester.com
imaju dozvoljen pristup. Međutim, ako je poddomen, recimo sub.requester.com
, kompromitovan sa XSS ranjivošću, napadač može iskoristiti ovu slabost. Na primer, napadač sa pristupom sub.requester.com
mogao bi iskoristiti XSS ranjivost da zaobiđe CORS politike i zlonamerno pristupi resursima na provider.com
.
PortSwigger-ova URL validation bypass cheat sheet otkrila je da neki pregledači podržavaju čudne karaktere unutar imena domena.
Chrome i Firefox podržavaju donje crte _
koje mogu zaobići regex-ove implementirane za validaciju Origin
header-a:
Safari je još opušteniji u prihvatanju specijalnih karaktera u imenu domena:
Moguće je da se iskorišćavanjem trovanja keša na serverskoj strani putem injekcije HTTP header-a može izazvati skladištena ranjivost Cross-Site Scripting (XSS). Ovaj scenario se dešava kada aplikacija ne sanitizuje Origin
header od nelegalnih karaktera, stvarajući ranjivost posebno za korisnike Internet Explorer-a i Edge-a. Ovi pregledači tretiraju (0x0d) kao legitimni terminator HTTP header-a, što dovodi do ranjivosti injekcije HTTP header-a.
Razmotrite sledeći zahtev gde je Origin
header manipulisan:
Internet Explorer i Edge interpretiraju odgovor kao:
Dok direktno iskorišćavanje ove ranjivosti slanjem neispravnog zaglavlja putem web pretraživača nije izvodljivo, može se ručno generisati prilagođeni zahtev koristeći alate kao što je Burp Suite. Ova metoda može dovesti do toga da server-side keš sačuva odgovor i nenamerno ga poslužuje drugima. Prilagođeni payload ima za cilj da izmeni karakter set stranice na UTF-7, kodiranje karaktera koje se često povezuje sa XSS ranjivostima zbog svoje sposobnosti da kodira karaktere na način koji se može izvršiti kao skripta u određenim kontekstima.
Za dalju literaturu o skladištenim XSS ranjivostima, pogledajte PortSwigger.
Napomena: Iskorišćavanje ranjivosti injekcije HTTP zaglavlja, posebno kroz trovanje server-side keša, naglašava kritičnu važnost validacije i sanitizacije svih korisničkih unosa, uključujući HTTP zaglavlja. Uvek primenjujte robustan sigurnosni model koji uključuje validaciju unosa kako biste sprečili takve ranjivosti.
U ovom scenariju, primećuje se instanca web stranice koja reflektuje sadržaj prilagođenog HTTP zaglavlja bez pravilnog kodiranja. Konkretno, web stranica vraća sadržaj uključen u X-User-id
zaglavlje, koje može uključivati zlonamerni JavaScript, kao što je prikazano u primeru gde zaglavlje sadrži SVG tag za sliku dizajniran da izvrši JavaScript kod prilikom učitavanja.
Cross-Origin Resource Sharing (CORS) politike omogućavaju slanje prilagođenih zaglavlja. Međutim, bez toga da odgovor bude direktno prikazan od strane pretraživača zbog CORS ograničenja, korisnost takve injekcije može delovati ograničeno. Kritična tačka se javlja kada se razmatra ponašanje keša pretraživača. Ako Vary: Origin
zaglavlje nije specificirano, postaje moguće da zlonamerni odgovor bude keširan od strane pretraživača. Nakon toga, ovaj keširani odgovor može biti direktno prikazan prilikom navigacije na URL, zaobilazeći potrebu za direktnim prikazivanjem prilikom inicijalnog zahteva. Ovaj mehanizam poboljšava pouzdanost napada korišćenjem keširanja na klijentskoj strani.
Da ilustruje ovaj napad, pružen je JavaScript primer, dizajniran da se izvrši u okruženju web stranice, kao što je kroz JSFiddle. Ovaj skript izvršava jednostavnu radnju: šalje zahtev na određeni URL sa prilagođenim zaglavljem koje sadrži zlonamerni JavaScript. Nakon uspešnog završetka zahteva, pokušava da navigira na ciljani URL, potencijalno aktivirajući izvršenje injektovane skripte ako je odgovor keširan bez pravilnog rukovanja Vary: Origin
zaglavljem.
Evo sažetog pregleda JavaScript-a koji se koristi za izvršenje ovog napada:
XSSI, poznat i kao Cross-Site Script Inclusion, je vrsta ranjivosti koja koristi činjenicu da se Pravilo iste domene (SOP) ne primenjuje prilikom uključivanja resursa koristeći script tag. To je zato što skripte moraju moći da se uključuju sa različitih domena. Ova ranjivost omogućava napadaču da pristupi i pročita bilo koji sadržaj koji je uključen koristeći script tag.
Ova ranjivost postaje posebno značajna kada su u pitanju dinamički JavaScript ili JSONP (JSON sa Padding), posebno kada se informacije o ambijentalnim ovlašćenjima kao što su kolačići koriste za autentifikaciju. Kada se zahteva resurs sa drugog hosta, kolačići se uključuju, čineći ih dostupnim napadaču.
Da biste bolje razumeli i ublažili ovu ranjivost, možete koristiti BurpSuite dodatak dostupan na https://github.com/kapytein/jsonp. Ovaj dodatak može pomoći u identifikaciji i rešavanju potencijalnih XSSI ranjivosti u vašim web aplikacijama.
Pročitajte više o različitim vrstama XSSI i kako ih iskoristiti ovde.
Pokušajte da dodate callback
parametar u zahtev. Možda je stranica pripremljena da pošalje podatke kao JSONP. U tom slučaju, stranica će poslati nazad podatke sa Content-Type: application/javascript
, što će zaobići CORS politiku.
Jedan od načina da se zaobiđe ograničenje Access-Control-Allow-Origin
je da se zatraži od web aplikacije da napravi zahtev u vaše ime i pošalje nazad odgovor. Međutim, u ovom scenariju, akreditivi konačne žrtve neće biti poslati jer se zahtev upućuje na drugu domenu.
CORS-escape: Ovaj alat pruža proxy koji prosleđuje vaš zahtev zajedno sa njegovim zaglavljima, dok takođe lažira Origin zaglavlje da odgovara traženoj domeni. Ovo efikasno zaobilazi CORS politiku. Evo primera korišćenja sa XMLHttpRequest:
simple-cors-escape: Ovaj alat nudi alternativni pristup proxy-ju zahteva. Umesto da prosledi vaš zahtev onako kako jeste, server pravi svoj zahtev sa specificiranim parametrima.
Možete zaobići CORS provere kao što su e.origin === window.origin
tako što ćete napraviti iframe i iz njega otvoriti novi prozor. Više informacija na sledećoj stranici:
DNS rebinding putem TTL je tehnika koja se koristi za zaobilaženje određenih bezbednosnih mera manipulacijom DNS zapisa. Evo kako to funkcioniše:
Napadač kreira web stranicu i navodi žrtvu da joj pristupi.
Napadač zatim menja DNS (IP) svog domena da pokazuje na web stranicu žrtve.
Pregledač žrtve kešira DNS odgovor, koji može imati TTL (Time to Live) vrednost koja označava koliko dugo se DNS zapis treba smatrati važećim.
Kada TTL istekne, pregledač žrtve pravi novi DNS zahtev, omogućavajući napadaču da izvrši JavaScript kod na stranici žrtve.
Održavajući kontrolu nad IP adresom žrtve, napadač može prikupljati informacije od žrtve bez slanja bilo kakvih kolačića na server žrtve.
Važno je napomenuti da pregledači imaju mehanizme keširanja koji mogu sprečiti trenutnu zloupotrebu ove tehnike, čak i sa niskim TTL vrednostima.
DNS rebinding može biti koristan za zaobilaženje eksplicitnih IP provera koje vrši žrtva ili za scenarije u kojima korisnik ili bot ostaje na istoj stranici duži vremenski period, omogućavajući kešu da istekne.
Ako vam je potreban brz način za zloupotrebu DNS rebinding-a, možete koristiti usluge kao što su https://lock.cmpxchg8b.com/rebinder.html.
Da biste pokrenuli svoj DNS rebinding server, možete koristiti alate kao što je DNSrebinder (https://github.com/mogwailabs/DNSrebinder). Ovo uključuje izlaganje vašeg lokalnog porta 53/udp, kreiranje A zapisa koji pokazuje na njega (npr. ns.example.com), i kreiranje NS zapisa koji pokazuje na prethodno kreirani A poddomen (npr. ns.example.com). Bilo koji poddomen ns.example.com poddomena će tada biti rešen od strane vašeg hosta.
Možete takođe istražiti javno pokrenut server na http://rebind.it/singularity.html za dalju razumevanje i eksperimentisanje.
DNS rebinding putem DNS cache flooding je još jedna tehnika koja se koristi za zaobilaženje mehanizma keširanja pregledača i prisiljavanje drugog DNS zahteva. Evo kako to funkcioniše:
U početku, kada žrtva napravi DNS zahtev, odgovara se sa IP adresom napadača.
Da bi zaobišao mehanizam keširanja, napadač koristi servisnog radnika. Servisni radnik poplavljuje DNS keš, što efikasno briše keširano ime servera napadača.
Kada pregledač žrtve napravi drugi DNS zahtev, sada se odgovara sa IP adresom 127.0.0.1, koja obično se odnosi na localhost.
Poplavljujući DNS keš sa servisnim radnikom, napadač može manipulisati procesom DNS rezolucije i prisiliti pregledač žrtve da napravi drugi zahtev, ovaj put rešavajući na IP adresu koju napadač želi.
Još jedan način da se zaobiđe mehanizam keširanja je korišćenje više IP adresa za isti poddomen kod DNS provajdera. Evo kako to funkcioniše:
Napadač postavlja dva A zapisa (ili jedan A zapis sa dve IP adrese) za isti poddomen kod DNS provajdera.
Kada pregledač proverava ove zapise, dobija obe IP adrese.
Ako pregledač odluči da prvo koristi IP adresu napadača, napadač može poslužiti payload koji vrši HTTP zahteve na istu domenu.
Međutim, kada napadač dobije IP adresu žrtve, prestaje da odgovara pregledaču žrtve.
Pregledač žrtve, shvativši da domena ne odgovara, prelazi na korišćenje druge date IP adrese.
Pristupanjem drugoj IP adresi, pregledač zaobilazi Pravilo iste domene (SOP), omogućavajući napadaču da zloupotrebi ovo i prikupi i eksfiltrira informacije.
Ova tehnika koristi ponašanje pregledača kada su date više IP adresa za domen. Kontrolisanjem odgovora i manipulisanjem izbora IP adrese od strane pregledača, napadač može iskoristiti SOP i pristupiti informacijama od žrtve.
Napomena da da biste pristupili localhost-u, trebate pokušati da ponovo povežete 127.0.0.1 u Windows-u i 0.0.0.0 u Linux-u. Provajderi kao što su godaddy ili cloudflare nisu mi dozvolili da koristim IP 0.0.0.0, ali AWS route53 mi je dozvolio da kreiram jedan A zapis sa 2 IP adrese, od kojih je jedna "0.0.0.0"
Za više informacija možete proveriti https://unit42.paloaltonetworks.com/dns-rebinding/
Ako interni IP-ovi nisu dozvoljeni, mogli bi zaboraviti da zabrane 0.0.0.0 (radi na Linux-u i Mac-u)
Ako interni IP-ovi nisu dozvoljeni, odgovarati sa CNAME na localhost (radi na Linux-u i Mac-u)
Ako interni IP-ovi nisu dozvoljeni kao DNS odgovori, možete odgovoriti sa CNAME-ima na interne servise kao što su www.corporate.internal.
Možete pronaći više informacija o prethodnim tehnikama zaobilaženja i kako koristiti sledeći alat u govoru Gerald Doussot - State of DNS Rebinding Attacks & Singularity of Origin - DEF CON 27 Conference.
Singularity of Origin
je alat za izvođenje DNS rebinding napada. Uključuje potrebne komponente za ponovo povezivanje IP adrese DNS imena servera napada na IP adresu ciljne mašine i za posluživanje napadačkih payload-a za iskorišćavanje ranjivog softvera na ciljnoj mašini.
Koristite TLS u internim servisima
Zahtevajte autentifikaciju za pristup podacima
Validirajte Host zaglavlje
https://wicg.github.io/private-network-access/: Predlog da se uvek šalje pre-flight zahtev kada javni serveri žele da pristupe internim serverima
Fuzz moguće pogrešne konfiguracije u CORS politikama
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)