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 [2026/06/11 14:56] (current) – Uvod prepravljen mbunic | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====XSS napadi==== | ====XSS napadi==== | ||
| - | **XSS (Cross-site scripting)** je tip napada | + | **XSS (Cross-site scripting)** je vrsta napada u kojem napadač ubacuje |
| - | Funkcionira na način da se korisniku neke web stranice u odgovoru | + | |
| - | JavaScript kôd, najčešće u obliku klijentske skripte. Nakon njegova izvršenja, napadač | + | Ranjivost |
| - | nad korisnikovim interakcijama na toj stranici. Ovo je vrlo raširen tip napada. Svaki dio web stranice u | + | |
| - | kojemu | + | |
| - | Budući da su meta ovih napada su uvijek stranice kojima | + | |
| //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 52: | ||
| <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 65: | ||
| 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)