diff --git a/src/SUMMARY.md b/src/SUMMARY.md
index 4c7d77d24..ff94a56ed 100644
--- a/src/SUMMARY.md
+++ b/src/SUMMARY.md
@@ -487,6 +487,7 @@
- [88tcp/udp - Pentesting Kerberos](network-services-pentesting/pentesting-kerberos-88/README.md)
- [Harvesting tickets from Windows](network-services-pentesting/pentesting-kerberos-88/harvesting-tickets-from-windows.md)
- [Harvesting tickets from Linux](network-services-pentesting/pentesting-kerberos-88/harvesting-tickets-from-linux.md)
+ - [Wsgi](network-services-pentesting/pentesting-web/wsgi.md)
- [110,995 - Pentesting POP](network-services-pentesting/pentesting-pop.md)
- [111/TCP/UDP - Pentesting Portmapper](network-services-pentesting/pentesting-rpcbind.md)
- [113 - Pentesting Ident](network-services-pentesting/113-pentesting-ident.md)
diff --git a/src/pentesting-web/csrf-cross-site-request-forgery.md b/src/pentesting-web/csrf-cross-site-request-forgery.md
index 4b4029cf1..22c0a9742 100644
--- a/src/pentesting-web/csrf-cross-site-request-forgery.md
+++ b/src/pentesting-web/csrf-cross-site-request-forgery.md
@@ -2,55 +2,62 @@
{{#include ../banners/hacktricks-training.md}}
-## Cross-Site Request Forgery (CSRF) Objašnjeno
+## Cross-Site Request Forgery (CSRF) Explained
-**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.
+**Cross-Site Request Forgery (CSRF)** je tip sigurnosne ranjivosti u web aplikacijama. Omogućava napadačima da izvedu radnje u ime ničim neosumnjičenih korisnika iskorištavanjem njihovih autentifikovanih sesija. Napad se izvršava kada korisnik koji je ulogovan na ciljanu platformu poseti maliciozni sajt. Taj sajt potom pokreće zahteve ka nalogu žrtve preko izvođenja JavaScript-a, slanja formi ili učitavanja slika.
### Preduslovi za CSRF napad
-Da bi se iskoristila CSRF ranjivost, mora biti ispunjeno nekoliko uslova:
+Da bi se iskoristila CSRF ranjivost, nekoliko uslova mora biti ispunjeno:
-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.
+1. **Identify a Valuable Action**: Napadač mora pronaći radnju vrednu iskorišćavanja, kao što su promena lozinke, email-a ili elevacija privilegija.
+2. **Session Management**: Sesija korisnika treba da se upravlja isključivo putem cookies ili HTTP Basic Authentication header-a, jer se ostali header-i ne mogu manipulirati u ovu svrhu.
+3. **Absence of Unpredictable Parameters**: 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 za testiranje iz browser-a možete kliknuti na **Copy as fetch** i proveriti zahtev:
### Odbrana protiv CSRF
-Nekoliko protmera može biti implementirano da bi se zaštitilo od CSRF napada:
+Nekoliko protimera može biti implementirano da zaštiti od CSRF napada:
-- [**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.
+- [**SameSite cookies**](hacking-with-cookies/index.html#samesite): Ovaj atribut sprečava browser da šalje cookies zajedno sa cross-site zahtevima. [More about SameSite cookies](hacking-with-cookies/index.html#samesite).
+- [**Cross-origin resource sharing**](cors-bypass.md): CORS politika ciljane lokacije može uticati na izvodljivost napada, naročito ako napad zahteva čitanje odgovora sa ciljane lokacije. [Learn about CORS bypass](cors-bypass.md).
+- **User Verification**: Traženje korisnikove lozinke ili rešavanje captche može potvrditi korisnikovu nameru.
+- **Checking Referrer or Origin Headers**: Validacija ovih header-a može pomoći da se osigura da zahtevi dolaze iz pouzdanih izvora. Ipak, pažljivo konstruisani URL-ovi mogu zaobići slabo implementirane provere, na primer:
+- Korišćenjem `http://mal.net?orig=http://example.com` (URL se završava sa pouzdanim URL-om)
+- Korišćenjem `http://example.com.mal.net` (URL počinje sa pouzdanim URL-om)
+- **Modifying Parameter Names**: Menjanje imena parametara u POST ili GET zahtevima može otežati automatizovane napade.
+- **CSRF Tokens**: Ugrađivanje jedinstvenog CSRF tokena u svaku sesiju i zahtev za tim tokenom u narednim zahtevima može značajno umanjiti rizik od CSRF. Efikasnost tokena se može poboljšati primenom CORS-a.
-Razumevanje i primena ovih odbrana je ključno za održavanje sigurnosti i integriteta web aplikacija.
+Razumevanje i implementacija ovih odbrana je ključno za održavanje sigurnosti i integriteta web aplikacija.
+
+#### Česti propusti u odbranama
+
+- SameSite pitfalls: `SameSite=Lax` i dalje dozvoljava top-level cross-site navigacije kao što su linkovi i form GET-ovi, tako da mnogi GET-bazirani CSRF napadi ostaju mogući. Pogledajte cookie matrix u [Hacking with Cookies > SameSite](hacking-with-cookies/index.html#samesite).
+- Header checks: Validirajte `Origin` kada je prisutan; ako su oba `Origin` i `Referer` odsutni, odbijte zahtev. Ne oslanjajte se na substring/regex poklapanja `Referer` koja se mogu zaobići lookalike domenima ili konstruisanim URL-ovima, i imajte na umu trik sa `meta name="referrer" content="never"` koji utiče na potiskivanje.
+- Method overrides: Tretirajte overridovane metode (`_method` ili override header-e) kao one koje menjaju stanje i primenjujte CSRF zaštitu na efektivnu metodu, ne samo na POST.
+- Login flows: Primijenite CSRF zaštite i na login; u suprotnom, login CSRF omogućava prisilnu ponovnu autentifikaciju u naloge pod kontrolom napadača, što se može povezati sa stored XSS.
## Defences Bypass
### From POST to GET (method-conditioned CSRF validation bypass)
-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:
+Neke aplikacije primenjuju CSRF validaciju samo na POST dok je preskaču za druge 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.
+Ako ranjivi endpoint takođe prihvata parametre iz $_REQUEST, možete ponovo izvršiti istu akciju kao GET zahtev i potpuno izostaviti CSRF token. Ovo pretvara POST-only akciju u GET akciju koja uspeva bez tokena.
Primer:
-- Original POST with token (intended):
+- Originalni POST sa tokenom (namerno):
```http
POST /index.php?module=Home&action=HomeAjax&file=HomeWidgetBlockList HTTP/1.1
@@ -59,56 +66,96 @@ Content-Type: application/x-www-form-urlencoded
__csrf_token=sid:...&widgetInfoList=[{"widgetId":"https://attacker","widgetType":"URL"}]
```
-- Bypass by switching to GET (no token):
+- Zaobilaženje promenom u GET (bez tokena):
```http
GET /index.php?module=Home&action=HomeAjax&file=HomeWidgetBlockList&widgetInfoList=[{"widgetId":"https://attacker","widgetType":"URL"}] HTTP/1.1
```
-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.
+Napomene:
+- Ovaj obrazac se često pojavljuje zajedno sa reflected XSS gde se odgovori pogrešno služe kao text/html umesto application/json.
+- Kombinovanje ovoga sa XSS značajno snižava prepreke za eksploataciju jer možete dostaviti jedan GET link koji istovremeno pokreće ranjivi kod i potpuno zaobilazi CSRF provere.
-### Lack of token
+### Nedostatak tokena
-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.
+Aplikacije mogu implementirati mehanizam da **validiraju tokene** kada su prisutni. Međutim, ranjivost nastaje ako se validacija potpuno preskoči kada token nedostaje. Napadači to mogu iskoristiti **uklanjanjem parametra** koji nosi token, a ne samo njegove vrednosti. To im omogućava da zaobiđu proces validacije i efikasno izvedu Cross-Site Request Forgery (CSRF) napad.
-### CSRF token is not tied to the user session
+Štaviše, neke implementacije samo provere da parametar postoji, ali ne proveravaju njegov sadržaj, pa se prihvata **prazna vrednost tokena**. U tom slučaju je dovoljno jednostavno poslati zahtev sa `csrf=`:
+```http
+POST /admin/users/role HTTP/2
+Host: example.com
+Content-Type: application/x-www-form-urlencoded
-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.
+username=guest&role=admin&csrf=
+```
+Minimalni PoC za automatsko slanje (sakrivanje navigacije pomoću history.pushState):
+```html
+
+
+
+
+
+
+```
+### CSRF token nije vezan za korisničku sesiju
-Evo kako napadači to iskorišćavaju:
+Aplikacije koje **ne vezuju CSRF tokene za korisničke sesije** predstavljaju značajan **bezbednosni rizik**. Takvi sistemi proveravaju tokene u **globalnoj kolekciji** umesto da obezbede da je svaki token vezan za sesiju koja ga je inicirala.
-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.
+Evo kako napadači zloupotrebljavaju ovo:
-Ova ranjivost omogućava napadačima da izvrše neautorizovane zahteve u ime žrtve, iskorišćavajući **inadequate token validation mechanism** aplikacije.
+1. **Autentifikuju se** koristeći sopstveni nalog.
+2. **Nabave važeći CSRF token** iz globalne kolekcije.
+3. **Iskoriste ovaj token** u CSRF napadu protiv žrtve.
-### Method bypass
+Ova ranjivost omogućava napadačima da šalju neautorizovane zahteve u ime žrtve, iskorišćavajući neadekvatan mehanizam validacije tokena u aplikaciji.
-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**_
+### Zaobilaženje metode
-Ovo takođe može raditi slanjem **\_method parameter inside the a POST request** ili korišćenjem **headers**:
+Ako zahtev koristi "čudnu" metodu, proverite da li funkcionalnost method override radi. Na primer, ako koristi **PUT/DELETE/PATCH** metodu možete pokušati da upotrebite **POST** i pošaljete override, npr. `https://example.com/my/dear/api/val/num?_method=PUT`.
-- _X-HTTP-Method_
-- _X-HTTP-Method-Override_
-- _X-Method-Override_
+Ovo može funkcionisati i slanjem `_method` parametra u POST telu ili korišćenjem override header-a:
+- `X-HTTP-Method`
+- `X-HTTP-Method-Override`
+- `X-Method-Override`
+
+Uobičajeno u framework-ovima kao što su **Laravel**, **Symfony**, **Express** i drugi. Programeri ponekad preskaču CSRF na ne-POST verbima pretpostavljajući da browser-i ne mogu da ih pošalju; sa override-ima i dalje možete doći do tih handler-a preko POST-a.
+
+Primer zahteva i HTML PoC:
+```http
+POST /users/delete HTTP/1.1
+Host: example.com
+Content-Type: application/x-www-form-urlencoded
+
+username=admin&_method=DELETE
+```
+
+```html
+
+```
### Custom header token bypass
-Ako zahtev dodaje **custom header** sa **token**-om u zahtev kao **CSRF protection method**, onda:
+Ako zahtev dodaje **custom header** sa **token** u zahtev kao **CSRF protection method**, onda:
- Testirajte zahtev bez **Customized Token and also header.**
-- Testirajte zahtev sa tačno istom **same length but different token**.
+- Testirajte zahtev sa tačno **same length but different token**.
### CSRF token is verified by a cookie
-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.
+Aplikacije mogu implementirati CSRF protection dupliciranjem token-a i u cookie i u request parameter ili postavljanjem CSRF cookie i proverom da li token poslat u backend odgovara cookie-u. Aplikacija validira request-e proverom da li token u request parameter-u odgovara vrednosti u cookie-u.
-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.
+Međutim, ova metoda je ranjiva na CSRF attacks ako web sajt ima propuste koji napadaču omogućavaju da postavi CSRF cookie u browser žrtve, na primer CRLF vulnerability. Napadač to može iskoristiti tako što učita obmanjujuću image koja postavlja cookie, a zatim pokrene CSRF attack.
-Ispod je primer kako bi napad mogao biti strukturiran:
+Below is an example of how an attack could be structured:
```html
@@ -131,17 +178,17 @@ onerror="document.forms[0].submit();" />
```
> [!TIP]
-> 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.
+> Imajte na umu da ako je **csrf token povezan sa session cookie ovaj napad neće raditi** jer ćete morati da postavite žrtvi svoju sesiju, i stoga ćete napadati sebe.
-### Promena Content-Type
+### Content-Type change
-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:
+Prema [**this**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests), da biste **izbegli preflight** zahteve koristeći **POST** metodu, sledeće su dozvoljene vrednosti Content-Type:
- **`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**, pa treba da probate 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 bi trebalo da probate navedene vrednosti i druge kao **`application/json`**_**,**_**`text/xml`**, **`application/xml`**_._
Primer (iz [here](https://brycec.me/posts/corctf_2021_challenges)) slanja JSON podataka kao text/plain:
```html
@@ -162,32 +209,32 @@ form.submit()