Apache (DELSI)

oldfrog.linux na volny.cz oldfrog.linux na volny.cz
Středa Říjen 27 10:54:01 CEST 2004


Max Černý wrote:

>> Kdepak jste to hledal, kdyz ne na webu php.net?
>> http://cz.php.net/register_globals
>
> Tento clanek jsem cetl... Ale neni v nem odpoved na moji otazku. Tyto 
> dva popsane zpusoby jsou prece stejne zabezpecene. Zadny rozdil tu 
> nevidim... Nebo snad ano?


Protoze nelze zjistit, zda hodnoty POST a GET nastavil skript nebo rucne
uzivatel, je vhodne zarucit, aby metody POST a GET nemohly primo menit interni
promene skriptu. To zajisti volba register_globals=off. Veskere nacitani dat
pak probiha vedome ctenim z poli POST a GET. Tim lze zajistit, ze vykonavani
programu nebude primo rizeno hodnotami, ktere do skriptu v neocekavanem miste
cilene zanesl utocnik.

Nebezpeci ovsem pochazi take jiz ze samotnych hodnot nactenych od uzivatele.
Neni trivialni zarucit, ze nactena hodnota je duveryhodna a ze napriklad neobsahuje
kod, ktery bude nejakou fintou nechtene vykonan.  V tomto pripade je skoro jedno,
zda mam nactenou hodnotu pristupnou v aktualnim jmennem prostoru nebo uvnitr
nejakeho pole. V obou pripadech ji budu chtit nejak pouzit a toto pouziti muze
probehnout jinak nez jsem zamyslel (vykonanim zavleceneho kodu).

Jsou tu tedy nebezpeci dve - neduveryhodna hodnota promenne a zmena promenne
v miste, kde nemela byt menena. Nastaveni volby register_globals na off pomuze
toliko v druhem pripade a navic pouze tehdy, je-li skript dobre napsan. Samotne
pouziti $_GET a $_POST neprinasi zadnou zmenu bezpecnosti.

Toto je malokde jasne vysvetleno a i priklady uvedene na
http://www.php.net/manual/en/security.globals.php podle me situaci spise
zamlzuji.

Uvedu podobne tri priklady. Nasledujici kod

    if ($authorized) {
       include "/highly/sensitive/data.php";
    }

obsahuje stejnou chybu jako kod

    if ($_GET['authorized']) {
       include "/highly/sensitive/data.php";
    }

Chyba spociva v tom, ze se program rozhoduje na zaklade hodnoty, kterou muze
pripadne rucne zadat utocnik. V druhem prikladu muze hodnotu zadat utocnik vzdy
- nezavisle na nastaveni register_globals, protoze zde jaksi vedome program cte
uzivatelska data. V prvnim priklade lze podvrhnout hodnotu authorized jen pri
zapnutych register globals.

Univerzalnejsi reseni je treba

    if (user_authorized()) {
       include "/highly/sensitive/data.php";
    }

kdy fce user_authorized() vrati TRUE nebo FALSE. Nyni je pripadne
kompromitovatelny kod soustreden ve fci user_authorized() a lze jej navic
kompromitovat jen nebezpecnou hodnotou (fce ma vlastni jmenny prostor,
ktery importuje jen globalni promenne a deklarovane parametry fce)
prihlasovacich udaju (nactenych treba z $_POST). Samotne rozhodovani
ve vyse uvedenem kodu se deje na zaklade hotnoty, kterou mam plne
pod kontrolou a nezalezi pritom na nastaveni register_globals.

Je to mozna trochu OT tema, ale ne zase tolik, protoze adminovi by melo byt
jasne proc ma v php nastavene register_globals=off.

Zdravi
OldFrog.




-- 
------------------------------
Ondrej Nemecek alias 'OldFrog'

tel (domu):     241766035
tel (prace):    222090711
tel (mobil):    775046246
icq:            250163477
------------------------------




Další informace o konferenci Linux