Hlavní navigace

Bezpečnostní díra v PHP

Lukáš Zapletal 18. 9. 2000

Byla odhalena první větší bezpečnostní díra v PHP týkající se uploadu souborů. Nejedná se o nic velkého, pokud nepoužíváte file upload, vůbec se vás to netýká. Podívejme se jí ale raději na zoubek...

Upload souborů přes HTTP znamená, že si může uživatel pomocí prohlížeče přímo na stránce vybrat soubor a poslat ho serveru ke zpracování. Soubor je zakódován v hlavičce dotazu, webový server ho dekóduje a předá řídícímu skriptu/programu, který jej zpracuje. Menší nevýhodou je, že prohlížeče mají nastaven příliš krátký timeout při http dotazu. Pokud je soubor veliký (řádově několik megabajtů) tak se díky kódování a díky tomuto timeoutu někdy prohlížeč stránky nedočká. Jak to v praxi probíhá si můžete otestovat zde:


PHP nakládá s příchozími soubory tak, že je uloží do dočasného adresáře (/tmp – dá se konfigurovat) a předá skriptu informace v proměnných, které byly nastaveny v HTML kódu formuláře. Dočasný soubor je automaticky smazán po dokončení skriptu. Pokud chcete soubor permanentně uložit, musíte jej někam zkopírovat (například do BLOBu). Pokud tedy ve formuláři je <INPUT TYPE=FILE NAME=SOUBOR>, pak PHP skript, zpracovávající tento požadavek, obdrží následující proměnné (pokud jste ovšem nezměnili default nastavení register_globals v php.ini):

/* uplna cesta k ulozenemu souboru */
$soubor = '/tmp/AFKSsd4d56';
/* plne jmeno vzdaleneho souboru */
$soubor_name = "C:\Dokumenty\Test.txt";
/* typ dokumentu (MIME) */
$soubor_type = "text/plain";
/* velikost souboru v bajtech */
$soubor_size = 150;

Pokud máte zapnutou volbu track_vars v php.ini (v PHP 4.0.X se nedá vypnout), pak proměnnou $soubor naleznete v poli $HTTP_POST_VARS (manuál tvrdí že jsou tam všechny proměnné, nicméně na mém systému (4.0.2) je tam pouze $soubor, který obsahuje cestu ke vzdálenému souboru). Od verze PHP 4.0.X je všechno přehledně nastaveno v dvourozměrném poli $HTTP_POST_FI­LES[‚soubor‘] (name, type, size a tmp_name).

Problematiku máme za sebou a nyní k problému. Pokud vytvoříte šikovně pojmenované „INPUTy“ v HTML formuláři, můžete donutit nepřipravený PHP skript, aby pracoval s jiným souborem, jiným způsobem nebo mu změnit informaci o velikosti souboru:

 <INPUT TYPE="hidden" NAME="soubor" VALUE="/etc/passwd">
 <INPUT TYPE="hidden" NAME="soubor_name" VALUE="c:\bla\bla\fake.txt">
 <INPUT TYPE="hidden" NAME="soubor_type" VALUE="text/plain">
 <INPUT TYPE="hidden" NAME="soubor_size" VALUE="500000">

Jistě mi dáte za pravdu, že PHP skript bude přinejmenším zmaten. V nejhorším případě provede uložení souboru /etc/passwd do databáze a uživatel si ho pak v klidu stáhne (pokud to webová aplikace umožňuje). Tato chyba se týká pouze skriptů, které jakkoliv nakládají s http file upload.

Nabízí se hned několik řešení. Jednak můžete úplně vypnout file upload, což je nejbezpečnější. Druhým řešením (zejména pro ty, kteří nemají možnost modifikovat php.ini) je kontrolovat, zda proměnná $soubor_* není obsažena v $HTTP_*_VARS polích. Pokud je, ignorujte ji. Pokud máte PHP 4.0.X, jste za vodou. Používejte zbrusu nové globální pole $HTTP_POST_FILES. Jelikož je toto pole vícerozměrné, odpadá možnost mystifikovat skript (tzn. $HTTP_POST_FI­LES[‚soubor‘][‚tmp_n­ame‘] útočník nezmění). Blíže viz. dokumentace.

Bezpečnostní chyby v PHP jako takovém se vyskytují velmi zřídka. To se ovšem nedá říct o aplikacích, napsaných v PHP. Programů a úloh v PHP je opravdu obrovské množství a díky tomu, že PHP má v sobě funkce, které umožňují operovat se souborovým systémem počítače, otevírat sockety nebo používat různé protokoly, mohou být aplikace, které nainstalujete na svůj systém velmi nebezpečné. Pokud si programátor nedá pozor (nebo člověk, který aplikaci instaluje – stačí nešikovná konfigurace), bude překvapen. Útočník totiž nemusí být žádný hacker-specialista. Stačí, když zná protokol HTTP, PHP a jeho funkce, operační systém na kterém aplikace běží a má nějaké ty zkušenosti. Takový phpFileBrowser by mohl být pro útočníka velmi zajímavým odrazovým můstkem. Aplikace jsou většinou s otevřeným kódem, což útok ještě více usnadňuje. Musíme být pozorní nebo prostě doufat, že bude chyba odhalena a odstraněna včas.

