Как насчет опасных синтаксических элементов?
Функция "переменная переменная" ($$var
) найдет переменную в текущей области видимости по имени $var. При неправильном использовании удаленный пользователь может изменить или прочитать любую переменную в текущей области видимости. По сути, это более слабый eval
.
Например: вы пишете код $$uservar = 1;
, затем удаленный пользователь устанавливает $uservar
в "admin", в результате чего $admin
устанавливается в 1
в текущей области видимости.
Мой VPS настроен на отключение следующих функций:
root@vps [~]# grep disable_functions /usr/local/lib/php.ini
disable_functions = dl, exec, shell_exec, system, passthru, popen, pclose, proc_open, proc_nice, proc_terminate, proc_get_status, proc_close, pfsockopen, leak, apache_child_terminate, posix_kill, posix_mkfifo, posix_setpgid, posix_setsid, posix_setuid
PHP имеет достаточно потенциально разрушаемых функций, чтобы ваш список мог быть слишком большим для поиска. Например, в PHP есть chmod и chown, которые могут быть использованы для простой деактивации веб-сайта.
EDIT: Возможно, вы захотите создать сценарий bash, который ищет в файле массив функций, сгруппированных по степени опасности (функции, которые плохи, функции, которые еще хуже, функции, которые никогда не следует использовать), а затем вычисляет относительную степень опасности, которую представляет файл, в процентах. Затем выведите это в дерево каталога с процентными метками рядом с каждым файлом, если он превышает порог, скажем, 30% опасности.
Plattform-specific, но также теоретические exec векторы:
И еще много маскирующих методов:
Вам придется сканировать на наличие include ($ tmp) и require (HTTP_REFERER), а также * _once. Если сценарий эксплойта может записывать во временный файл, он может просто включить его позже. В основном двухэтапный eval.
И даже можно скрыть удаленный код с помощью обходных приемов, например:
include("data:text/plain;base64,$_GET[code]");
Кроме того, если ваш веб-сервер уже был скомпрометирован, вы не всегда увидите незакодированное зло. Часто оболочка эксплойта кодируется с помощью gzip. Подумайте о include ("zlib: script2.png.gz");
Никакого eval здесь, все тот же эффект.
Я бы особенно хотел добавить в этот список unserialize(). Она имеет долгую историю различных уязвимостей, включая выполнение произвольного кода, отказ в обслуживании и утечку информации из памяти. Ее никогда не следует вызывать на данных, предоставленных пользователем. Многие из этих уязвимостей были исправлены в релизах за последние несколько лет, но на момент написания статьи в нем все еще сохраняется пара неприятных уязвимостей.
Для получения другой информации о сомнительных функциях/использовании php обратитесь к Hardened PHP Project и его рекомендациям. Также недавние проекты Month of PHP Security и Month of PHP Bugs 2007 года
Также обратите внимание, что, по замыслу, отсериализация объекта приведет к выполнению функций конструктора и деструктора; еще одна причина не вызывать ее на данных, предоставленных пользователем.
Оператор обратного апострофа Обратный апостроф на php manual
Также имейте в виду класс «уязвимостей прерывания», которые позволяют читать и записывать произвольные области памяти!
Они влияют на такие функции, как trim (), rtrim (), ltrim (), explode (), strchr (), strstr (), substr (), chunk_split (), strtok (), addcslashes (), str_repeat ( ) и больше.Это в значительной степени, но не исключительно, связано с функцией передачи по ссылке во время вызова языка, которая устарела в течение 10 лет, но не отключена.
Для получения дополнительной информации см. Доклад Стефана Эссера об уязвимостях прерывания и других низкоуровневых проблемах PHP на BlackHat USA 2009 Слайды Документ
В этом документе / презентации также показано, как dl () может использоваться для выполнить произвольный системный код.