Cross-Site Scripting (XSS)

Cross-site scripting (XSS) on sovellusten haavoittuvuus, joka voi aiheuttaa tuhoa sovelluksissa ja verkkosivustoissa. XSS on niin yleinen ja potentiaalisesti haitallinen, että se on edelleen mukana Open Web Application Security Projectin (OWASP) 10 tärkeimmän haavoittuvuuden luettelossa.

Itse asiassa Cross-Site Scripting on yleisin vuodesta 2014 lähtien löydetty haavoittuvuus, ja vuonna 2019 se esiintyy edelleen raportoitujen haavoittuvuuksien Top 3:ssa.

Top revealed vulnerabilities – State of Open source Report 2020 by Snyk.

Mikä on Cross-Site Scripting (XSS)?

Cross-Site Scripting on verkkosivustohyökkäysmenetelmä, jossa hyödynnetään eräänlaista injektiota, jonka avulla voidaan istuttaa haitallisia komentosarjoja verkkosivuille, jotka muutoin toimisivat tuottavasti ja luotettavasti. Yleensä prosessi koostuu haitallisen selainpuolen skriptin lähettämisestä toiselle käyttäjälle. Tämä on yleinen tietoturvaongelma verkkosovelluksissa, ja se voi esiintyä missä tahansa sovelluksen kohdassa, jossa selaimesta vastaanotetaan syötettä ja sitä käytetään tulosteen luomiseen validoimatta tai koodaamatta tietoja ensin.

Jossain tapauksissa myös selaimen puoleinen skripti voi tuoda tämän haavoittuvuuden, jolloin hyökkääjä voi käyttää sitä hyväkseen ilman, että kohdekäyttäjä tekee pyynnön verkkosovellukselle.

Hyökkääjät käyttävät XSS:ää hyväkseen laatimalla haitallista koodia, joka voidaan ohjata toiselle käyttäjälle ja jonka pahaa aavistamaton selain sitten suorittaa. Koska skripti sisältyy useimmiten verkkosovelluksen vastauksen sisältöön, se suoritetaan ja sillä on samat käyttöoikeudet kuin jos skripti olisi laillinen. Se voi päästä käsiksi istuntotunnisteisiin, evästeisiin ja jopa luottamuksellisiin tai arkaluonteisiin tietoihin, joihin selaimella on pääsy kyseisellä sivustolla, ja se voi jopa kirjoittaa HTML-sivun sisällön uudelleen.

Turvaudu XSS-hyökkäyksiltä

Haavoittuvuuksien automaattinen etsiminen, priorisointi ja korjaaminen avoimeen lähdekoodiin perustuvissa riippuvuussovelluksissa, joita käytetään pilvinatiivien sovellusten rakentamiseen

Miten Cross-site Scripting toimii?

Cross-sivuston skriptihaavoittuvuuksien hyväksikäyttö on hyökkääjien näkökulmasta suhteellisen yksinkertainen tehtävä. Syöttämällä haitallisen skriptin suojaamattomaan tai vahvistamattomaan selaimen antamaan syötteeseen hyökkääjä saa sovelluksen palauttamaan skriptin ja suorittamaan sen selaimessa. Näin se voi ottaa sovelluksen toiminnallisuuden hallintaansa, manipuloida tietoja tai istuttaa siihen lisää haitallista koodia.

Millaisia XSS-hyökkäystyyppejä on?

XSS-hyökkäyksiä on kolme päätyyppiä: heijastettu XSS, tallennettu XSS ja DOM-pohjainen XSS.

Heijastetut XSS-hyökkäykset

Heijastetuissa XSS-hyökkäyksissä haitallinen skripti syötetään HTTP-pyyntöön (yleensä käyttäjälle toimitetun, erityisesti muotoillun linkin kautta). Yksinkertaisimmillaan se käyttää HTTP-pyynnössä syöttöparametreja, joita voidaan helposti manipuloida niin, että ne sisältävät haitallisen skriptisisällön. Haitallinen skripti heijastuu sitten palvelimelta HTTP-vastauksena ja se suoritetaan uhrin selaimessa.

Tässä tapauksessa se toimii kuin tallennettu XSS ilman, että haitallista tietoa todella tallennetaan palvelimelle.

Tässä on esimerkki heijastetusta XSS-hyökkäyksestä:

