Intereting Posts
Передача данных на страницу «спасибо», когда действие формы переходит на сторонний сайт Зачем считать (false) return 1? Не нужно пропускать страницу вперед или назад Selenium / PHPUnit: завершение сеанса при повторном использовании сеансов браузера? как ограничить доступ к каталогу, чтобы я мог запускать php-скрипты из браузера Удалить неанглийские символы PHP Форум Open Source с API Передать javascript переменную в php с помощью ajax, и результат ничего не показывает SMTP перестала отправлять письма Создать поле ввода массива с построителем форм symfony2 Какова рекомендуемая практика для API-интерфейса PayPal NVP с остановкой и возвратом подписки? Реализация протокола RTSP & mms в PHP Перемещение нескольких объектов по ссылкам без повторения nodejs не может найти модуль «зомби» с PHP норкой Интеграция facebook php sdk в Facebook Canvas App, дающая пустую страницу или ошибку oauthData

Функциональные функции PHP

Я пытаюсь создать список функций, которые можно использовать для произвольного выполнения кода. Цель состоит не в том, чтобы перечислять функции, которые должны быть внесены в черный список или иным образом запрещены. Скорее, я бы хотел иметь grep -able список ключевых слов с красным флагом, который можно было бы использовать при поиске скомпрометированного сервера для задних дверей.

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

Очевидно, что, например, любое из следующего будет считаться злонамеренным (или ужасным кодированием):

 <? eval($_GET['cmd']); ?> <? system($_GET['cmd']); ?> <? preg_replace('/.*/e',$_POST['code']); ?> 

и так далее.

Поиск через скомпрометированный веб-сайт на днях я не заметил фрагмента вредоносного кода, потому что я не понимал, что preg_replace может стать опасным благодаря использованию флага /e ( что серьезно? Почему это даже там ?) , Есть ли другие, которых я пропустил?

Вот мой список:

Shell Execute

  • system
  • exec
  • popen
  • backtick operator
  • pcntl_exec

Выполнить PHP

  • eval
  • preg_replace (с модификатором /e )
  • create_function
  • include [ _once ] / require [ _once ] ( см. ответ Марио для подробностей использования)

Также может быть полезно иметь список функций, способных модифицировать файлы, но я полагаю, что 99% кода эксплойта времени будут содержать хотя бы одну из вышеперечисленных функций. Но если у вас есть список всех функций, способных редактировать или выводить файлы, отправьте его, и я включу его здесь. (И я не mysql_execute , поскольку это часть другого класса эксплойтов.)

Чтобы создать этот список, я использовал 2 источника. Исследование в Алого ордена и RATS . Я также добавил некоторые из моих собственных в микс, и люди в этой теме помогли.

Изменить: после публикации этого списка я связался с основателем RIPS, и теперь эти инструменты просматривают PHP-код для использования каждой функции в этом списке.

Большинство этих вызовов функций классифицируются как Sinks. Когда зараженная переменная (например, $ _REQUEST) передается в функцию приемника, у вас есть уязвимость. Такие программы, как RATS и RIPS, используют функции grep, чтобы идентифицировать все приемники в приложении. Это означает, что программисты должны проявлять особую осторожность при использовании этих функций, но если они будут запрещены, то вы не сможете многое сделать.

« С великой силой приходит большая ответственность ».

–Стан Ли

Выполнение команды

 exec - Returns last line of commands output passthru - Passes commands output directly to the browser system - Passes commands output directly to the browser and returns last line shell_exec - Returns commands output `` (backticks) - Same as shell_exec() popen - Opens read or write pipe to process of a command proc_open - Similar to popen() but greater degree of control pcntl_exec - Executes a program 

Выполнение кода PHP

Помимо eval существуют и другие способы выполнения PHP-кода: include / require можно использовать для удаленного выполнения кода в виде локальных файлов и удаленных файлов .

 eval() assert() - identical to eval() preg_replace('/.*/e',...) - /e does an eval() on the match create_function() include() include_once() require() require_once() $_GET['func_name']($_GET['argument']); $func = new ReflectionFunction($_GET['func_name']); $func->invoke(); or $func->invokeArgs(array()); 

