Exec функция в PHP и passthru? - PullRequest
       33

Exec функция в PHP и passthru?

0 голосов
/ 09 января 2010

Здравствуйте, у меня есть пара вопросов о PHP exec () и passthru ().

1)
Я никогда не использовал exec () в PHP, но я видел, что иногда он используется с imagemagick. Мне теперь любопытно, каковы другие распространенные случаи использования exec в веб-приложении?

2)
Около 6 лет назад, когда я впервые начал играть с PHP, я ничего не знал, просто очень простые вещи, и у меня был сайт, который был взломан, и кто-то установил собственный PHP-файл, который использовал функцию passthru (), чтобы передать кучу трафика через мой сайт, чтобы загрузить бесплатную музыку или видео, и я получил плату в размере 4000 $ за пропускную способность от моего хоста! Спустя 6 лет я знаю гораздо больше о том, как использовать PHP, но я до сих пор не знаю, как это происходило со мной раньше. Как кто-то может добавить файл на мой сервер через неверный код?

Ответы [ 3 ]

4 голосов
/ 09 января 2010

1] Exec () действительно полезна, когда вы:

A) Хотите запустить программу / утилиту на сервере, для которого php не имеет эквивалента команды. Например, ffmpeg - это обычная утилита, запускаемая через вызов exec (для всех видов конвертации медиа).

B) Запуск другого процесса - который вы можете заблокировать или НЕ блокировать - очень мощный. Иногда вы указываете pcnt_fork или что-то подобное, вместе с правильными аргументами CL для неблокирования.

C) Другой пример - когда мне нужно обработать XSLT 2.0 - мне нужно выполнить exec () небольшую Java-службу, которую я использую для обработки преобразований. Очень кстати. PHP не поддерживает преобразования XSLT 2.0.

2] Черт, это позор. Ну, много способов. Существует семейство уязвимостей, называемое «удаленные файлы включают в себя vulns», которые в основном позволяют злоумышленнику включать произвольный источник и, таким образом, запускать его на вашем сервере. Взгляните на: http://lwn.net/Articles/203904/

Также, как упоминалось выше, говорите, что вы делаете что-то вроде (намного упрощенно):

exec("someUnixUtility -f $_GET['arg1']"); 

Хорошо, представьте, что злоумышленник делает, url.come? Arg1 = "blah; rm -rf /", ваш код в основном сводится к:

exec("someUnixUtility -f blah; rm -rf /");

Который в unix, вы разделяете команды w / the; Так что да - это может быть большой ущерб.

То же самое с загрузкой файла, представьте, что вы удалили последние четыре символа (.ext), чтобы найти расширение. Что ж, что-то вроде этого "exploit.php.gif", тогда вы удаляете расширение, поэтому у вас есть файл exploit.php и вы перемещаете его в папку / users / imgs /. Что ж, теперь злоумышленнику нужно только перейти к файлу users / imgs / exploit.php, и он может запустить любой код, какой захочет. Вы были владельцем в этот момент.

1 голос
/ 09 января 2010
  1. Используйте exec или когда вы хотите запустить другую программу.

  2. Документация для passthru гласит:

Внимание

При разрешении передачи пользовательских данных для этой функции используйте escapeshellarg() или escapeshellcmd(), чтобы гарантировать, что пользователи не смогут обмануть систему в выполнении произвольных команд.

Возможно, кто-то обнаружил дыру в безопасности в вашем скрипте, которая позволяла ему запускать произвольные команды. Используйте данные функции для очистки ваших входов в следующий раз. Помните, ничто, отправленное с клиента, не может когда-либо быть доверенным.

0 голосов
/ 09 января 2010

exec() позволяет использовать скомпилированный код на вашем сервере, который будет работать быстрее, чем интерпретируемый php.

Так что, если у вас есть большой объем обработки, который нужно сделать быстро, exec() может быть полезным.

...