mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
53 lines
4.9 KiB
Markdown
53 lines
4.9 KiB
Markdown
# Cache Poisoning via URL discrepancies
|
|
|
|
{{#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.**
|
|
|
|
> [!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).
|
|
|
|
## 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:
|
|
|
|
- **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`).
|
|
- **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`).
|
|
|
|
Drugi 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.
|
|
- **Korak 3**: Uvedite potencijalne delimiters pre nasumičnog sufiksa da vidite da li se odgovor menja, što ukazuje na korišćenje delimitera.
|
|
|
|
## 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.
|
|
|
|
### **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. 
|
|
|
|
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.
|
|
|
|
## Static Resources
|
|
|
|
Nekoliko keš servera će uvek keširati odgovor ako je identifikovan kao statički. Ovo može biti zbog:
|
|
|
|
- **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
|
|
- 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`.
|
|
|
|
{{#include ../../banners/hacktricks-training.md}}
|