Kaip pavogti BLOG'ą iš blogas.lt arba kokių klaidų turėtų vengti web programuotojai  (2)

Pristatome dar vieną Audriaus Lučiūno įdomų įrašą, pateiktą asmeniniame dienoraštyje apie tai, kaip iš blogas.lt sistemos galima "pavogti" svetimą dienoraštį. Savoka "pavogti" nėra visai teisinga - tiesiog kokiais būdais įmanoma prisijungti prie svetimo blogo su administratoriaus teisėmis. Blogas.lt komandą šią saugumo spragą viename iš populiariausių lietuviškų blogų žadėjo ištaisyti, tačiau ji neabejotinai sutinkama ir kai kuriose kitose svetainėse - tad žinoti apie ją tikrai pravers. (Straipsnio rašymo stiliaus ir kalbos redakcija netaisė)


Prisijunk prie technologijos.lt komandos!

Laisvas grafikas, uždarbis, daug įdomių veiklų. Patirtis nebūtina, reikia tik entuziazmo.

Sudomino? Užpildyk šią anketą!

Pradėsiu nuo šiokios tokios trumpos istorijos ir teorijos. Pats web'as atsirado kaip terpė, skirta dalintis informacija (moksliukai juo naudojosi pasidalinti fizikos dokumentais) ir jo veikimo principas buvo labai paprastas. Daug paprastesnis nei yra dabar. Vėliau, pvz. dėl ribotų HTML galimybių ir statiškumo, papildomai buvo sukurta įvairių kitų technologijų, pvz. skriptai. Taip pat dėl to paprastumo HTTP protokolas neturi realizuoto vartotojo sesijos išlaikymo, t.y. kiekviena užklausa serveriui tolygi naujam vartotojui. Dėl pastarosios priežasties atsirado visokie patobulinimai lankytojų įsiminimui.

Vienas iš tokių patobulinimų yra cookies. Cookies vartotojo kompiuteryje saugo įvairius parametrus ir jų reikšmes, kurias perduoda web serveris vartotojui. Tuo tarpu naršyklė, kiekvieno kreipinio į web serverį metu, tuos parametrus su reikšmėmis gražina atgal serveriui. Pagal tas gautas reikšmes serveris ir atpažįsta sugrįžusį vartotoją. Tai tik vienas iš būdų atpažinti sugrįžusį vartotoją ir blogas.lt naudoja būtent jį. T.y. po to, kai į blogas.lt suvedi savo prisijungimo vardą ir slaptažodį, iš serverio į kompiuterį atkeliauja trys pagrndiniai cookies parametrai: username=zzzzzz; password=xxxxxx; u_id=yyyyyy.

Parametras username atitinka prisijungusio vartotojo vardą, password yra šifruotas prisijungusio vartotojo slaptažodis (panašu, kad algoritmas nėra sudėtingas), o u_id yra kažkoks unikalus to vartotojo identifikatorius. Štai pagal šiuos tris parametrus blogas.lt ir identifikuoja prisijungusį vartotoją ir atitinkamai suteikia jam prieigos teises prie jo BLOG'o.

Taigi, belieka serveriui užklausos metu pakišti svetimus šiuo tris parametrus ir blogas.lt tave priims kaip visiškai kitą vartotoją ir nepaprašys įvesti jokių prisijungimo duomenų. Bet kurio vartotojo parametrus username ir u_id galima paprastai sužinoti, tačiau dar lieka parametras password, kurio reikšmę žino tik tikrasis vartotojas ir galbūt blogas.lt. Čia esmė tame, kad įsilaužėliui visiškai nebūtina žinoti tikrosios password reikšmės ir pakanka gauti šifruotą jo reikšmę, kuri turi būti perduota į blogas.lt serverį kartu su užklausa.

O šią reikšmę galima paprastai iš vartotojo pavogti ir tą galimybę suteikia... pati blogas.lt sistema. Tam tereikia joje susikurti savo BLOG'ą ir priversti į jį užeiti prisijungusį vartotoją. Kaip ir minėjau, ką tiksliai savo BLOG'e reikia patiuninguoti nerašysiu, bet papasakosiu patį principą ir kodėl yra didelė tikimybė, kad į tą BLOG'ą užeis prisijungęs kitas blogas.lt blogeris. Kaip ir turi būti, viskas čia yra paprasta. :) Šiuo atveju blogas.lt turi visas cookies vagystei tinkamas savybes.