Esitettäköön, että esimerkki.com/profile sisältää nimiparametrin. Pyynnön URL-osoite näyttäisi tältä: https://example.com/profile?user=Tammy. Tämän syötteen perusteella verkkosovellus vastaisi näin ollen sivun yläosassa ”Hi Tammy”. Jos parametreja ei validoida sen varmistamiseksi, että se sisältää vain odotettuja tietoja, hyökkääjä voisi saada käyttäjän vierailemaan URL-osoitteen haitallisessa versiossa esimerkiksi näin:

Tallennetut XSS-hyökkäykset

Tallennetuksi tai pysyväksi XSS-hyökkäykseksi kutsutussa hyökkäyksessä haitallista sisältöä toimitetaan suoraan palvelimen vastauksen mukana, kun käyttäjä lataa verkkosivun. Sisältö on siis jo tallennettu verkkosivuston tietokantaan (tästä nimi tällaisille hyökkäyksille). Käyttäjät sitten yksinkertaisesti menevät hakkeroidulle verkkosivulle ja joutuvat tällaisten hyökkäysten uhriksi.

Jokainen käyttäjä, joka avaa tällaisen vaarantuneen verkkosivuston, on siten vaarassa saada henkilökohtaiset tietonsa varastetuksi, joten tätä voidaan pitää kaikkein vaarallisimpana XSS-hyökkäyksen tyyppinä.

Mutta miten haitallista sisältöä pääsee tietokantaan alun perin? Useimmissa tapauksissa se kulkeutuu suojaamattomien verkkosivulomakkeiden kautta, joissa käyttäjän syötettä ei ole validoitu ja puhdistettu asianmukaisesti. Jos hakkerin syöttämiä tietoja ei validoida sekä asiakas- että palvelinpuolella, ne tallentuvat tietokantaan. Tällaisia syötteitä voivat olla esimerkiksi kommenttitekstialue, viestien tekstieditori, henkilötietojen editori tai muut lomakkeet.

Kuva 1: Tallennetun tai pysyvän XSS-hyökkäyksen kulku

Kun hyökkääjä onnistuu lähettämään haitallista sisältöä palvelimelle ja tämä sisältö näkyy suodattamattomana verkkosivulla, kaikista käyttäjistä tulee potentiaalisia uhreja.

Yleinen parannuskeino tallennettuihin XSS-tappioihin on syötteiden sanitointi sovelluksen etupäässä ja sen takapuolella. Sanitointiin kuuluu tietojen validoinnin ja erikoismerkkien välttämisen tai niiden täydellisen suodattamisen yhdistelmä, ja se on yleinen paras käytäntö web- ja JavaScript-tietoturvassa.

DOM-pohjaiset XSS-hyökkäykset

Dokumenttiobjektimalli (DOM) on rajapinta, jonka avulla sovellukset pystyvät lukemaan ja manipuloimaan web-sivun rakennetta, sen sisältöä ja tyyliä. DOM-pohjaisessa XSS-hyökkäyksessä haavoittuvuus on selaimen puolella olevassa skriptikoodissa, ja sitä voidaan hyödyntää ilman minkäänlaista palvelimen vuorovaikutusta, jolloin se muuttaa ympäristöä pahaa-aavistamattoman uhrin selaimessa.

Joskus DOM-pohjaiset XSS-hyökkäykset muistuttavat heijastettuja hyökkäyksiä. Edellä esitettyä esimerkkiä heijastetusta XSS-hyökkäyksestä voidaan soveltaa tässä tapauksessa yhdellä oletuksella: Verkkosovellus lukee tietoja suoraan kyselymerkkijonosta.

Esitettäköön, että sovellus käyttää kyselyparametria ”nimi” näyttääkseen käyttäjän nimen välittömästi ruudulla odottaessaan muun sivun latautumista. Ilman asianmukaista validointia tämä voi tuottaa saman tuloksen kuin heijastettu hyökkäys, jos hakkeri onnistuu saamaan uhrin avaamaan epäilyttävän linkin.

Kuten tallennetun XSS:n kohdalla, heijastettujen ja DOM-pohjaisten hyökkäysten estämiseksi kehittäjien tulisi ottaa käyttöön tietojen validointi ja välttää raa’an käyttäjäsyötteen näyttämistä riippumatta siitä, onko palvelimen kanssa kommunikaatiota vai ei.

