From afb4217d8b0495e7f9a46639d265cb2bd7d3fb91 Mon Sep 17 00:00:00 2001 From: Translator Date: Tue, 26 Aug 2025 17:00:48 +0000 Subject: [PATCH] Translated ['', 'src/pentesting-web/reset-password.md', 'src/pentesting- --- .../csrf-cross-site-request-forgery.md | 177 +++++---- src/pentesting-web/file-inclusion/README.md | 359 +++++++++--------- .../hacking-with-cookies/README.md | 255 +++++++------ src/pentesting-web/reset-password.md | 254 +++++++------ src/pentesting-web/sql-injection/README.md | 263 ++++++++----- 5 files changed, 726 insertions(+), 582 deletions(-) diff --git a/src/pentesting-web/csrf-cross-site-request-forgery.md b/src/pentesting-web/csrf-cross-site-request-forgery.md index 18467318a..4b4029cf1 100644 --- a/src/pentesting-web/csrf-cross-site-request-forgery.md +++ b/src/pentesting-web/csrf-cross-site-request-forgery.md @@ -2,83 +2,111 @@ {{#include ../banners/hacktricks-training.md}} -## Objašnjenje Cross-Site Request Forgery (CSRF) +## Cross-Site Request Forgery (CSRF) Objašnjeno -**Cross-Site Request Forgery (CSRF)** je vrsta sigurnosne ranjivosti koja se nalazi u web aplikacijama. Omogućava napadačima da izvrše radnje u ime nesvesnih korisnika iskorišćavanjem njihovih autentifikovanih sesija. Napad se izvršava kada korisnik, koji je prijavljen na platformu žrtve, poseti zlonamernu stranicu. Ova stranica zatim pokreće zahteve ka nalogu žrtve putem metoda kao što su izvršavanje JavaScript-a, slanje obrazaca ili preuzimanje slika. +**Cross-Site Request Forgery (CSRF)** je vrsta sigurnosne ranjivosti u web aplikacijama. Omogućava napadačima da izvode radnje u ime ničega sumnjajućih korisnika iskorišćavanjem njihovih autentifikovanih sesija. Napad se izvršava kada korisnik koji je prijavljen na žrtvinu platformu poseti zlonamerni sajt. Taj sajt potom pokreće zahteve prema nalogu žrtve kroz metode kao što su izvršavanje JavaScript-a, slanje formi ili učitavanje slika. ### Preduslovi za CSRF napad -Da bi se iskoristila CSRF ranjivost, nekoliko uslova mora biti ispunjeno: +Da bi se iskoristila CSRF ranjivost, mora biti ispunjeno nekoliko uslova: -1. **Identifikujte vrednu akciju**: Napadač treba da pronađe akciju koja vredi iskorišćavanja, kao što je promena lozinke korisnika, email-a ili povećanje privilegija. -2. **Upravljanje sesijama**: Sesija korisnika treba da se upravlja isključivo putem kolačića ili HTTP Basic Authentication zaglavlja, jer se druga zaglavlja ne mogu manipulisati u tu svrhu. -3. **Odsustvo nepredvidivih parametara**: Zahtev ne bi trebao sadržati nepredvidive parametre, jer oni mogu sprečiti napad. +1. **Identifikovati vrednu radnju**: Napadač treba da pronađe radnju vrednu iskorišćavanja, kao što su promena korisnikove lozinke, email-a ili podizanje privilegija. +2. **Upravljanje sesijom**: Sesija korisnika treba da se upravlja isključivo putem kolačića ili HTTP Basic Authentication header-a, jer druge header-e nije moguće manipulirati za ovu svrhu. +3. **Odsustvo nepredvidivih parametara**: Zahtev ne bi trebalo da sadrži nepredvidive parametre, jer oni mogu sprečiti napad. ### Brza provera -Možete **uhvatiti zahtev u Burp-u** i proveriti CSRF zaštite, a da biste testirali iz pregledača, možete kliknuti na **Copy as fetch** i proveriti zahtev: +Možete **uhvatiti zahtev u Burp-u** i proveriti CSRF zaštite, a da biste testirali iz pregledača možete kliknuti na **Copy as fetch** i proveriti zahtev:
-### Odbrana od CSRF +### Odbrana protiv CSRF -Nekoliko mera zaštite može se implementirati kako bi se zaštitili od CSRF napada: +Nekoliko protmera može biti implementirano da bi se zaštitilo od CSRF napada: -- [**SameSite kolačići**](hacking-with-cookies/index.html#samesite): Ova atribut sprečava pregledač da šalje kolačiće zajedno sa zahtevima sa drugih sajtova. [Više o SameSite kolačićima](hacking-with-cookies/index.html#samesite). -- [**Deljenje resursa između različitih domena**](cors-bypass.md): CORS politika sajta žrtve može uticati na izvodljivost napada, posebno ako napad zahteva čitanje odgovora sa sajta žrtve. [Saznajte više o CORS zaobilaženju](cors-bypass.md). -- **Verifikacija korisnika**: Pitanje za lozinku korisnika ili rešavanje captcha može potvrditi nameru korisnika. -- **Proveravanje Referrer ili Origin zaglavlja**: Validacija ovih zaglavlja može pomoći da se osigura da zahtevi dolaze iz pouzdanih izvora. Međutim, pažljivo kreiranje URL-ova može zaobići loše implementirane provere, kao što su: - - Korišćenje `http://mal.net?orig=http://example.com` (URL se završava sa pouzdanim URL-om) - - Korišćenje `http://example.com.mal.net` (URL počinje sa pouzdanim URL-om) -- **Modifikovanje imena parametara**: Menjanje imena parametara u POST ili GET zahtevima može pomoći u sprečavanju automatizovanih napada. -- **CSRF tokeni**: Uključivanje jedinstvenog CSRF tokena u svaku sesiju i zahtev za ovim tokenom u narednim zahtevima može značajno smanjiti rizik od CSRF. Efikasnost tokena može se poboljšati primenom CORS-a. +- [**SameSite cookies**](hacking-with-cookies/index.html#samesite): Ovaj atribut sprečava browser da šalje kolačiće zajedno sa cross-site zahtevima. [More about SameSite cookies](hacking-with-cookies/index.html#samesite). +- [**Cross-origin resource sharing**](cors-bypass.md): CORS politika žrtvinog sajta može uticati na izvodljivost napada, posebno ako napad zahteva čitanje odgovora sa žrtvinog sajta. [Learn about CORS bypass](cors-bypass.md). +- **Verifikacija korisnika**: Traženje korisničke lozinke ili rešavanje captcha-e može potvrditi nameru korisnika. +- **Provera Referrer ili Origin header-a**: Validacija ovih header-a može pomoći da se osigura da zahtevi dolaze iz poverljivih izvora. Međutim, pažljivo skrojeni URL-ovi mogu zaobići loše implementirane provere, kao što su: + - Korišćenje `http://mal.net?orig=http://example.com` (URL se završava sa poverljivim URL-om) + - Korišćenje `http://example.com.mal.net` (URL počinje sa poverljivim URL-om) +- **Izmena imena parametara**: Promena imena parametara u POST ili GET zahtevima može pomoći u prevenciji automatizovanih napada. +- **CSRF Tokens**: Uključivanje jedinstvenog CSRF tokena u svaku sesiju i zahtevanje tog tokena u narednim zahtevima može značajno smanjiti rizik od CSRF. Efikasnost tokena se može poboljšati primenom CORS-a. -Razumevanje i implementacija ovih odbrana su ključni za održavanje sigurnosti i integriteta web aplikacija. +Razumevanje i primena ovih odbrana je ključno za održavanje sigurnosti i integriteta web aplikacija. -## Zaobilaženje odbrana +## Defences Bypass -### Od POST do GET +### From POST to GET (method-conditioned CSRF validation bypass) -Možda je obrazac koji želite da iskoristite pripremljen za slanje **POST zahteva sa CSRF tokenom, ali** trebate **proveriti** da li je **GET** takođe **validan** i da li se kada pošaljete GET zahtev **CSRF token i dalje validira**. +Neke aplikacije primenjuju CSRF validaciju samo na POST dok je preskaču za druge HTTP metode. Uobičajen anti-pattern u PHP-u izgleda ovako: +```php +public function csrf_check($fatal = true) { +if ($_SERVER['REQUEST_METHOD'] !== 'POST') return true; // GET, HEAD, etc. bypass CSRF +// ... validate __csrf_token here ... +} +``` +Ako ranjiv endpoint takođe prihvata parametre iz $_REQUEST, možete ponovo poslati istu akciju kao GET zahtev i potpuno izostaviti CSRF token. Ovo pretvara POST-only akciju u GET akciju koja uspeva bez tokena. -### Nedostatak tokena +Primer: -Aplikacije mogu implementirati mehanizam za **validaciju tokena** kada su prisutni. Međutim, ranjivost nastaje ako se validacija potpuno preskoči kada token nije prisutan. Napadači mogu iskoristiti ovo tako što će **ukloniti parametar** koji nosi token, ne samo njegovu vrednost. Ovo im omogućava da zaobiđu proces validacije i efikasno izvrše Cross-Site Request Forgery (CSRF) napad. +- Original POST with token (intended): -### CSRF token nije vezan za korisničku sesiju +```http +POST /index.php?module=Home&action=HomeAjax&file=HomeWidgetBlockList HTTP/1.1 +Content-Type: application/x-www-form-urlencoded -Aplikacije **koje ne vezuju CSRF tokene za korisničke sesije** predstavljaju značajan **sigurnosni rizik**. Ovi sistemi verifikuju tokene protiv **globalnog skupa** umesto da osiguraju da je svaki token vezan za inicijalnu sesiju. +__csrf_token=sid:...&widgetInfoList=[{"widgetId":"https://attacker","widgetType":"URL"}] +``` -Evo kako napadači iskorišćavaju ovo: +- Bypass by switching to GET (no token): -1. **Autentifikujte se** koristeći svoj nalog. -2. **Dobijte validan CSRF token** iz globalnog skupa. -3. **Koristite ovaj token** u CSRF napadu protiv žrtve. +```http +GET /index.php?module=Home&action=HomeAjax&file=HomeWidgetBlockList&widgetInfoList=[{"widgetId":"https://attacker","widgetType":"URL"}] HTTP/1.1 +``` -Ova ranjivost omogućava napadačima da šalju neovlašćene zahteve u ime žrtve, iskorišćavajući **neadekvatan mehanizam validacije tokena** aplikacije. +Notes: +- Ovaj obrazac se često pojavljuje zajedno sa reflected XSS kada se odgovori pogrešno šalju kao text/html umesto application/json. +- Povezivanje ovoga sa XSS značajno snižava prepreke za iskorišćavanje jer možete isporučiti jedan GET link koji i pokreće ranjivi kod i potpuno zaobilazi CSRF provere. -### Zaobilaženje metoda +### Lack of token -Ako zahtev koristi "**čudan**" **metod**, proverite da li **funkcionalnost** **zaobilaženja metoda** radi. Na primer, ako koristi **PUT** metod, možete pokušati da **koristite POST** metod i **pošaljete**: _https://example.com/my/dear/api/val/num?**\_method=PUT**_ +Aplikacije mogu implementirati mehanizam za **validate tokens** kada su oni prisutni. Međutim, postoji ranjivost ako se validacija potpuno preskoči kada token nedostaje. Napadači mogu iskoristiti ovo uklanjanjem parametra koji nosi token, ne samo njegove vrednosti. To im omogućava da izbegnu proces validacije i efikasno sprovedu Cross-Site Request Forgery (CSRF) napad. -Ovo takođe može raditi slanjem **\_method parametra unutar POST zahteva** ili korišćenjem **zaglavlja**: +### CSRF token is not tied to the user session + +Aplikacije koje **not tying CSRF tokens to user sessions** predstavljaju značajan **security risk**. Ti sistemi verifikuju tokene prema **global pool** umesto da osiguraju da je svaki token vezan za inicijalnu sesiju. + +Evo kako napadači to iskorišćavaju: + +1. **Authenticate** koristeći svoj nalog. +2. **Obtain a valid CSRF token** iz global pool-a. +3. **Use this token** u CSRF napadu protiv žrtve. + +Ova ranjivost omogućava napadačima da izvrše neautorizovane zahteve u ime žrtve, iskorišćavajući **inadequate token validation mechanism** aplikacije. + +### Method bypass + +Ako zahtev koristi "**weird**" **method**, proverite da li **method** **override functionality** radi. Na primer, ako koristi **using a PUT** method možete pokušati da **use a POST** method i **send**: _https://example.com/my/dear/api/val/num?**\_method=PUT**_ + +Ovo takođe može raditi slanjem **\_method parameter inside the a POST request** ili korišćenjem **headers**: - _X-HTTP-Method_ - _X-HTTP-Method-Override_ - _X-Method-Override_ -### Zaobilaženje prilagođenog zaglavlja tokena +### Custom header token bypass -Ako zahtev dodaje **prilagođeno zaglavlje** sa **tokenom** kao **metod zaštite od CSRF**, onda: +Ako zahtev dodaje **custom header** sa **token**-om u zahtev kao **CSRF protection method**, onda: -- Testirajte zahtev bez **prilagođenog tokena i zaglavlja.** -- Testirajte zahtev sa tačno **istom dužinom, ali različitim tokenom**. +- Testirajte zahtev bez **Customized Token and also header.** +- Testirajte zahtev sa tačno istom **same length but different token**. -### CSRF token se verifikuje putem kolačića +### CSRF token is verified by a cookie -Aplikacije mogu implementirati zaštitu od CSRF tako što će duplirati token u kolačiću i parametru zahteva ili postavljanjem CSRF kolačića i verifikovanjem da li token poslat u pozadini odgovara kolačiću. Aplikacija validira zahteve proverom da li se token u parametru zahteva poklapa sa vrednošću u kolačiću. +Aplikacije mogu implementirati CSRF zaštitu dupliranjem tokena i u cookie i u parametru zahteva ili postavljanjem CSRF cookie-a i proverom da li token poslat u backend-u odgovara cookie-u. Aplikacija validira zahteve proverom da li token u parametru zahteva usklađuje sa vrednošću u cookie-u. -Međutim, ova metoda je ranjiva na CSRF napade ako sajt ima greške koje omogućavaju napadaču da postavi CSRF kolačić u pregledaču žrtve, kao što je CRLF ranjivost. Napadač može iskoristiti ovo tako što će učitati obmanjujuću sliku koja postavlja kolačić, nakon čega pokreće CSRF napad. +Međutim, ova metoda je ranjiva na CSRF napade ako sajt ima mane koje napadaču omogućavaju da postavi CSRF cookie u browser žrtve, kao što je CRLF ranjivost. Napadač može to iskoristiti tako što učita obmanjujuću sliku koja postavlja cookie, a zatim pokrene CSRF napad. Ispod je primer kako bi napad mogao biti strukturiran: ```html @@ -103,19 +131,19 @@ onerror="document.forms[0].submit();" /> ``` > [!TIP] -> Imajte na umu da ako je **csrf token povezan sa sesijskim kolačićem, ovaj napad neće uspeti** jer ćete morati da postavite žrtvi vašu sesiju, a samim tim ćete napadati sebe. +> Imajte na umu da ako je **csrf token povezan sa session cookie-jem ovaj napad neće raditi** jer ćete morati postaviti žrtvin session na svoj, i samim tim ćete napadati sami sebe. ### Promena Content-Type -Prema [**ovome**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests), kako bi se **izbegli preflight** zahtevi korišćenjem **POST** metode, ovo su dozvoljene vrednosti Content-Type: +Prema [**this**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests), da biste **izbegli preflight** zahteve koristeći **POST** metod, dozvoljene vrednosti Content-Type su: - **`application/x-www-form-urlencoded`** - **`multipart/form-data`** - **`text/plain`** -Međutim, imajte na umu da **logika servera može varirati** u zavisnosti od korišćenog **Content-Type**, tako da biste trebali isprobati pomenute vrednosti i druge poput **`application/json`**_**,**_**`text/xml`**, **`application/xml`**_._ +Međutim, imajte na umu da logika servera može varirati u zavisnosti od korišćenog **Content-Type**, pa treba da probate pomenute vrednosti i druge poput **`application/json`**_**,**_**`text/xml`**, **`application/xml`**_._ -Primer (iz [ovde](https://brycec.me/posts/corctf_2021_challenges)) slanja JSON podataka kao text/plain: +Primer (iz [here](https://brycec.me/posts/corctf_2021_challenges)) slanja JSON podataka kao text/plain: ```html @@ -134,32 +162,32 @@ form.submit() ``` -### Obilaženje Preflight Zahteva za JSON Podatke +### Zaobilaženje preflight zahteva za JSON podatke -Kada pokušavate da pošaljete JSON podatke putem POST zahteva, korišćenje `Content-Type: application/json` u HTML formi nije direktno moguće. Slično tome, korišćenje `XMLHttpRequest` za slanje ovog tipa sadržaja pokreće preflight zahtev. Ipak, postoje strategije koje potencijalno mogu da zaobiđu ovo ograničenje i provere da li server obrađuje JSON podatke bez obzira na Content-Type: +Kada pokušavate da pošaljete JSON podatke putem POST zahteva, korišćenje `Content-Type: application/json` u HTML formi nije direktno moguće. Slično tome, korišćenje `XMLHttpRequest` za slanje ovog Content-Type pokreće preflight request. Ipak, postoje strategije kojima se može pokušati zaobići ovo ograničenje i proveriti da li server obrađuje JSON podatke bez obzira na Content-Type: -1. **Koristite Alternativne Tipove Sadržaja**: Koristite `Content-Type: text/plain` ili `Content-Type: application/x-www-form-urlencoded` postavljanjem `enctype="text/plain"` u formi. Ovaj pristup testira da li backend koristi podatke bez obzira na Content-Type. -2. **Izmenite Tip Sadržaja**: Da biste izbegli preflight zahtev dok osiguravate da server prepoznaje sadržaj kao JSON, možete poslati podatke sa `Content-Type: text/plain; application/json`. Ovo ne pokreće preflight zahtev, ali bi moglo biti ispravno obrađeno od strane servera ako je konfigurisan da prihvati `application/json`. -3. **Korišćenje SWF Flash Fajla**: Manje uobičajena, ali izvodljiva metoda uključuje korišćenje SWF flash fajla za obilaženje takvih ograničenja. Za detaljno razumevanje ove tehnike, pogledajte [ovaj post](https://anonymousyogi.medium.com/json-csrf-csrf-that-none-talks-about-c2bf9a480937). +1. **Koristite alternativne Content Types**: Employ `Content-Type: text/plain` or `Content-Type: application/x-www-form-urlencoded` by setting `enctype="text/plain"` in the form. Ovaj pristup testira da li backend koristi podatke bez obzira na Content-Type. +2. **Izmenite Content-Type**: Da biste izbegli preflight request a pritom osigurali da server prepozna sadržaj kao JSON, možete poslati podatke sa `Content-Type: text/plain; application/json`. Ovo neće pokrenuti preflight request, ali server može ispravno obraditi podatke ako je konfigurisан da prihvata `application/json`. +3. **Korišćenje SWF Flash fajla**: A manje uobičajena ali izvodljiva metoda uključuje korišćenje SWF flash fajla za zaobilaženje takvih ograničenja. Za detaljnije razumevanje ove tehnike, referišite se na [this post](https://anonymousyogi.medium.com/json-csrf-csrf-that-none-talks-about-c2bf9a480937). -### Obilaženje Provere Referrer / Origin +### Zaobilaženje provere Referrer / Origin **Izbegnite Referrer header** -Aplikacije mogu validirati 'Referer' header samo kada je prisutan. Da biste sprečili pretraživač da pošalje ovaj header, može se koristiti sledeći HTML meta tag: +Applications may validate the 'Referer' header only when it's present. To prevent a browser from sending this header, the following HTML meta tag can be used: ```xml ``` -Ovo osigurava da 'Referer' header bude izostavljen, potencijalno zaobilazeći provere validacije u nekim aplikacijama. +Ovo osigurava da se 'Referer' zaglavlje izostavi, potencijalno zaobilazeći validacione provere u nekim aplikacijama. -**Regexp zaobilaženja** +**Regexp bypasses** {{#ref}} ssrf-server-side-request-forgery/url-format-bypass.md {{#endref}} -Da biste postavili naziv domena servera u URL-u koji će Referrer poslati unutar parametara, možete uraditi: +Da biste postavili ime domena servera u URL-u koji će Referrer poslati unutar parametara, možete uraditi: ```html @@ -188,25 +216,25 @@ document.forms[0].submit() ``` -### **HEAD metoda zaobilaženja** +### **HEAD method bypass** -Prvi deo [**ovog CTF izveštaja**](https://github.com/google/google-ctf/tree/master/2023/web-vegsoda/solution) objašnjava da je [Oak-ov izvorni kod](https://github.com/oakserver/oak/blob/main/router.ts#L281), ruter postavljen da **obrađuje HEAD zahteve kao GET zahteve** bez tela odgovora - uobičajena zaobilaznica koja nije jedinstvena za Oak. Umesto specifičnog handler-a koji se bavi HEAD zahtevima, oni su jednostavno **dati GET handler-u, ali aplikacija samo uklanja telo odgovora**. +U prvom delu [**this CTF writeup**](https://github.com/google/google-ctf/tree/master/2023/web-vegsoda/solution) objašnjeno je da je u [Oak's source code](https://github.com/oakserver/oak/blob/main/router.ts#L281) router podešen da **handle HEAD requests as GET requests** with no response body — česta zaobilaznica koja nije jedinstvena za Oak. Umesto posebnog handler-a koji obrađuje HEAD zahteve, oni su jednostavno **given to the GET handler but the app just removes the response body**. -Stoga, ako je GET zahtev ograničen, možete jednostavno **poslati HEAD zahtev koji će biti obrađen kao GET zahtev**. +Dakle, ako je GET zahtev ograničen, možete jednostavno **send a HEAD request that will be processed as a GET request**. -## **Primeri eksploatacije** +## **Exploit Examples** -### **Ekstrakcija CSRF tokena** +### **Exfiltrating CSRF Token** -Ako se koristi **CSRF token** kao **odbrana**, možete pokušati da **ekstrahujete** koristeći [**XSS**](xss-cross-site-scripting/index.html#xss-stealing-csrf-tokens) ranjivost ili [**Dangling Markup**](dangling-markup-html-scriptless-injection/index.html) ranjivost. +Ako se **CSRF token** koristi kao **odbrana**, možete pokušati da ga **exfiltrate it** zloupotrebom [**XSS**](xss-cross-site-scripting/index.html#xss-stealing-csrf-tokens) ranjivosti ili [**Dangling Markup**](dangling-markup-html-scriptless-injection/index.html) ranjivosti. -### **GET koristeći HTML tagove** +### **GET korišćenjem HTML tagova** ```xml

404 - Page not found

The URL you are requesting is no longer available ``` -Ostali HTML5 tagovi koji se mogu koristiti za automatsko slanje GET zahteva su: +Drugi HTML5 tagovi koji se mogu koristiti za automatsko slanje GET zahteva su: ```html @@ -235,7 +263,7 @@ background: url("..."); ``` -### Form GET zahtev +### Forma GET zahteva ```html @@ -281,7 +309,7 @@ document.forms[0].submit() //Way 3 to autosubmit ``` -### Form POST zahtev kroz iframe +### POST zahtev forme kroz iframe ```html @@ -398,7 +426,7 @@ document.getElementById("formulario").submit() ``` -### **Ukrao CSRF token i poslao POST zahtev** +### **Ukradi CSRF Token i pošalji POST request** ```javascript function submitFormWithTokenJS(token) { var xhr = new XMLHttpRequest() @@ -445,7 +473,7 @@ var GET_URL = "http://google.com?param=VALUE" var POST_URL = "http://google.com?param=VALUE" getTokenJS() ``` -### **Ukrao CSRF token i poslao Post zahtev koristeći iframe, formu i Ajax** +### **Ukradi CSRF Token i pošalji Post zahtev koristeći iframe, form i Ajax** ```html ``` -### **POSTUk stealing CSRF token sa Ajax i slanje posta sa formom** +### **POST — Ukradi CSRF token koristeći Ajax i pošalji POST pomoću forme** ```html
``` -### CSRF са Socket.IO +### CSRF sa Socket.IO ```html