Uzbrukumi caur Cookie
Autors: alijs (alijs (at) navigator.lv)Kategorija: Drošība
Cookie ir teksta faili, kas satur dažādu web lapām nepieciešamu informāciju. Tie glabājas uz lietotāju datoriem, kur tos parasti ievieto pati web lapa pirmo apmeklējumu laikā. Tipisks cookie izmantošanas piemērs, ir, piemēram, valodas izvēle. Pirmā apmeklējuma laikā lietotājs izvēlas web lapas apskates valodu un viņa izvēle tiek saglabāta cookie failā. Nākamajā reizē apmeklējot web lapu, tiek izmantoti cookie dati, lai lapu jau uzreiz attēlotu pareizajā valodā.
Cits ļoti izplatīts cookie izmantošanas veids ir sesijas identifikatora saglabāšana. Sesijas saglabāšana ļauj, piemēram, autorizēties kādā lapā, aizvērt pārlūku, un pēc atkārtotas pārlūka palaišanas turpināt darbu bez atkārtotas autorizācijas un savu datu ievadīšanas. Ērti un vienkārši, tāpēc arī cookie praksē tiek bieži pielietoti. Tomēr, nepareizi lietojot, cookie var izveidot nopietnu caurumu web lapas drošībā. Izmantojot šo caurumu, uzbrucējs atsevišķos gadījumos var iegūt dažādu failu saturu uz web servera, un pat izpildīt uz tā savu kodu.
Drošības problēmu sakne cookie gadījumā, līdzīgi kā daudzos citos ar drošību saistītos jautājumos, meklējama koda kļūdās, kas rodas cilvēka psiholoģisko īpašību dēļ. Programmētājs, rakstot kodu, ietver tajā rindiņas, kas uzstāda cookie datus un rindiņas, kas šos datus pēc tam nolasa. Šiem datiem teorētiski nav paredzēts mainīties, tādēļ programmētājs atbilstoši raksta kodu - pieņemot, ka nolasītie dati ir tie paši, kas pirms tam tika cookie failā ierakstīti. Šī pieņēmuma dēļ izlaistās cookie datu pārbaudes arī ir carurums drošībā.
Šeit jāatceras, ka cookie faili pēc savas būtības ir parasti teksta faili, kas glabājas uz web lapas apmeklētāja datora. Līdz ar to nav nekādu ierobežojumu, lai viņš šos datus nemainītu.
Apskatīsim piemēru, kad cookie datos glabājas lietotāja izvēlētā valoda, kas tiek izmantota, attēlojot lapas saturu. Pieņemsim, ka visi teksti atrodas failos "LV.php", "EN".php, u.t.t., kuri satur lapas satura tulkojumus atbilstošās valodās. Galvenajā lapā tiek pieslēgts izvēlētajai valodai atbilstošais fails un lietoti tajā esošie teksti. Diezgan izplatīta pieeja, kā rakstīt šādu kodu, ir apmēram sekojoša:
include("$_COOKIE['language'].php");
Kāpēc tas ir nepareizi? Ļoti vienkārši - tāpēc, ka tiek izmantot cookie mainīgais, nepārbaudot tā vērtību.
Ja angļu valodas teksti atrodas failā "EN.php", tad, saņemot cookie datos vērtību "EN", šis fails tiek pieslēgts un lapas saturā izmantojas angliskie teksti kā plānots. Bet, piemēram, ja cookie failā "EN" tiks nomainīts uz "XX", tad notiks mēģinājums pieslēgt failu "XX.php", kas visticamāk uz servera neeksistē. Līdz ar to tiks iegūta kļūdu - visticamāk vienkārši web lapā nekādi teksti nebūs redzami.
Bet ja "EN" vietā tiks saņemts kāda cita, uz servera eksistējoša faila nosaukums (index.php vai login.php), tad tiks pieslēgts un izpildīts šis cits fails. Iegūtais rezultāts nav prognozējams. Ja kaut kas nav prognozējams, tad tas ir potenciāli bīstams.
Praktiski šādā veidā web lapas apmeklētājs var izpildīt uz servera jebkuru PHP failu. Tas jau vairs nešķiet tik nenozīmīgi. Turklāt atsevišķos gadījumos ir iespēja uz servera izvietot failu ar savu PHP kodu un to izpildīt. Nav grūti iedomāties, cik plašas iespējas paveras potenciālajam ļaundarim, ja viņš var izpildīt uz web servera pats savu kodu.
Šeit gan ir viena neliela aizķeršanās - failu ar savu PHP kodu uz servera izvietot bieži vien varētu būt sarežģīti. Bet varētu arī nebūt sarežģīti. PHP kodu, piemēram, ir iespējams ievietot GIF attēlā. Kodu atsevišķos gadījumos var iedabūt web servera log failos un izpildīt šos log failus. Kā arī eksistē vēl vairāki viltīgi paņēmieni. Šī raksta ietvaros gan tos neapskatīsim.
Risinājums. Lai izvairītos no augstāk minētajām potenciālajām problēmām, piemērā doto kodu varētu pārrakstīt sekojoši:
if ($_COOKIE['language'] == "EN") {
include("EN.php");
} else {
include("LV.php");
}
Kā redzams, tad šajā gadījumā saņemtie cookie dati tiek pārbaudīti, nevis pa tiešo izmantoti kodā. Ja tiks saņemts "EN", tad tiks pieslēgts fails "EN.php" un izmantosies angļu valoda, jebkurā citā gadījumā tiks pieslēgts fails "LV.php" un lapa korekti tiks rādīta latviski. Kods gan ir garāks un varbūt nav tik "skaists", tomēr tas vismaz ir drošs. Un tas nav maz.
Komentāri
Hannibals, 2009-02-24 19:23:48
Pēdējā laikā jau liela daļa savas lapas vairs neraksta no nulles iekš PHP, bet taisa tās uz Wordpress, Joomla, utml. platformām.
alijs, 2009-02-24 22:37:13
Nu ko varu teikt... tam ir savas priekšrocības, savi trūkumi...
Lai pievienotu komentāru, autorizējies!


SĀKUMS
RAKSTI