PHP Injection je vcelku často vyskytující se chyba. Dopouštění se jí hlavně začínající programátoři v PHP, kteří si hned chtějí udělat svůj vlastní web, avšak na zabezpečení moc nemyslí. PHP Injection se také někdy nazývá nechráněná inkluze. Tento název trochu lépe popisuje to, o co se vlastne jedná. „Inkluze“ vychází se slova include, což je funkce jazyka PHP pro vkládání externího souboru (html, php, txt) do skriptu. A co znamená „nechráněná“ je asi každému jasné. Tato chyba tedy umožní útočníkovi uploadovat na server svůj skript. Pokud na serveru, na němž je napadený web uložen, neběží safe_mode, může útočník získat nad webem úplnou kontrolu. Může mazat, editovat, či přidávat další soubory, což může být pro postižený web zničující.

Typická adresa napadnutelná přes PHP Injection vypadá následovně:

http://nejakyweb.cz/index.php?promenna=stranka.php

(místo stranka.php může být také stranka.html, či stranka.htm)

Aby byl web napadnutelný, musí obsahovat ve svém zdrojovém kódu toto:

<? include($promenna); ?>

(namísto funkce include() může být použita také funkce require(), require_once() nebo include_once() – pro více podrobností a rozdíly mezi těmito funkcemi navštivne online PHP manual)

Funkce při tomto použití vloží do stránky jakýkoliv soubor, který zadáme v parametru URL adresy. Nemusí se však jednat pouze o soubor, ale i o celý jiný web v případě, že místo jména souboru vložíme absolutní URL adresu:

http://nejakyweb.cz/index.php?promenna=http://stoyan.ic.cz

Do napadnutého webu bude vložen zdrojový kód Stoyan’s Page a vy výsledku uvidíte chaos způsobený zkřížením původního a includovaného webu.

Proti PHP Injection je však jednoduchá obrana. Nejjednodušší je namísto pouhého a zranitelného „include($promenna);“ použít cyklus switch:


<?
switch ($promenna)
{
  case "novinky.php":
    include("novinky.php");
    break;
  case "clanky.php":
    include("clanky.php");
    break;
  // atd...
 default:
   //v případě, že proměnná obsahuje něco jiného než novinky.php, 
   clanky.php atd, se zobrazí hlášení o chybě.
    echo "Chyba"; 
    break;
}
?>

Řešení přes switch je sice bezpečné, ale mnohem elegantnější je vytvořit si na zobrazování vkládaných souborů vlastní funkci:

<? zobraz_data() ?>

Tělo funkce:


<?
function zobraz_data()
{
  if ($_REQUEST["promenna"]<>'')
      $mujclanek=$_REQUEST["promenna "]; 
  else $mujclanek="novinky";
  if (is_file($mujclanek.".php")){
      $nazevclanku=$mujclanek.".php";
      include $nazevclanku;}
  //v souboru notfound.php bude chybové hlášení    
  else{ include "./notfound.php";} 
 }
?>

Tato funkce si přečte obsah proměnné ‚promenna‘ a podle ní otevře příslušný soubor doplněním přípony (.php) za název. Tato adresa:

http://nejakyweb.cz/index.php?promenna=novinky

tedy do hlavní stránky nahraje obsah souboru novinky.php. Tento způsob includování souborů je velmi pohodlný. Ať už však použijete zmíněnou funkci nebo cyklus swith, bude toto includování naprosto bezpečné.

Na závěr doporučuji přečíst si článek o PHP Injection na Luzer Portalu a vynikající Emkeiův článek na Soomu.

Související příspěvky

Peter Wang