Žiniatinklio programos saugumas - XSS pažeidžiamumas
Lukasz Kolko
XSS atakos leidžia įsilaužėliams į kitų naudotojų peržiūrimus tinklalapius įterpti kliento pusės scenarijus. Pagrindiniai šios spragos padariniai - galimybė atlikti bet kokius veiksmus prisijungusio naudotojo kontekste ir skaityti bet kokius duomenis prisijungusio naudotojo kontekste.
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, JavaScriptkodas 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.
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 eval arba Funkcija su 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. textContent arba innerText.
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 .html arba .svg failai. Galite sukurti atskirą domeną, iš kurio bus aptarnaujami įkelti failai.
Naudokite Turinio saugumo politika mechanizmas.
Pažvelkite į daugumoje populiariausių naršyklių įdiegtus anti-XSS filtrus.
Jei šis straipsnis jums įdomus, sekite Lukaszą "Github" svetainėje: https://github.com/twistezo