Mitkä ovat Cross-Site Scripting-hyökkäysvektorit?

XSS-hyökkäyksissä hyödynnetään tavallisesti useita vektoreita:

  • <script> tag: Skriptitunnisteen avulla voidaan viitata ulkoiseen JavaScript-koodiin, mikä tekee tästä suoraviivaisimman XSS-kohdan. Hyökkääjät voivat myös upottaa haitallista koodia script-tagin sisään.
  • JavaScript-tapahtumat: Toista suosittua hyökkääjien käyttämää XSS-vektoria, tapahtuma-attribuutteja, voidaan käyttää erilaisissa tageissa. Tällaisia attribuutteja ovat esimerkiksi ”onerror” ja ”onload”.
  • <body> tag: Tapahtuma-attribuutit voivat olla myös skriptin lähde, kun ne annetaan ”body”-tagin kautta.
  • <img> tag:
  • <iframe> tag: Erityisen tehokas phishing-hyökkäyksissä, tämä vektori mahdollistaa XSS-hyökkäyksen toisen HTML-sivun upottamisen nykyiselle sivulle.
  • <input>-tag: Jotkut selaimet sallivat manipuloinnin tämän vektorin kautta, jota voidaan käyttää skriptin upottamiseen.
  • <link> tag: Tämä tagi voi sisältää skriptin sen sijaan, että normaalisti käytettäisiin linkitystä ulkoisiin tyylilomakkeisiin.
  • <table> tagi: Kun tausta-attribuutti viittaa normaalisti kuvaan, tämä voidaan vaarantaa viittaamaan loukkaavaan skriptiin.
  • <div>-tagi: Tämä tagi sisältää myös taustaviittauksen ja sitä voidaan käyttää samalla tavalla kuin <table> viittaamaan skriptiin.
  • <object> tagi: Ulkoisen sivuston skriptit voidaan sisällyttää tämän tagin avulla.

Vaikka on muitakin vektoreita, joita XSS-hyökkääjät käyttävät pyrkiessään varastamaan tietoja ja vaarantamaan verkkosivustoja, nämä ovat joitakin yleisimmin käytettyjä menetelmiä. Kehittäjien on noudatettava asianmukaisia escaping- ja sanitizing-käytäntöjä suojautuakseen tällaisilta hyökkäyksiltä.

Mitkä ovat XSS-haavoittuvuuksien vaikutukset?

XSS:llä on potentiaalia aiheuttaa tuhoa sovelluksille ja verkkosivustoille. Se, että XSS on esiintynyt jokaisessa OWASP:n top 10 -luettelossa, osoittaa, että verkkosovellukset on suojattava tältä haavoittuvuudelta.

Hyökkääjästä ja hänen pahantahtoisesta aikomuksestaan riippuen XSS-hyökkäykset voivat johtaa erilaisiin vaikutuksiin, mm:

  • käyttäjän istunnon kaappaaminen, valtuustietojen hyödyntäminen muihin sivustoihin pääsemiseksi tai käyttäjän ohjaaminen ei-toivotuille sivustoille,
  • verkkosivujen muuttaminen tai osioiden lisääminen verkkosivulle,
  • skriptien suorittaminen arkaluonteisten tietojen poimimiseksi evästeistä tai tietokannoista,
  • jos uhrilla on hallinnointioikeudet,
  • hyökkäys voi laajentua palvelin-puolelle aiheuttaen lisävahinkoa tai noutaen lisää arkaluonteista tietoa.

Miten Cross-site Scriptingiä testataan?

XSS-haavoittuvuuden testaaminen aloitetaan suunnitteluvaiheessa, jolloin parhaat käytännöt otetaan huomioon alusta alkaen. Verkkosivustojen suunnittelijoiden tulisi sisällyttää tietoturvatoimenpiteet, ei lisätä niitä jälkikäteen.
Alustaviin testeihin kuuluu koodin vertailuanalyysi, jolla tunnistetaan yleisten XSS-hyökkäysvektorien käyttö, jotka esittävät mahdollisia haavoittuvuuksia. Tämä mahdollistaa heikkouksien lieventämisen ennen varsinaisen sovelluksen testauksen aloittamista.