Список функций, которые принимают обратные вызовы

Эти функции принимают строковый параметр, который можно использовать для вызова функции выбора злоумышленника. В зависимости от функции злоумышленник может или не может иметь возможность передать параметр. В этом случае можно использовать функцию Information Disclosure такую ​​как phpinfo() .

 Function => Position of callback arguments 'ob_start' => 0, 'array_diff_uassoc' => -1, 'array_diff_ukey' => -1, 'array_filter' => 1, 'array_intersect_uassoc' => -1, 'array_intersect_ukey' => -1, 'array_map' => 0, 'array_reduce' => 1, 'array_udiff_assoc' => -1, 'array_udiff_uassoc' => array(-1, -2), 'array_udiff' => -1, 'array_uintersect_assoc' => -1, 'array_uintersect_uassoc' => array(-1, -2), 'array_uintersect' => -1, 'array_walk_recursive' => 1, 'array_walk' => 1, 'assert_options' => 1, 'uasort' => 1, 'uksort' => 1, 'usort' => 1, 'preg_replace_callback' => 1, 'spl_autoload_register' => 0, 'iterator_apply' => 1, 'call_user_func' => 0, 'call_user_func_array' => 0, 'register_shutdown_function' => 0, 'register_tick_function' => 0, 'set_error_handler' => 0, 'set_exception_handler' => 0, 'session_set_save_handler' => array(0, 1, 2, 3, 4, 5), 'sqlite_create_aggregate' => array(2, 3), 'sqlite_create_function' => 2, 

Раскрытие информации

Большинство этих вызовов функций не являются поглотителями. Но скорее это может быть уязвимость, если какой-либо из возвращаемых данных можно просмотреть злоумышленнику. Если злоумышленник может видеть phpinfo() это определенно уязвимость.

 phpinfo posix_mkfifo posix_getlogin posix_ttyname getenv get_current_user proc_get_status get_cfg_var disk_free_space disk_total_space diskfreespace getcwd getlastmo getmygid getmyinode getmypid getmyuid 

Другие

 extract - Opens the door for register_globals attacks (see study in scarlet). parse_str - works like extract if only one argument is given. putenv ini_set mail - has CRLF injection in the 3rd parameter, opens the door for spam. header - on old systems CRLF injection could be used for xss or other purposes, now it is still a problem if they do a header("location: ..."); and they do not die();. The script keeps executing after a call to header(), and will still print output normally. This is nasty if you are trying to protect an administrative area. proc_nice proc_terminate proc_close pfsockopen fsockopen apache_child_terminate posix_kill posix_mkfifo posix_setpgid posix_setsid posix_setuid 

Функции файловой системы

Согласно RATS, все функции файловой системы в php являются неприятными. Некоторые из них не очень полезны для злоумышленника. Другие полезнее, чем вы думаете. Например, если allow_url_fopen=On тогда URL-адрес может использоваться как путь к файлу, поэтому вызов для copy($_GET['s'], $_GET['d']); может использоваться для загрузки скрипта PHP в любом месте системы. Также, если сайт уязвим для отправки запроса через GET, каждый из этих функций файловой системы может злоупотреблять каналом и атаковать другого хоста через ваш сервер.

 // open filesystem handler fopen tmpfile bzopen gzopen SplFileObject->__construct // write to filesystem (partially in combination with reading) chgrp chmod chown copy file_put_contents lchgrp lchown link mkdir move_uploaded_file rename rmdir symlink tempnam touch unlink imagepng - 2nd parameter is a path. imagewbmp - 2nd parameter is a path. image2wbmp - 2nd parameter is a path. imagejpeg - 2nd parameter is a path. imagexbm - 2nd parameter is a path. imagegif - 2nd parameter is a path. imagegd - 2nd parameter is a path. imagegd2 - 2nd parameter is a path. iptcembed ftp_get ftp_nb_get // read from filesystem file_exists file_get_contents file fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype glob is_dir is_executable is_file is_link is_readable is_uploaded_file is_writable is_writeable linkinfo lstat parse_ini_file pathinfo readfile readlink realpath stat gzfile readgzfile getimagesize imagecreatefromgif imagecreatefromjpeg imagecreatefrompng imagecreatefromwbmp imagecreatefromxbm imagecreatefromxpm ftp_put ftp_nb_put exif_read_data read_exif_data exif_thumbnail exif_imagetype hash_file hash_hmac_file hash_update_file md5_file sha1_file highlight_file show_source php_strip_whitespace get_meta_tags 