Pirmoji, ypač nervinanti ilgesnius įrašus rašančius vartotojus, yra ta, kad jei prisijungimo metu neuždedi štai šios varnelės (iliustracija naujienos viršuje - red.pastaba), tai blogas.lt po tam tikro laiko tavęs nebepriims atgal į sistemą kaip autentifikuoto vartotojo, nors tu po ją ir naršai aktyviai.

Čia yra netinkamai realizuotas sesijos išlaikymas. Įsivaizduok vartotoją, kuris rašo ilgą įrašą ir kai paspaudžia "išsaugoti", jį tiesiog permeta į titulinį blogas.lt puslapį ir paprašo iš naujo autentifikuotis. Įrašas, žinoma, neišsaugomas. Vartotojas susinervina. Kaip tokiu atveju nervinasi Gravel lyderis Sinickis, galite paskaityti čia. Jam įrašas neišsisaugojo pagal aprašytą situaciją.

Šis blogas.lt trūkumas verčia vartotojus uždėti varnelę ir visuomet būti prisijungus savo vardu prie blogas.lt. O tai reiškia, kad nesvarbu ką tu darytum blogas.lt sistemoje ar kažką tvarkytum savo BLOG'e, ar tiesiog skaitytum svetimus BLOG'us, tačiau kiekvienos bet kokios užklausos į blogas.lt metu, visuomet bus perduodami tavo trys esminiai cookies parametrai, pagal kuriuos esi identifikuojamas!!!

Antroji, cookies vagystei tinkama savybė yra ta, kad blogas.lt sistemoje BLOG'o savininkas gali redaguoti savo BLOG'o HTML kodą be jokių apribojimų. O tai leidžia patalpinti tą kodą, kuris ir įvykdo į BLOG'ą užsukusio lankytojo cookies vagystę. Tai ir yra dvi esminės blogas.lt savybės, stipriai palengvinančios darbą įsilaužėliui. Naršyti prisijungusius vartotojus verčia pati blogas.lt sistema, o įsilaužėliui tereikia tik tinkamai pakeisti savo BLOG'o kodą ir belieka sugalvoti metodą, kaip į jį įvilioti prisijungusį vartotoją.

Taigi, jei po svetimus bolgas.lt BLOG'us naršai prisijungęs savo vardu, tai kiekvieną kartą, kai tu užeini į svetimą BLOG'ą, iš tavęs galima pavogti tris reikiamus cookies parametrus ir prisijungti prie tavo BLOG'o. Tiesa, šis BLOG'as yra "švarus", tad nebijok į jį sugrįžti.

O šios problemos sprendimo variantų yra daug. Vienas paprastesnių būtų cookies šifravimas panaudojant tik tam vartotojui būdingus parametrus. Pvz. jo IP adresą, naršyklės tipą ir kokį nors daug sunkiau sužinomą parametrą, kuris saugomas tik pas jus DB, bet ne pas vartotoją naršyklėje (pvz. vartotojo įvesta spec. raktinė frazė registracijos metu). Serveriui gavus cookius bandai juos tais parametrais dešifruoti.

Jei cookiai neišsišifruoja, tuomet atjungi lauk vartotoją iš sistemos ir prašai iš naujo jo prisijungimo duomenų. Žinoma, toks būdas reikalautų papildomų serverio resursų šifravimui/dešifravimui. Kitas daug paprastesnis variantas būtų tiesiog sekti pvz. ar cookiai po paskutinio karto atkeliavo iš to pačio IP. Jei IP skiriasi, tuomet atjungi vartotoją ir prašai prisijungti iš naujo. Tiesa, šis būdas nebūtų labai saugus, nes IP iki tam tikros ribos yra padirbami ir ką nors papostinti į svetimą BLOG'ą taip pat būtų galima (aišku atsakymas atgal nebegrįžtų).

Taip pat dar galima nenaudoti cookių taip, kaip jie naudojami dabar. Tik čia jau reikės daugiau pavargti, nes turbūt reikės sistemą stipriai pertvarkyti. Apsaugos lygmenis blogas.lt galima realizuoti kelis ir skirtingus. Variantų daug ir nebūtinai sudėtingų, bet sprendimą pasirinkti teks patiems.

Audrius Lučiūnas,

UAB "Informacijos saugos sprendimai"

Pasidalinkite su draugais
Aut. teisės: www.technologijos.lt
(1)
(0)
(1)

Komentarai (2)

Susijusios žymos: