xss_napadi
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| xss_napadi [2023/11/13 09:45] – zrinka | xss_napadi [2025/12/01 11:40] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====XSS napadi==== | ====XSS napadi==== | ||
| - | **XSS (Cross-site scripting)** | + | **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.\\ |
| - | Funkcionira | + | Funkcionira |
| - | JavaScript kôd, najčešće u obliku klijentske skripte. Nakon njegova izvršenja, napadač ima potpunu kontrolu | + | JavaScript kôd, najčešće u obliku klijentske skripte. Nakon njegova izvršenja napadač ima potpunu kontrolu |
| nad korisnikovim interakcijama na toj stranici. Ovo je vrlo raširen tip napada. Svaki dio web stranice u | 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. \\ | + | kojemu se traži korisnički unos potencijalno je ranjiv ako nema dobre procedure validacije i pročišćavanja unosa. |
| - | Budući da su meta ovih napada su uvijek stranice kojima korisnici vjeruju, krajnji korisnik najčešće ne može nikako znati da je skripta koju se sprema izvršiti maliciozna. Dodatno, poverljivim stranicama korisnici rado dopuštaju pristup kolačićima, | + | |
| //Reflected XSS (Non-Persistent// | //Reflected XSS (Non-Persistent// | ||
| Uzmimo za primjer stranicu koja vraća ono što se nalazi u //message// parametru: | Uzmimo za primjer stranicu koja vraća ono što se nalazi u //message// parametru: | ||
| < | < | ||
| - | https:// | + | https:// |
| </ | </ | ||
| Rezultat je | Rezultat je | ||
| < | < | ||
| - | < | + | < |
| </ | </ | ||
| No, ako korisnik unese | No, ako korisnik unese | ||
| < | < | ||
| - | https:// | + | https:// |
| </ | </ | ||
| nastaje problem jer se unijela skripta koja se može direktno izvršiti. | nastaje problem jer se unijela skripta koja se može direktno izvršiti. | ||
| 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, | + | //Stored XSS (Persistent, |
| 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 nekog 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 nekog drugog | + | ranjivi podatci pohrane i mogu doći do drugih |
| | | ||
| 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 // | + | Zadnji je // |
| - | | + | |
| - | | + | < |
| - | < | + | |
| - | document.write(' | + | |
| - | </ | + | |
| - | ova će se skripta izvesti.\\ | + | |
| - | **innerHTML** ne prihvaća < | + | |
| - | < | + | |
| - | element.innerHTML=' | + | |
| </ | </ | ||
| - | I ovaj će se alert izvesti. \\ | + | ova će se skripta izvesti.\\ \\ |
| - | Ovaj se tip napada može kombinirati sa Stored i Reflected napadima jer također može koristiti URL parametre. Budući da se ova tri tipa mogu preklapati, uvedena je nova podjela - poslužiteljski i klijentski XSS. \\ | + | // |
| + | < | ||
| + | I ovaj će se alert izvesti.\\ \\ | ||
| + | Ovaj se tip napada može kombinirati sa Stored i Reflected napadima jer također može koristiti URL parametre. Budući da se ova tri tipa mogu preklapati, uvedena je nova podjela - poslužiteljski i klijentski XSS.\\ | ||
| Poslužiteljski XSS (//Server XSS//) se odvija kad poslužitelj generira neprovjerene podatke uključene u HTTP zaglavlje. Izvor tih podatka može biti sam zahtjev ili neka druga lokacija, dakle može se dogoditi Reflected ili Stored napad. \\ | Poslužiteljski XSS (//Server XSS//) se odvija kad poslužitelj generira neprovjerene podatke uključene u HTTP zaglavlje. Izvor tih podatka može biti sam zahtjev ili neka druga lokacija, dakle može se dogoditi Reflected ili Stored napad. \\ | ||
| Klijentski XSS (//Client XSS//) se odvija kad se neprovjereni podatci koriste za promjene na DOM-u. Također može biti Reflected ako se podatci dohvaćaju iz zahtjeva ili Stored ako se dohvaćaju s poslužitelja. | Klijentski XSS (//Client XSS//) se odvija kad se neprovjereni podatci koriste za promjene na DOM-u. Također može biti Reflected ako se podatci dohvaćaju iz zahtjeva ili Stored ako se dohvaćaju s poslužitelja. | ||
| Zaštita od XSS napada provodi se tako što se kontroliraju podatci s kojima stranica radi. Odmah pri unosu | Zaštita od XSS napada provodi se tako što se kontroliraju podatci s kojima stranica radi. Odmah pri unosu | ||
| - | korisničkih podataka treba provesti pročišćenje i, ako podatak ima nešto sumnjivo, spriječiti njegovo | + | korisničkih podataka treba provesti pročišćenje i, ako podatak ima nešto sumnjivo, spriječiti njegovo |
| - | daljnje korištenje. Ako je podatak pročišćen, | + | |
| - | Pri ispisu podataka treba provesti dobru metodu dekodiranja da bi se osiguralo da se podatci ne | + | Pri ispisu podataka treba provesti dobru metodu dekodiranja da bi se osigurala ispravna interpretacija podataka, odnosno da se ne shvate kao skripta. U HTTP zahtjevima važno je koristiti zaglavlje Content-Type ili X-Content-Type-Options jer se na taj način sprečava pogrešna interpretacija odgovora od strane preglednika. |
| - | interpretiraju pogrešno, odnosno da se ne shvate kao skripta. U HTTP zahtjevima važno je koristiti zaglavlje Content-Type ili X-Content-Type-Options jer se na taj način | + | |
| - | sprečava | + | |
| Važno je i na dobar način kodirati varijable koje se umeću u HTML kôd. Primjerice, ovaj način unosa je | Važno je i na dobar način kodirati varijable koje se umeću u HTML kôd. Primjerice, ovaj način unosa je | ||
| Line 60: | Line 53: | ||
| <div> $varUnsafe </ | <div> $varUnsafe </ | ||
| </ | </ | ||
| - | jer napadač može unijeti skriptu kao varijablu, primjerice: | + | jer napadač može unijeti skriptu kao varijablu, primjerice: |
| < | < | ||
| < | < | ||
| </ | </ | ||
| - | i rezultat je: | + | i rezultat je: |
| < | < | ||
| <div> < | <div> < | ||
| Line 73: | Line 66: | ||
| Osim kodiranja, važan dio je i pročišćavanje HTML kôda. Jedna od preporučenih metoda je | Osim kodiranja, važan dio je i pročišćavanje HTML kôda. Jedna od preporučenih metoda je | ||
| - | // | + | // |
| | | ||
| - | | + | |
| - | | + | |
| | | ||
| - | Također, | + | Također, |
| - | Isto tako, dobra je praksa umetati varijable | + | |
| + | |||
| + | __PRIMJER__ - **Zadatak s Hacknite platforme - Pronađi svoju stranicu** | ||
| + | < | ||
| + | Mario je jako sretan sa svojom stranicom na kojoj se mogu izmjenjivati korisni linkovi, ali osjećao | ||
| + | da nešto nedostaje. Zato je kasnije dodao mogućnost pretraživanja korisnih linkova, kako bi netko mogao | ||
| + | lakše naći upravo ono što traži. Jako je ponosan na svoj kod, pa ti je čak dao source kod kako bi mogao | ||
| + | vidjeti kako je to napravio. | ||
| + | Budući da je siguran | ||
| + | kako bi im lakše mogao pristupiti. Mario je nastavio koristiti svoju stranicu, | ||
| + | nije time napravio nikakav propust. | ||
| + | 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. | ||
| + | |||
| + | Flag je u formatu CTF2021[brojevi] | ||
| + | |||
| + | http:// | ||
| + | |||
| + | </ | ||
| + | |||
| + | U prilogu se nalazi i jedna .php datoteka, no ona se u ovom pojašnjenju ne koristi.\\ | ||
| + | |||
| + | Ako pratimo poveznicu, dolazimo | ||
| + | Testirajmo postoji li ranjivost uključivanja JavaScript koda. Upišimo u tražilicu linkova neku jednostavnu naredbu i pošaljimo zahtjev. | ||
| + | < | ||
| + | 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 | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | | ||
| + | < | ||
| + | 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. | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | 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: | ||
| < | < | ||
| - | < | + | http:// |
| - | < | + | </code> |
| - | <div onmouseover="' | + | |
| - | </code> | + | {{ : |
| - | + | ||
| + | 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 je URL-encoded, | ||
| + | ^ Kod ^ Značenje znaka ^ | ||
| + | |%5B |[ | | ||
| + | |%5D |] | | ||
| - | Izvori | + | ===Izvori=== |
| - | [1]https:// | + | [1]https:// |
| - | [2]https:// | + | [2]https:// |
| - | [3]https:// | + | [3]https:// |
| - | [4] https:// | + | [4]https:// |
| + | [5]https:// | ||
| + | [6]https:// | ||
xss_napadi.1699868714.txt.gz · Last modified: 2025/12/01 11:40 (external edit)