включение файла c именем в URL

Warrior92

Новичок
включение файла c именем в URL

Я включаю php-файл в код, имя которого, без расширения, передается в параметре mname URL, а сам файл ищется в папке modules. Может-ли при этом злоумышленник выполнить произвольный код? И как от этого защититься?
 

phprus

Moderator
Команда форума
Warrior92
Выполнить произвольный код нет, а вот проситать произвольный файл вполне может. Все зависит от того как проверяется правильность параметра mname.
 

Фанат

oncle terrible
Команда форума
может.
как минимум, обрабатывай переданное имя функцией basename() или регулярным вырвжением, в котором прописаны допустимые в имени файла символы.
 

AlexBB

Новичок
if (file_exists($filename))
{
include($filename);
}

-~{}~ 29.11.06 16:19:

Автор оригинала: phprus
Warrior92
Выполнить произвольный код нет, а вот проситать произвольный файл вполне может. Все зависит от того как проверяется правильность параметра mname.
Иногда, может!
Зависит от настройки директивы
allow_url_fopen
 

phprus

Moderator
Команда форума
AlexBB
Иногда лучше жевать чем говорить. Этот код ни от чего не спасает.
 

phprus

Moderator
Команда форума
AlexBB
Нет. Так как в mname наверняка подставляется путь до папки modules

-~{}~ 29.11.06 18:26:

Фанат
Скажите тогда в чем я неправ.
 

AlexBB

Новичок
2Фанат
Ну вот, опять тоже самое что и в предыдущей теме.
Ну считаете, что кто-то неправ - так объясните почему.

Лано все, обещаю больше не комментировать Ваши неинформативные посты. Вы тут типа за главного ... хозяин барин.
 

Андрейка

Senior pomidor developer
AlexBB
да фига там комментировать.. по вашему любому коду можно смело на ящик пива спорить
 

Фанат

oncle terrible
Команда форума
phprus, тебе AlexBB ответил. Исполнить код можно.

AlexBB, проверка существования файла - это не защита.
навредить можно и заинклюдив локальный файл.
 

phprus

Moderator
Команда форума
Фанат
phprus, тебе AlexBB ответил. Исполнить код можно.
Пример в студию.
Вне зависимости от параметра allow_url_fopen в Данном Конкретном случае удаленный код выполнить нельзя, так как у Warrior92 файлы ищуться не в текущем каталоге, а в каталоге modules соответственно путь до modules наверняка добавляется в начало переменной mname, а следовательно код
include('path/to/modules/http://что-угодно') уже не приведет к выполнению удаленного кода.

Хотя в общем случае выполнение произвольного кода возможно, но я говорил про конкретный случай конкретного человека.
 

MadGreen

meninweb
phprus
а что если в качестве "что угодно" передать str_replace или preg_replace?
 

AlexBB

Новичок
2Фанат.
Как приятно разговаривать "по существу". :)

ИМХО, нельзя навредить т.к. $filename должно иметь вид

PHP:
$filename = 'dir_for_include/'.$_GET['filename'].'.php'
В dir_for_include лежат только "легальные" файлы.

Другой, вопрос, что надо точно глянуть доку и проверить ... не исключено, что file_exist может при включенной allow_url_fopen сработать на url.

Точно не помню, если так то меняем ее на is_file
 

phprus

Moderator
Команда форума
MadGreen
И что должно быть?
<?php
include ("/tmp/http://str_replace('a', 'b', 'ab')");
?>
как и положенно выдает ошибку:
Warning: include(/tmp/http://str_replace('a', 'b', 'ab')): failed to open stream
: Invalid argument in Z:\1.php on line 2

Warning: include(): Failed opening '/tmp/http://str_replace('a', 'b', 'ab')' for
inclusion (include_path='.;/usr/local/php/PEAR') in Z:\1.php on line 2
 

Фанат

oncle terrible
Команда форума
phprus
Да, ты прав, я не подумал.
AlexBB
можно включить файл, для этого не преднащначенный.
хрестоматийная иллюстрация - /etc/passwd

-~{}~ 29.11.06 22:19:

MadGreen
Уж на что я и сам тут маху дал, но твой камент как-то вообще за гранью добра и зла
 

MadGreen

meninweb
AlexBB,
попробуй написать ../

phprus,
1. str_replace без проверки через урл можно передать и как
".$a=str_replace("a", "b", $a)."
и элементарно попытаться заменить какую-нибудь переменную
2. можно узнать много интересного про стуктуру файлов скрипта на сервере (если включено отображение ошибок)
 

Фанат

oncle terrible
Команда форума
MadGreen
приведи, пожалуйста, работающий пример этого бреда.
AlexBB
показываю один раз. программисту на пхп с семилетним стажем
dir_for_include/../../../etc/passwd
 

AlexBB

Новичок
Мда ... согласен.
А если предварительно
str_replace('../', '', $filename);
Есть еще примеры небезопасных сочетаний, кроме ../ ?
 

Фанат

oncle terrible
Команда форума
не нало гоняться за возможными сочетаниями.
Надо сразу оставить в переменной только разрешенные.
как я написал выше - регом или функцией basename()
 
Сверху