Problem php session v mass virtualhost prostredi

07.02.2006 23:37 | stanojr

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

    • ristekpa 08.02.2006 | 01:41
      Avatar WooDy   Používateľ
    • Nie zle ale kto by to robil ? 08.02.2006 | 11:50
      Avatar blackhole   Návštevník

      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 08.02.2006 | 12:03
        Avatar stanojr   Používateľ

        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)

        • pravda 08.02.2006 | 14:56
          Avatar blackhole   Návštevník

          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 08.02.2006 | 16:55
      Avatar blackhole   Návštevník

      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

    • super clanok 08.02.2006 | 20:32
      Avatar bhole   Používateľ

      naozaj super clanok. koho to napadne a pritom to je taka haluz. respecta

    • jail 09.02.2006 | 00:10
      Avatar blackhole   Návštevník
      Clanok je fakt fajn.. len taka drobnost.. co takto jailovat uzivatelov? V tom pripade by mali useri pristup k svojim strankam a domacemu adresaru, no nemali by sa ako dostat k /tmp kde by zapisoval httpd, pripadne zajailovat aj ten;-) urcite chytrejsie ako suid, aspon co do bezpecnosti.. ale db je tiez fajn..
      • jail/chroot je tiez 09.02.2006 | 00:41
        Avatar stanojr   Používateľ

        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 :)

      • undo 09.02.2006 | 00:41
        Avatar blackhole   Návštevník
        beriem spat.. myslel som, ze potencialny utocnil by vyuzil moznosti citat z /tmp,..
    • pekne 12.02.2006 | 13:48
      Avatar blackhole   Návštevník

      pekny clanek ... technicky, prakticky a pritom snadno pochopitelny...davam 8/10.

    • nefunguje 17.06.2006 | 22:35
      Avatar blackhole   Návštevník

      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 _???

    • Kde ziskat extenziu do PHP 03.10.2006 | 22:33
      Avatar blackhole   Návštevník

      Ahoj, kde sa da zohnat session_mysql? Treba nejake nastavenia v php.ini?