XSS (Cross-Site Scripting)

Mitä ovat Cross-Site Scripting -haavoittuvuudet?

Helppo
25 min

Cross-Site Scripting (XSS) on haavoittuvuus, jonka avulla haitallista JavaScript-koodia syötetään luotetuille sivuille, joka täten mahdollistaa haitallisen koodin ajamisen sivustoa käyttävien käyttäjien selaimissa.

XSS-haavoittuvuuksia syntyy, kun epäluotettavaa syötettä ei käsitellä oikein, vaan palautetaan selaimelle sellaisenaan, josta johtuen selain tulkitsee tämän koodiksi selainpuolella. Tämmöinen syöte voi olla vaikka avoin kommentti keskustelupalstalla.

Alla olevassa kuvassa on esimerkki, miltä onnistunut XSS-hyökkäys voisi näyttää. Hyökkääjä löytää sivustolta XSS-haavoittuvuuden, tallentaa haitallista JavaScript-koodia sivustolle ja kun käyttäjä(t) vierailevat saastuneella sivustolla, koodi suoritetaan ja hyökkääjä onnistuu varastamaan haluamansa tiedot.

Esimerkki haavoittuvasta ratkaisusta

Tässä on PHP-skripti, joka on haavoittuva XSS-hyökkäyksille.

echo "<p>Hakutulokset haulle: " . $_GET('haku') . "</p>"

Se on haavoittuva, koska se luo HTML-koodia epäturvallisesti. URL-parametria haku ei ole koodattu oikein. Hyökkääjä voi luoda seuraavan kaltaisen linkin, joka suorittaa hyökkääjän JavaScript-koodin verkkosivustolla, kun kohde avaa sen:

https://www.example.com/?haku=<script>alert('XSS')</script>

Linkin avaaminen johtaa siihen, että käyttäjän selaimessa suoritetaan seuraava HTML:

<p>
  Hakutulokset haulle: 
  <script>
    alert('XSS')
  </script>
</p>

XSS-haavoittuvuuksien kategoriat

XSS-haavoittuvuudet luokitellaan usein kategorioihin sen mukaan, että:

  • Voidaanko haavoittuvuutta hyväksikäyttää sellaisella tavalla, että hyökkääjän sivustolle ujuttama haitallinen JavaScript-koodi "jää" sivulle esimerkiksi keskustelupalstan viestiin? Tämä olisi persistentti, "stored" tai "persistent" XSS.
  • Heijastuuko haitallinen koodi kertaluontoisesti vain kun hyökkäyksen kohde avaa haitallisesti muotoillun linkin? Tämä on heijastettu, "reflected" XSS.
  • Vai näistä kahdesta riippumatta, onko haavoittuvuus pelkästään JavaScript-koodissa, joka esimerkiksi käsittelee vaarallisesti selaimen URL-osoitteen ankkureita. Nämä nimetään yleensä DOM-pohjaiseksi (DOM-based) XSS-haavoittuvuudeksi.

Erilaisia tilanteita milloin XSS-haavoja syntyy

Haavoittuvuus johtuu tyypillisesti jostain seuraavista syistä:

  • Puutteelinen enkoodaus: Sovellus rakentaa HTML:ää epäturvallisesti (parametrisointi ilman oikeanlaista koodausta).
  • WYSIWYG-editorit: Sovellus antaa käyttäjien muokata sivuston HTML-koodia suoraan (esimerkiksi WYSIWYG-editorit).
  • TIedostolataukset: Sovellus sallii käyttäjien lähettää HTML/SVG-tiedostoja ja tarjoilee niitä takaisin vaarallisesti.
  • Haavoittuvat komponentit: Sovellus käyttää vanhentuneita ja haavoittuvia JavaScript-kirjastoja.
  • eval() ja kumppanit: Sovellus käyttää JavaScriptia epäturvallisesti syöttämällä epäluotettua dataa funktioihin, jotka suorittavat koodia suoraan merkkijonosta (kuten eval).
  • Linkit: Sovellus sallii käyttäjien asettaa linkkien HREF-attribuutit validoimatta niitä haitallisten kuten javascript:-alkuisten URL-osoitteiden varalta.

XSS esimerkki

Lopuksi vielä käytännön esimerkki. Käynnistä tehtävä ja kokeile syöttää HTML tai JavaScript-koodia tekstikenttään.

Muutamia esimerkki syötteitä, joilla voidaan todeta haavoittuvuus.

<h1>Teksti</h1>

<script>alert('tekstiä')</script>

<img src='' onerror='alert("tekstiä")'>
hakatemia pro

Valmis ryhtymään eettiseksi hakkeriksi?
Aloita jo tänään.

Hakatemian jäsenenä saat rajoittamattoman pääsyn Hakatemian moduuleihin, harjoituksiin ja työkaluihin, sekä pääset discord-kanavalle jossa voit pyytää apua sekä ohjaajilta että muilta Hakatemian jäseniltä.