Zneužitelnost GIFu v PHP – braňte se

O možnosti zneužití speciálně upravených souborů GIF ve webových aplikacích se toho napsalo na českém i mezinárodním internetu spousta. Přesto si tento problém zaslouží být připomenut, a to zejména s ukázkou řešení, jak se takové zneužitelnosti z pohledu tvůrce webové aplikací bránit.

Reklama

Zmíněný problém nastane v případě, kdy útočník použije soubor GIF, do jehož těla umístí nějaký škodlivý kód PHP. Tento soubor pak přejmenuje z obrazek.gif na obrazek.gif.php. Nyní mu stačí, aby takovýto upravený obrázek nahrál do nějaké webové aplikace. Pokud je server, na kterém tato aplikace běží, nastaven tak, aby automaticky zpracovával soubory končící s příponou .php, pak má útočník skoro vyhráno. Server totiž provede kód uložený v obrazek.gif.php a problém je na světě.

Řešení tohoto potenciálně velmi nebezpečného problému je jednoduché. Buď zajistíte, aby byly obsluhovány pouze obrázky s odpovídající příponou na konci (tedy .gif, nikoli .gif.php), nebo zamezíte přímému přístupu k souborům ve složce, do které jsou obrázky ve vaší aplikaci nahrávány. V praxi to vypadá tak, že využijete souboru .htaccess, do kterého umístíte tři řádky:

<Files images>
deny from all
</Files>

Chcete-li řešení přímo v PHP, pak musíte zajistit, aby s obrázky bylo také manipulováno jako s obrázky. Používejte funkci basename(), vyhnete se tak podvržení upravených cest k souboru.

$file = 'image.gif.php';
Header('Content-Type: image/gif');
readfile('images/'.basename($file));

Další informace k popsanému problému najdete v příspěvku na blogu PHP Classes (anglicky).

Reklama

Komentáře

Dost dobře nechápu onu zranitelnost. Pokud *jakýkoliv* uploadovaný soubor ukládám jako *.php, tak jsem, dámy prominou, naprostý kripl, protože do meta dat (jakéhokoliv) obrázku lze php kód nacpat, stejně jako do jakéhokoliv jiného souboru.

Taky nechápu, v čem je problém. Píšete o imaginárním útočníkovi, kterému stačí vytvořit GIF obsahující PHP kód... atd.

Jak váš útočník dostane tento GIF na můj server? Jak mě následně donutí, abych ho přejmenoval na *.gif.php?

A proč se v této souvislosti píše o GIFu? Vždyť tohle můžu udělat s libovolným souborem. Třeba umístím PHP kód do prostřed XLS souboru a ten pak přejmenuju na *.xls.php a spustím.

Ale fakt nevidím to nebezpečí. Jak by měl útočník tedy správně postupovat, aby u mě ten škodlivý PHP kód spustil?

Přidat komentář