Вам придется сканировать для include ($ tmp) и require (HTTP_REFERER) и * _once. Если сценарий эксплойта может записываться во временный файл, он может просто включить это позже. В основном двухэтапная оценка.

И даже можно скрыть удаленный код с обходными методами, например:

  include("data:text/plain;base64,$_GET[code]"); 

Кроме того, если ваш веб-сервер уже скомпрометирован, вы не всегда увидите незарегистрированное зло. Часто оболочка эксплойта кодируется gzip. Подумайте о include("zlib:script2.png.gz"); Здесь нет никакого значения, все тот же эффект.

Это не ответ как таковой, но вот что-то интересное:

 $y = str_replace('z', 'e', 'zxzc'); $y("malicious code"); 

В том же духе call_user_func_array() может использоваться для выполнения запутанных функций.

Я удивлен, что никто не упомянул echo и print как точки безопасности.

Кросс-сайт Scripting (XSS) – серьезный эксплойт безопасности, поскольку он даже более распространен, чем эксплойты выполнения кода на стороне сервера.

я особенно хотел бы добавить unserialize () в этот список. Он имел долгую историю различных уязвимостей, включая произвольное выполнение кода, отказ в обслуживании и утечку информации о памяти. Его никогда не следует вызывать по предоставленным пользователем данным. Многие из этих vuls были зафиксированы в релизах за последние годы росы, но в настоящее время все еще сохраняется пара неприятных ударов.

Для получения дополнительной информации об уродливых функциях / функциях php смотрите вокруг упрощенного PHP-проекта и его рекомендаций. Также последний Месяц безопасности PHP и 2007 месяц ошибок PHP- проектов

Также обратите внимание, что при проектировании неэтериализируя объект вызовет выполнение функций конструктора и деструктора; еще одна причина не называть его предоставленными пользователем данными.

Мой 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% опасности.

Также имейте в виду класс «уязвимостей прерывания», которые позволяют читать и записывать произвольные ячейки памяти!

Они влияют на такие функции, как trim (), rtrim (), ltrim (), explode (), strchr (), strstr (), substr (), chunk_split (), strtok (), addcslashes (), str_repeat () и другие , Это в значительной степени, но не исключительно, из-за функции переадресации вызова по времени на языке, который устарел на 10 лет, но не отключен.

Fore больше информации, см. Рассказ Стефана Эссера об уязвимостях прерывания и других проблемах с низким уровнем PHP в BlackHat USA 2009 Slides Paper

В этой статье / презентации также показано, как dl () может использоваться для выполнения произвольного системного кода.

Специфичные по Plattform, но и теоретические векторы exec:

  • dotnet_load ()
  • новый COM («WScript.Shell»)
  • новая Java ("java.lang.Runtime")
  • event_new () – в конечном итоге

И есть еще много методов маскировки:

  • proc_open – псевдоним для popen
  • call_user_func_array ("exE" .chr (99), array ("/ usr / bin / damage", "–all"));
  • file_put_contents ("/ cgi-bin / nextinvocation.cgi") && chmod (…)
  • PharData :: setDefaultStub – еще одна работа по проверке кода в файлах .phar
  • runkit_function_rename ("exec", "innocent_name") или APD rename_function

Помимо конструкции eval language существует еще одна функция, которая позволяет выполнять произвольный код: assert

 assert('ex' . 'ec("kill --bill")'); 

Один источник интересных подвигов не упоминался. PHP позволяет содержать строки в 0x00 байт. Базовые (libc) функции рассматривают это как конец строки.

Это позволяет ситуации, когда (плохо реализовано) проверка работоспособности в PHP может быть обманута, например, в ситуации, например:

 /// note: proof of principle code, don't use $include = $_GET['file']; if ( preg_match("/\\.php$/",$include) ) include($include); 

