XSS-hyökkäysten avulla hyökkääjät voivat syöttää asiakaspuolen komentosarjoja muiden käyttäjien katselemille verkkosivuille. Tämän haavoittuvuuden tärkeimmät vaikutukset ovat mahdollisuus suorittaa mitä tahansa toimintoja kirjautuneen käyttäjän kontekstissa ja lukea mitä tahansa tietoja kirjautuneen käyttäjän kontekstissa.
Hyökkäysskenaario
Hyökkääjä löytää XSS-haavoittuvuuden uhrin käyttämältä verkkosivustolta, esimerkiksi pankin verkkosivustolta.
Uhri on tällä hetkellä kirjautuneena tälle sivulle.
Hyökkääjä lähettää uhrille väärennetyn URL-osoitteen.
Uhri napsauttaa URL-osoitetta
Uhrin pankki verkkosivusto, JavaScriptkoodi aloittaa suorituksen sieppaamaan käyttäjän tietoja tai suorittamaan siirron hänen puolestaan hyökkääjän tilille.
On syytä huomata, että uhrin puolesta suoritettavat operaatiot voivat olla uhrille näkymättömiä, sillä ne voivat tapahtua taustalla pankin sovellusrajapinnan avulla, tai hyökkääjä voi suorittaa ne myöhemmin tunnistautumiseen tarvittavien tietojen, tunnisteiden, evästeiden jne. avulla.
XSS-tyypit
1. Heijastettu XSS
Tämä on sellainen, jossa minkä tahansa parametrin (esim. GET, POST tai eväste) sisältämä HTML/JavaScript-koodi näytetään vastauksena.
Sivu, jossa on tekstinsyöttö, jolla haetaan jotain, joka asettaa parametrin ?search=foo URL-osoitteen lopussa, kun API:ta kysytään. Jos jotain lausetta ei löydy, sen syöttämisen jälkeen annetaan palautusviesti HTML ex.
<div>Ei löytynyt tulosta <b>foo</b></div>
Voimme yrittää laittaa URL-osoitteen ?search=..
2.DOM XSS
Tämä tapahtuu silloin, kun sen suorittaminen mahdollistetaan käyttämällä vaarallisia toimintoja JavaScript:ssä, kuten seuraavia toimintoja `eval` tai `innerHtml`. Alla oleva "Live-esimerkki" näyttää DOM XSS -hyökkäyksen, joka perustuu `innerHtml` toiminto.
3. Tallennettu XSS
Tässä tapauksessa haittakoodi kirjoitetaan palvelinpuolelle. Voimme esimerkiksi lähettää haitallista koodia sisältävän kommentin blogikirjoitukseen, joka ladataan palvelimelle. Sen tehtävänä on esimerkiksi odottaa ylläpitäjän moderointia ja sitten varastaa hänen istuntotietonsa jne.
Injektiomenetelmät
1. Tagin sisällössä
`onerror=alert('XSS')`osoitteeseen
<img src onerror="alert('XSS')" />
2. Määritteen sisällössä
`" onmouseover=alert('XSS')`` osoitteeseen
<div class="" onmouseover="alert('XSS')""></div>
Määritteen sisällössä ilman lainausmerkkejä
x onclick=alert('XSS')osoitteeseen
<div class="x" onclick="alert('XSS')"></div>
Vuonna hrefef-ominaisuus
javascript:alert('XSS') osoitteeseen
<a href="javascript:alert('XSS')"></a>
JavaScript-koodin sisällä olevassa merkkijonossa
";alert('XSS')// osoitteeseen
<script>let username="";alert('XSS')//";</script>
JavaScript-tapahtuman sisältämässä attribuutissa.
');alert('XSS')// jossa ' on yksittäinen lainausmerkki, ja
Tiedon koodaus käyttämällä sisäänrakennettuja toimintoja, jotka löytyvät monista ohjelmointikielet.
Mallijärjestelmien käyttö automaattisen koodauksen kanssa. Useimmat suositut kehykset, jotka käyttävät tällaisia järjestelmiä, suojaavat meitä XSS-injektioilta (Django, Templates, Vue, React jne.).
Älä käytä funktioita kuten eval tai Toiminto epäluotettavien käyttäjätietojen kanssa.
Älä käytä funktioita ja ominaisuuksia, jotka osoittavat HTML-koodia suoraan DOM-puun elementteihin, esim, innerHTML, outerHTML, insertAdjacentHTML, ocument.write. Sen sijaan voit käyttää funktioita, jotka kohdistavat tekstiä suoraan näihin elementteihin, kuten esimerkiksi funktio textContent tai innerText.
Ole varovainen, kun ohjaat käyttäjän URL-osoitteeseen, joka on hänen hallinnassaan. Injektioriski location = 'javascript('XSS')'.
Suodata HTML:ää käyttämällä kirjastoja, kuten DOMPurify.
Ole varovainen lataamisen suhteen .html tai .svg tiedostot. Voit luoda erillisen verkkotunnuksen, josta ladatut tiedostot toimitetaan.