Puolimo scenarijus
- Užpuolikas randa XSS pažeidžiamumą aukos naudojamoje svetainėje, pvz., banko svetainėje.
- Šiuo metu auka yra prisijungusi prie šio puslapio
- Užpuolikas siunčia aukai suklastotą URL adresą.
- auka spusteli URL adresą
- Dėl aukos bankas interneto svetainėje, JavaScript kodas pradedamas vykdyti, kad perimtų naudotojo duomenys arba jo vardu atlikti pervedimą į užpuoliko sąskaitą.
Verta pažymėti, kad aukos vardu atliekamos operacijos aukai gali būti nematomos, nes jos gali būti atliekamos fone, naudojant banko API, arba užpuolikas gali juos atlikti vėliau, naudodamas autentifikavimui reikalingus duomenis, žetonus, slapukus ir pan.
XSS tipai
1. Atspindėtas XSS
Tai toks atvejis, kai atsakyme rodomas HTML/JavaScript kodas, esantis bet kuriame parametre (pvz., GET, POST arba slapukas).
Puslapis su teksto įvestimi, kurioje ieškoma kažko, kas pateikia parametrą ?search=foo URL pabaigoje, kai užklausiama API. Įvedus bet kurią frazę, jei ji nerandama, HTML formatu pateikiamas grįžtamasis pranešimas ex.
<div>Nerastas joks rezultatas <b>foo</b></div>
Galime pabandyti įrašyti URL adresą ?search=..
2.DOM XSS
Taip yra tada, kai jos vykdymas įjungiamas naudojant pavojingas JavaScript funkcijas, pvz. `eval` arba `innerHtml`. Toliau pateiktame “Tiesioginiame pavyzdyje” rodoma DOM XSS ataka, pagrįsta `innerHtml` funkcija.
3. Saugomas XSS
Tai vienas iš atvejų, kai kenkėjiškas kodas rašomas serverio pusėje. Pavyzdžiui, į tinklaraščio įrašą, kuris įkeliamas į serverį, galime nusiųsti komentarą su kenkėjišku kodu. Jo užduotis, pavyzdžiui, laukti, kol administratorius atliks moderavimą, o tada pavogti jo sesijos duomenis ir pan.
Injekcijos metodai
1. Žymos turinys
`onerror=įspėjimas('XSS')`į
<img src onerror="alert('XSS')" />
2. Atributo turinys
`" onmouseover=įspėjimas('XSS')` į
<div class="" onmouseover="alert('XSS')""></div>
- Atributo turinyje be kabučių
x onclick=įspėjimas('XSS')į
<div class="x" onclick="alert('XSS')"></div>
- Į
hrefef požymis
javascript:alert('XSS') į
<a href="javascript:alert('XSS')"></a>
- JavaScript kodo viduje esančioje eilutėje
";alert('XSS')// į
<script>let username="";alert('XSS')//";</script>
- Atributas su JavaScript įvykiu
');alert('XSS')// kur ' yra viena kabliataškė, į
<div onclick="change('');alert('XSS')//')">John</div>
- Į
hrefatributas JavaScript protokole
);alert(1)// kur %27 yra viena kabliataškė, į
<a href="javascript:change('%27);alert(1)//')">spustelėkite</a>
Tiesioginis pavyzdys
Gynybos metodai
- Duomenų kodavimas naudojant integruotas funkcijas, esančias daugelyje programavimo kalbos.
- Naudojant šablonų sistemas su automatiniu kodavimu. Dauguma populiarių karkasų, naudojančių tokias sistemas, apsaugo mus nuo XSS injekcijos (Django, Šablonai, Vue, React ir t. t.).
- Nenaudokite tokių funkcijų kaip
evalarbaFunkcijasu nepatikimais naudotojo duomenimis. - Nenaudokite funkcijų ir savybių, kurios HTML kodą tiesiogiai priskiria DOM medžio elementams, pvz,
innerHTML,outerHTML,insertAdjacentHTML,ocument.write. Vietoj to galite naudoti funkcijas, kurios tiesiogiai priskiria tekstą šiems elementams, pvz.textContentarbainnerText. - Būkite atsargūs nukreipdami naudotoją į jo valdomą URL adresą. Injekcijos rizika
vieta = 'javascript('XSS')'. - HTML filtravimas naudojant bibliotekas, pvz.
DOMPurify. - Būkite atsargūs dėl įkėlimo
.htmlarba.svgfailai. Galite sukurti atskirą domeną, iš kurio bus aptarnaujami įkelti failai. - Naudokite
Turinio saugumo politikamechanizmas. - Pažvelkite į daugumoje populiariausių naršyklių įdiegtus anti-XSS filtrus.
Jei šis straipsnis jums įdomus, sekite Lukaszą "Github" svetainėje: https://github.com/twistezo
Skaityti daugiau:
Duomenų gavimo strategijos "NextJS