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).
Tvůrce webů z Brna se specializací na Drupal, WordPress a Symfony. Acquia Certified Developer & Site Builder. Autor několika knih o Drupalu.
Web Development Director v Lesensky.cz. Ve volných chvílích podnikám výlety na souši i po vodě. Více se dozvíte na polzer.cz a mém LinkedIn profilu.
Komentáře k článku
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?
Doporučuji ke kouknutí http://www.scanit.be/uploads/php-file-upload.pdf
Jan Polzer
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.