Это может включать в себя любой файл, а не только те, которые заканчиваются на .php , вызывая script.php?file=somefile%00.php

Таким образом, любая функция, которая не подчиняется строковой длине PHP, может привести к некоторой уязвимости.

Как насчет опасных синтаксических элементов?

« Переменная переменная » ( $$var ) найдет переменную в текущей области с именем $ var. При неправильном использовании удаленный пользователь может изменить или прочитать любую переменную в текущей области. В основном более слабая eval .

Пример: вы пишете код $$uservar = 1; , то удаленный пользователь устанавливает $uservar в «admin», в результате чего $admin будет установлен в 1 в текущей области.

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

  • также, если есть действительно отличные списки, приведенные здесь, вы можете пропустить функцию, которая может быть использована

  • там все еще может быть «скрытый» злой код, подобный этому

$ myEvilRegex = base64_decode ('Ly4qL2U =');

preg_replace ($ myEvilRegex, $ _POST ['code']);

  • теперь вы можете сказать, я просто расширь свой сценарий, чтобы он соответствовал этому

  • но тогда у вас будет этот майнский «возможно, злой код», который, кроме того, выходит из контекста

  • чтобы быть (псевдо) безопасным, вы действительно должны писать хороший код и сами читать весь существующий код

Backtick Operator Backtick на php manual

Я знаю, что move_uploaded_file упоминается, но загрузка файлов в целом очень опасна. Просто наличие $_FILES должно вызвать некоторую озабоченность.

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

Например, пользователь может загрузить действительный файл PNG со встроенным PHP-кодом как «foo.php». Если сценарий особенно наивен, он может фактически скопировать файл как «/uploads/foo.php». Если сервер настроен так, чтобы разрешить выполнение сценария в каталогах загрузки пользователей (часто это случается и ужасный недосмотр), вы сразу можете запускать любой произвольный PHP-код. (Даже если изображение сохранено как .png, возможно, будет возможно выполнить код с помощью других недостатков безопасности.)

A (неисчерпывающий) список вещей, которые нужно проверить при загрузке:

  • Обязательно проанализируйте содержимое, чтобы убедиться, что загрузка является типом, который, по его утверждению, является
  • Сохраните файл с известным безопасным расширением файла, который никогда не будет выполнен
  • Убедитесь, что PHP (и любое другое исполнение кода) отключено в каталогах загрузки пользователей

Давайте добавим pcntl_signal и pcntl_alarm в список.

С помощью этих функций вы можете обойти любое ограничение set_time_limit, созданное в php.ini или в скрипте.

Например, этот скрипт будет работать в течение 10 секунд, несмотря на set_time_limit(1);

