Clanok je urceny pre ludi, ktori vedia co su to sessions v php
Popiseme si jeden z problemov, ktory sa vyskytuje pri pouzivani na serveri s viacerymi domenami.
Kratke intro
Pri spusteni funkcie session_start z php skriptu sa nainicializuje premenna $_SESSION, do ktorej mozme napraskat rozne hodnoty a po skonceni vykonavania skriptu sa standardne ulozia do suboru s nazvom /tmp/sess_$hash, kde sa hash generuje pre kazdu session unikatne. v pripade, ze dojde uzivatel znovu na stranku a posle v cookie (moze aj cez uri parametre) tento hash, pri zavolani session_start() sa otvori subor sess_$hash a nacitaju sa hodnoty do premennej $_SESSION spat take, ake sme ich zanechali naposledy.
Problem je v stupidnej implementacii standardneho session storage handlera files (ten ich uklada do suborov sess_$hash).
Predstavte si, ze mate konto na nejakom zdielanom webhostingu, kde ma stranky aj konkurencna firma s nejakym administracnym rozhranim na upravy svojho webu, v ktorom sa viete prihlasit ako obycajny uzivatel na pridavanie komentarov.
Ako znicit konkurenciu ?
konkurecna domena -> victim.sk
vasa domena -> elitehaxor.sk
1. prihlasite sa na victim.sk cez web ako uzivatel
2. pozriete si session hash v cookie (budeme ho nazivat $evilhash)
3. na svoju stranku uploadnete nejaky jednoduchy php skript (povedzme x.php) s obsahom <?php session_start(); var_dump($_SESSION); ?>
4. nacitate http://elitehaxor.sk/xxx.php?PHPSESSID=$evilhash
tymto si vypisete vsetky hodnoty/premenne v premennej $_SESSION nastavenej web rozhranim konkurencie na victim.sk
tieto hodnoty mozete menit aj cez spominany skript xxx.php
keby tam napriklad bola premenna $_SESSION['admin']=0 a zmenite ju na 1 a nacitate znovu victim.sk, tak vam system prideli prava admina vo web rozhrani konkurecneho webu
Ako zabezpecit svoj web
1. pouzivat vlastny session handler, ktory bude ukladat sessions trebars do sql databazy
2. pouzit v http serveri daky suidovaci modul, kde httpd pre kazdu domenu bezi pod samostatnym uzivatelom (subor sess_$hash ma nastavene prava 600, takze z ostatnych domen sa nebude dat menit/nacitat) - dobre riesenie, pretoze riesi vsetky domeny na serveri
3. pouzit nejaky rozumnejsi session storage handler (trebars extension do php s nazvom session_mysql), ktory pridava handler co uklada session data do mysql databazy a taktiez tam uklada domenu z ktorej bol nacitany skript - takze z inej domeny sa vam ho nepodari nacitat/zmenit. rovnaky hash pre domenu 1 bude iny session ako rovnaky hash pre domenu2) - dobre riesenie, pretoze riesi vsetky domeny na serveri
Domaca uloha
Ma vas webhosting zabezpecene sessiony v php proti tomuto preoblemu ?
Pavel Stano
Dakujem za gramaticku korekciu brovi. Autor clanku nezodpoveda za ziadne skody sposobene informaciami v tomto clanku.
btw. autorom session_mysql som ja
Neni to zly napad ale kto by hackoval niekomu inemu web na tom istom hostingu kde ho pekne z logov najdu a este aj vedia jeho identitu kedze pre vytvorenie svojho konta musel sa pekne preukazat jedine ze by clovek mal pritup na niekoho iny web :)
to bol cisto iba priklad ako by sa to dalo zneuzit
a ved pouzit nejaku anonymnu proxynu nie je problem (pre pristup k victim.sk, na evilhaxor.sk mzoes ist zo svojej, co robil skript xxx.php nezistia ked ho zmazes)
mas pravdu ...
urcite dobre vediet o takejto moznosti naburania bezpecnosti nokolko ludia do session pchaju vselico, aj ja tam dam obcas nieco co by tam nemalo byt len aby som si usetril robotu a zbavil sa nejakych dasich SQL dotazov
clanok hodnotim ako prinosny :) len tak dalej
klobuk dolu, fakt dobry clanok, zrozumitely a hlavne poucny.... asi sa idem na ten session_mysql aj kuknut, aj ked ma to momentalne az tak trapit zasa nemusi, kedze do sessionov ziadne data typu admin[] neukladam a nehostujem ziadne important veci.... ale tak ci tak... uz len kvoli prehladu
naozaj super clanok. koho to napadne a pritom to je taka haluz. respecta
jail/chroot je tiez riesenie, ale zase obmedzis velmi uzivatelov lebo nespustia ziadnu binarku z phpcka, alebo cgi skript
to sa da tiez poriesit tak ze ku kazdej domene nakopirujes/nalinkujes vsetky potrebne kniznice a binarky co chce uzivatel spustat, ale ked mas >500 domen na webservery, tak je to nepouzitelne :)
pekny clanek ... technicky, prakticky a pritom snadno pochopitelny...davam 8/10.
pekny clanok aj som to skusal hned na mojich skriptach a som si myslel ze to bude fungovat ale mne stale pred uvoodzovkami hodi lomitka takze sa ten dotaz nevykona ale nemam tam ja nic naprogramovane proti tomu ... anything\' OR \'x\'=\'x co mi tam pridava tie lomitka _???
Ahoj, kde sa da zohnat session_mysql? Treba nejake nastavenia v php.ini?