Ovládnutí PHP přepsáním proměnné

Školení, která pořádám

Největší expert na bezpečnost PHP Steffan Esser odhalil útok, pomocí kterého lze kromě jiného přepsat konfigurační direktivy jako safe_mode a open_basedir nebo povolit zakázané funkce jako např. dl.

Útok je poměrně komplikovaný, ale je založen na jednoduché myšlence – stačí změnit hodnotu proměnné poté, co ji interní funkce PHP ověří. Použít se k tomu dá např. error handler. Pokud následující kód vypíše A ay, tak to je také zvuk, který byste měli vydat:

<?php
function change_s() {
    $GLOBALS["s"] = "rr";
}
set_error_handler("change_s");
$s = " ";
echo implode(" ", explode(&$s, array()));
?>

Pro detailní rozbor útoku doporučuji přečíst paper, který je sice poměrně dlouhý, ale čte se velmi dobře.

Obrana proti tomuto útoku zatím není známa, pouze se dá jeho provedení všelijak zkomplikovat. Pro budoucí verze PHP je připravena oprava, která znemožňuje jednu variantu tohoto útoku, další varianty ale fungují dále.

Na školení Bezpečnost PHP aplikací popisuji, jak připravit sdílený hosting tak, aby nebyl závislý na nastavení safe_mode a open_basedir. Možnost přepsání těchto direktiv považuji za největší hrozbu tohoto útoku.

Přijďte si o tomto tématu popovídat na školení Bezpečnost PHP aplikací (13.3.2018, Praha).

Jakub Vrána, Ze zákulisí, 22.8.2009, diskuse: 8 (nové: 0)

Diskuse

Martin:

Tak to by mě tedy zajímalo, kterou variantu zabezpečení sdíleného hostingu prosazuješ. Vždycky jsem totiž žil v domnění, že problematice administrace serverů až tak do hloubky nerozumíš.

Variant je několik a každá z nich má určité mouchy. Zajímalo by mě, jestli jsou všechny možnosti zmíněny a pokud ano, tak zda i jejich mouchy :)

Ale tak zvědavý, abych kvůli tomu šel na školení pro začátečníky, to opravdu nejsem :)

ikona Jakub Vrána OpenID:

Školení je skutečně zaměřeno na bezpečnost aplikací a bezpečnosti serveru se tam věnuji jen okrajově. Přípravě sdíleného webhostingu se tam ale zrovna věnuji.

Nerozebírám to nijak zvlášť do hloubky a popisuji jedno řešení, které jsem sám vymyslel a zatím jsem o něm nikde jinde nečetl.

Martin:

Těším se tedy na zveřejnění toho řešení zde na blogu, aby mohlo být podrobeno detailní oponentuře :)

Bez oponentury totiž může mít i sebegeniálnější nápad skyté vady.

těžkotonážní pusa:

Prosím o popostrčení, co se týče pochopení toho útoku. Konkrétně nerozumím tomu, jak může útočník cokoli udělat "z vnějšku", když error_handler si nastavuje programátor skriptů.

Martin:

Nejde o útok na www stránku vnějším pozorovatelem, ale o útok na klienty sdíleného hostingu programátorem, který má na tomto hostingu také svůj účet.

Důsledky můžou být smrtící - při úspěchu může dotyčný zavirovat ostatní stránky, ukrást jejich zdrojové kódy, ukrást cizí databáze (s nezahashovanými hesly nebo uschovanými čísly kreditních karet) atd.

Proto je tak důležité zabezpečit sdílený hosting s php tak, aby i při kompromitaci php stále nebylo možné číst či ovlivňovat cizí účty. A proto mě zajímá, zda je soukromá metoda pana Vrány opravdu tak neprůstřelná, jak tvrdí. Když to školí, měl by si tím být stoprocentně jist.

Napadnik:

Tak si na to skoleni zajdi a domluv se s Jakubem, ze jestli najdes nejakou slabinu v tom jeho zpusobu, tak to budes mit zadarmo. Taky by me zajimalo, jestli se na Jakubovem skoleni prezentuje funkcni reseni.

ikona Jakub Vrána OpenID:

Řešení zveřejním na tomto blogu.

ikona ehmo:

netreba zabudat na php shell, ktory umoznuje vkladat vlastne skripty na web. masin, ktorych su nachylne na rfi su desiatky tisic

Vložit komentář

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

avatar © 2005-2018 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.