O PHP
PHP je skriptovací interpretovaný jazyk vyvíjený již od roku 1994 (dříve měl název PHP/FI), masově se však rozšířila až třetí řada. V současnosti jsou dostupné (a nejpoužívanější) dvě řady verzí: 3.0.X a 4.0.X. Řadu 3.0.X spravuje open source komunita a její vývoj byl zastaven a nyní můžeme čekat jen minoritní verze opravující chyby. Řadu 4.0.X spravuje firma ZEND, kterou založili hlavní programátoři řady 3.0.X (Andi Gutmans a Zeev Suraski). Tito chlapíci se rozhodli kompletně přeprogramovat jádro, což také udělali a díky tomu je nová řada několikanásobně rychlejší a přislíbili otevřený vývoj nových verzí pod licencí PHP, zcela nový debugger, optimalizátor, kompilátor, cache a kompletní prostředí ve stylu InterDev (zatím je dostupný pouze optimalizátor – Zend Optimizer, avšak tento produkt již není open source). Myslím že firma Zend Technologies toho má v rukávu ještě mnoho a že se teprve rozjíždí.

Reference:
www.securityfo­cus.com
www.php.net
www.php.cz
www.php.cz/pro­jects.php
www.zend.com
phplib.netuse.de
phpclub.unet.ru
www.phpwizard.net

Našli jste v článku chybu?

19. 9. 2000 19:46

Wejn (neregistrovaný)

Hah ... to me bavi ... a to si myslite ze nejde 'fejknout' referer? LOL :)

19. 9. 2000 16:33

RWS (neregistrovaný)

Osobne vyzkouseno, testovani HTTP_POST_VARS nepomuze: viz:
*** Odeslan soubor: ***
$soubor = '/tmp/phpVb7Lqj'
$soubor_name = 'hry.html'
$soubor_type = 'text/html'
$soubor_size = '4069'

Promenne $HTTP_GET_VARS:

Promenne $HTTP_POST_VARS:
$soubor_name = 'hry.html'
$soubor = '/tmp/phpVb7Lqj'
$soubor_size = '4069'
$oda = 'Odeslat soubor'

*** Odeslany promenne: ***
$soubor = '/etc/issue'
$soubor_name = 'muj.txt'
$soubor_type = 'text/plain'
$soubor_size = '2000'

Promenne $HTTP_GET_VARS:

Promenne $HTTP_…














Lupa.cz: Propustili je z Avastu, už po nich sahá ESET

Propustili je z Avastu, už po nich sahá ESET

Měšec.cz: U levneELEKTRO.cz už reklamaci nevyřídíte

U levneELEKTRO.cz už reklamaci nevyřídíte

DigiZone.cz: ČRo rozšiřuje DAB do Berouna

ČRo rozšiřuje DAB do Berouna

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

120na80.cz: Pánové, pečujte o svoje přirození a prostatu

Pánové, pečujte o svoje přirození a prostatu

Měšec.cz: Kdy vám stát dá na stěhování 50 000 Kč?

Kdy vám stát dá na stěhování 50 000 Kč?

Podnikatel.cz: Babiše přesvědčila 89letá podnikatelka?!

Babiše přesvědčila 89letá podnikatelka?!

Vitalia.cz: Chtějí si léčit kvasinky. Lék je jen v Německu

Chtějí si léčit kvasinky. Lék je jen v Německu

Podnikatel.cz: Víme první výsledky doby odezvy #EET

Víme první výsledky doby odezvy #EET

Podnikatel.cz: EET: Totálně nezvládli metodologii projektu

EET: Totálně nezvládli metodologii projektu

Měšec.cz: Finančním poradcům hrozí vracení provizí

Finančním poradcům hrozí vracení provizí

Podnikatel.cz: Prodává přes internet. Kdy platí zdravotko?

Prodává přes internet. Kdy platí zdravotko?

Podnikatel.cz: 1. den EET? Problémy s pokladnami

1. den EET? Problémy s pokladnami

Vitalia.cz: Baletky propagují zdravotní superpostel

Baletky propagují zdravotní superpostel

Vitalia.cz: Paštiky plné masa ho zatím neuživí

Paštiky plné masa ho zatím neuživí

Vitalia.cz: Tesco: Chudá rodina si koupí levné polské kuře

Tesco: Chudá rodina si koupí levné polské kuře

DigiZone.cz: Sony KD-55XD8005 s Android 6.0

Sony KD-55XD8005 s Android 6.0

Lupa.cz: Google měl výpadek, nejel Gmail ani YouTube

Google měl výpadek, nejel Gmail ani YouTube

Podnikatel.cz: Podnikatelům dorazí varování od BSA

Podnikatelům dorazí varování od BSA

DigiZone.cz: Recenze Westworld: zavraždit a...

Recenze Westworld: zavraždit a...