Kriittisten verkkosovellusten XSS-haavoittuvuuksien testauksen keskeisiä vaiheita ovat:

  • koodin skannaustyökalun käyttäminen haavoittuvuuksien havaitsemiseksi, mikä mahdollistaa koodin korjaukset kehitysprosessin aikana,
  • automaattisen testaustoiminnon käyttöönotto, joka paljastaa mahdolliset haavoittuvuudet perusteellisesti ja nopeasti.

Testaa koodisi XSS-haavoittuvuuksien varalta

Automaattisesti löytää, priorisoida ja korjata haavoittuvuudet avoimen lähdekoodin riippuvuuksissa, joita käytetään pilvinatiivien sovellusten rakentamiseen

Mikä on cross-site scripting -esimerkki?

Cross-site scriptingiä voidaan hyödyntää, kun verkkosovellus käyttää selaimen toimittamia tietoja luodessaan vastauksia käyttäjän pyyntöihin. Hyvin yksinkertaistettu esimerkki olisi tapaus, jossa verkkosovellus käyttää URL-osoitteessa olevaa parametria tarjotakseen käyttäjälle räätälöidyn vastauksen.

Esitettäköön, että exmple.com/profile sisältää nimiparametrin. Pyynnön URL-osoite näyttäisi seuraavalta https://example.com/profile?user=Tammy. Verkkosovellus vastaa tämän syötteen perusteella sivun yläosassa ”Hi Tammy”.

Jos käyttäjäparametria ei validoida sen varmistamiseksi, että se sisältää vain odotettuja tietoja, hyökkääjä voi saada käyttäjän vierailemaan URL-osoitteen haitallisessa versiossa, joka näyttää tältä:
https://example.com/profile?user<script>some_malicious_code</script>.
Kun vastaus lähetetään selaimelle, se sisältää tuon haitallisen komentosarjakuvan, joka sen jälkeen suoritetaan selaimessa, todennäköisesti käyttäjän tietämättä. Tämä on esimerkki heijastetusta XSS-hyökkäyksestä. Haitallinen koodi ”heijastuu” välittömästi takaisin pyynnön esittäneelle käyttäjälle.

Miten Cross-site Scripting -hyökkäyksiä voidaan ehkäistä?

XSS-hyökkäysten ehkäisemiseksi on useita keskeisiä toimintakohteita: kehittäjien koulutuksen ja tietoisuuden lisääminen, syötetyn datan seulominen ja validoiminen sekä koodin skannaaminen haavoittuvuuksien varalta.

  • Koulutuksen ja tietoisuuden lisääminen: Varmista, että kaikki kehittäjät, verkkosuunnittelijat ja laadunvarmistusryhmät ovat tietoisia menetelmistä, joita hakkerit käyttävät haavoittuvuuksien hyödyntämiseen, ja tarjoa ohjeita ja parhaita käytäntöjä koodausta varten. Tähän kuuluu myös sovellusympäristön (JavaScript, HTML jne.) asianmukaiset escaping/koodaustekniikat.
  • Sanitize input: Riippumatta siitä, onko kyseessä sisäiset verkkosivut vai julkiset verkkosivustot, älä koskaan luota käyttäjän syöttämien tietojen oikeellisuuteen. Seulaa ja validoi kaikki tietokentät, varsinkin jos ne sisällytetään HTML-tulosteeseen.
  • Skannaa koodi: Ota käyttöön ohjelmisto, joka skannaa koodin haavoittuvuuksien varalta, mukaan lukien cross-site scripting, varmistaaksesi, että parhaita käytäntöjä noudatetaan ja minimoidaksesi altistumisen XSS:lle ja muille OWASP-luettelossa mainituille haavoittuvuuksille.
  • Sisällön turvallisuuskäytäntö: Käytä Content Security Policy (CSP) -käytäntöä (Content Security Policy) määrittelemään, mitä verkkosivusto voi tehdä, ja sitä kautta vähentämään XSS-hyökkäyksen riskiä. Käyttämällä CSP:tä XSS voidaan estää kokonaan (estämällä kaikki rivinsisäiset skriptit) tai vähentää riski paljon pienemmäksi.

OWASP tarjoaa lisäohjeita XSS-haavoittuvuuden estämiseen kattavalla huijauslomakkeella.

Vastaa

Sähköpostiosoitettasi ei julkaista.