(Кредит идет на чириканье и сущность Себастьяна Бергманна:

 <?php declare(ticks = 1); set_time_limit(1); function foo() { for (;;) {} } class Invoker_TimeoutException extends RuntimeException {} class Invoker { public function invoke($callable, $timeout) { pcntl_signal(SIGALRM, function() { throw new Invoker_TimeoutException; }, TRUE); pcntl_alarm($timeout); call_user_func($callable); } } try { $invoker = new Invoker; $invoker->invoke('foo', 1); } catch (Exception $e) { sleep(10); echo "Still running despite of the timelimit"; } 

Существует множество эксплойтов PHP, которые можно отключить с помощью настроек в файле PHP.ini. Очевидным примером является register_globals, но в зависимости от настроек также возможно включать или открывать файлы с удаленных компьютеров через HTTP, которые могут быть использованы, если программа использует имена файлов переменных для любой из функций include () или обработки файлов.

PHP также допускает вызов функции функции путем добавления () в конец имени переменной – например $myvariable(); будет вызывать имя функции, указанное переменной. Это можно использовать; например, если злоумышленник может заставить переменную содержать слово «eval» и может управлять параметром, тогда он может делать все, что захочет, хотя программа фактически не содержит функцию eval ().

Эти функции также могут иметь некоторые неприятные эффекты.

  • str_repeat()
  • unserialize()
  • register_tick_function()
  • register_shutdown_function()

Первые два могут исчерпать всю доступную память, а последние сохраняют истощение …

Недавно было обсуждено это на security.stackexchange.com

функции, которые могут использоваться для выполнения произвольного кода

Хорошо, что немного уменьшает область действия, но поскольку «печать» может использоваться для ввода javascript (и, следовательно, воровских сессий и т. Д.), Это все еще несколько произвольно.

не перечислять функции, которые должны быть занесены в черный список или иным образом запрещены. Скорее, я хотел бы иметь список grep-able

Это разумный подход.

Подумайте о том, чтобы написать собственный синтаксический анализатор, хотя очень скоро вы поймете, что подход на основе grep выходит из-под контроля (awk будет немного лучше). Довольно скоро вы тоже начнете желать, чтобы вы реализовали белый список!

В дополнение к очевидным, я рекомендую отмечать все, что включает include, с аргументом чего-либо, кроме строкового литерала. Следите за __autoload () тоже.

Я боюсь, что мой ответ может быть слишком негативным, но …

ИМХО, каждая отдельная функция и метод там могут использоваться в гнусных целях. Подумайте об этом как о влиянии нецензурности: переменная присваивается пользователю или удаленному вводу, переменная используется в функции, возвращаемое значение функции, используемое в свойстве класса, свойство класса, используемое в файловой функции, и так далее. Помните: поддельный IP-адрес или атака «человек-в-середине» могут использовать весь ваш сайт.

Лучше всего отслеживать от начала до конца любой возможный пользовательский или удаленный ввод, начиная с $_SERVER , $_GET , $_POST , $_FILE , $_COOKIE , include(some remote file) ( если allow_url_fopen ), все остальные функции / классы, связанные с удаленными файлами и т. д. Вы программно создаете профиль трассировки стека каждого значения, заданного пользователем или дистанционным. Это можно сделать программно, получив все повторяющиеся экземпляры назначенной переменной и функции или методы, в которых она используется, а затем рекурсивно компилирует список всех вхождений этих функций / методов и т. Д. Изучите его, чтобы убедиться, что он сначала проходит надлежащую фильтрацию и проверку функций по отношению ко всем другим функциям, которые он затрагивает. Это, конечно же, ручное исследование, иначе у вас будет общее количество переключателей case равное количеству функций и методов в PHP (включая определенные пользователем).

В качестве альтернативы для обработки только ввода пользователя, статический класс контроллера инициализируется в начале всех сценариев, которые 1) проверяют и сохраняют все введенные пользователем входные значения в виде белого списка разрешенных целей; 2) стирает этот входной источник (т.е. $_SERVER = null ). Вы можете видеть, где это получается немного Назиске.

Вот список функций, которые мой провайдер отключает для целей безопасности:

  • Exec
  • дл
  • show_source
  • apache_note
  • apache_setenv
  • closelog
  • debugger_off
  • debugger_on
  • define_syslog_variables
  • escapeshellarg
  • EscapeShellCmd
  • ini_restore
  • openlog
  • пройти
  • pclose
  • pcntl_exec
  • POPEN
  • proc_close
  • proc_get_status
  • proc_nice
  • proc_open
  • proc_terminate
  • shell_exec
  • системный журнал
  • система
  • url_exec

Большинство атак в коде используют несколько источников доступа или несколько шагов для выполнения. Я бы искал не только код, либо метод с вредоносным кодом, но и все методы, выполнение функции или ее вызов. Наилучшая безопасность также будет включать кодирование и проверку данных формы, когда она приходит и выходит.

Следите также за тем, чтобы определить системные переменные, после чего они могут быть вызваны из любой функции или метода в коде.

Несколько переполнений буфера были обнаружены с использованием 4-битных символов, которые интерпретируют текст. htmlentities () htmlspecialchars ()

были наверху, хорошая защита – использовать mb_convert_encoding () для преобразования в единую кодировку до интерпретации.

Вы можете найти постоянно обновляемый список чувствительных приемников (эксплуатационные функции php) и их параметры в RIPS /config/sinks.php, статическом анализаторе исходного кода для уязвимостей в PHP-приложениях, который также обнаруживает PHP backdoor.