Я пытаюсь создать список функций, которые можно использовать для выполнения произвольного кода. Цель не состоит в том, чтобы перечислить функции, которые должны быть помещены в черный список или иначе запрещены. Скорее, я хотел бы иметь возможность grep
использовать список ключевых слов, помеченных красным флагом, который удобен при поиске взломанных серверов на скомпрометированном сервере.
Идея состоит в том, что если вы хотите создать многоцелевой вредоносный 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
, так как это часть другого класса эксплойтов.)
/e
модификатор?e
модификатор выполняет замену строки как код PHP.Ответы:
Для построения этого списка я использовал 2 источника. Этюд в Скарлет и РАТС . Я также добавил некоторые свои собственные в микс, и люди в этой теме помогли.
Изменить: После публикации этого списка я связался с основателем RIPS, и на данный момент этот инструмент ищет PHP-код для использования каждой функции в этом списке.
Большинство из этих вызовов функций классифицируются как Sinks. Когда испорченная переменная (например, $ _REQUEST) передается в функцию приемника, вы получаете уязвимость. Такие программы , как РАТС и рипы использовать Grep как функциональность , чтобы определить , все тонет в приложении. Это означает, что программисты должны проявлять особую осторожность при использовании этих функций, но если они будут заблокированы, вы не сможете сделать многое.
« С большой силой приходит большая ответственность ».
- Стэн Ли
Выполнение команды
Выполнение кода PHP
Помимо
eval
есть и другие способы для выполнения PHP кода:include
/require
может быть использован для удаленного выполнения кода в виде Local File Include и Remote File Include уязвимости.Список функций, которые принимают обратные вызовы
Эти функции принимают строковый параметр, который можно использовать для вызова функции по выбору злоумышленника. В зависимости от функции атакующий может иметь или не иметь возможность передавать параметр. В этом случае можно использовать
Information Disclosure
функцию вродеphpinfo()
.Раскрытие информации
Большинство из этих вызовов функций не являются приемниками. Но скорее это может быть уязвимость, если какие-либо из возвращенных данных будут доступны для просмотра злоумышленнику. Если злоумышленник может видеть,
phpinfo()
это определенно уязвимость.Другой
Функции файловой системы
Согласно RATS все функции файловой системы в php противны. Некоторые из них кажутся злоумышленнику не очень полезными. Другие полезнее, чем вы думаете. Например, если
allow_url_fopen=On
в качестве пути к файлу можно использовать URL, то можно использовать вызовcopy($_GET['s'], $_GET['d']);
для загрузки сценария PHP в любую точку системы. Также, если сайт уязвим для запроса, отправляемого через GET, каждая из этих функций файловой системы может быть использована для направления и атаки на другой хост через ваш сервер.источник
eval()
кодировать, выполнять системные команды, получать доступ к базе данных и читать / записывать в файлы. На этот код может повлиять злоумышленник, и это уязвимость.preg_match
с этимe
не повредит. Руководство говорит: «Только preg_replace () использует этот модификатор; он игнорируется другими функциями PCRE».Вам нужно будет отсканировать include ($ tmp), а также require (HTTP_REFERER) и * _once. Если скрипт эксплойта может записать во временный файл, он может просто включить это позже. В основном двухступенчатый eval.
И даже можно скрыть удаленный код с помощью обходных путей, таких как:
Кроме того, если ваш веб-сервер уже был взломан, вы не всегда увидите незакодированное зло. Часто оболочка эксплойта кодируется в gzip. Подумайте не о
include("zlib:script2.png.gz");
Eval здесь, все тот же эффект.источник
$_GET[xyz]
как использовать, а не как$xyz
? Или там было что-то более глубокое?grep
. PHP - какая катастрофа.include
не требует скобок;include "…"
достаточно.Это не ответ сам по себе, но вот кое-что интересное:
В том же духе
call_user_func_array()
может использоваться для выполнения запутанных функций.источник
Я удивлен, что никто не упомянул
echo
иprint
как точки безопасности эксплуатации.Межсайтовый скриптинг (XSS) - это серьезный эксплойт безопасности, потому что он даже более распространен, чем эксплойты на стороне сервера.
источник
я бы особенно хотел добавить unserialize () в этот список. У него долгая история различных уязвимостей, включая выполнение произвольного кода, отказ в обслуживании и утечка информации в памяти. Он никогда не должен вызываться на предоставленных пользователем данных. Многие из этих выпусков были исправлены в выпусках за последние годы росы, но в настоящее время в них сохраняется пара неприятных выпусков.
Для получения дополнительной информации о хитрых функциях / использовании php посмотрите проект Hardened PHP Project и его рекомендации. Кроме того, в последнее время Месяц PHP Security и 2007 в Месяц PHP Bugs проектов
Также обратите внимание, что при проектировании несериализация объекта вызовет выполнение функций конструктора и деструктора; Еще одна причина, чтобы не вызывать его на предоставленных пользователем данных.
источник
Мой VPS настроен на отключение следующих функций:
В PHP достаточно потенциально разрушаемых функций, поэтому ваш список может быть слишком большим для grep. Например, в PHP есть chmod и chown, которые можно использовать для простой деактивации сайта.
РЕДАКТИРОВАТЬ: Возможно, вы захотите создать сценарий bash, который ищет файл для массива функций, сгруппированных по опасности (плохие функции, худшие функции, функции, которые никогда не должны использоваться), а затем рассчитывает относительную опасность что файл накладывается в процентах. Затем выведите это в дерево каталога с процентами, помеченными рядом с каждым файлом, если они превышают порог, скажем, 30% опасности.
источник
Также имейте в виду класс «уязвимостей прерывания», которые позволяют произвольным ячейкам памяти считываться и записываться!
Они влияют на такие функции, как trim (), rtrim (), ltrim (), explode (), strchr (), strstr (), substr (), chunk_split (), strtok (), addcslashes (), str_repeat () и другие. , Это во многом, но не исключительно, из-за функции передачи по ссылке во время разговора языка, который устарел в течение 10 лет, но не отключен.
Для получения дополнительной информации см. Доклад Стефана Эссера об уязвимостях прерывания и других проблемах PHP низкого уровня на BlackHat USA 2009 Slides Paper
Эта статья / презентация также показывает, как dl () может использоваться для выполнения произвольного системного кода.
источник
Специфичные для платформы, но и теоретические векторы выполнения:
И есть еще много способов маскировки:
источник
Помимо
eval
языковой конструкции есть еще одна функция, которая позволяет выполнять произвольный код:assert
источник
Один источник интересных подвигов не был упомянут. PHP позволяет строкам иметь
0x00
байты в них. Базовые (libc) функции обрабатывают это как конец строки.Это учитывает ситуации, когда (плохо реализованная) проверка работоспособности в PHP может быть одурачена, например, в такой ситуации:
Это может включать любой файл - не только те, которые заканчиваются на
.php
- путем вызоваscript.php?file=somefile%00.php
Поэтому любая функция, которая не подчиняется длине строки PHP, может привести к некоторой уязвимости.
источник
Как насчет опасных синтаксических элементов?
« Переменная переменная » (
$$var
) найдет переменную в текущей области по имени $ var. Если используется неправильно, удаленный пользователь может изменить или прочитать любую переменную в текущей области. В основном слабееeval
.Пример: вы пишете некоторый код
$$uservar = 1;
, затем удаленный пользователь устанавливает$uservar
значение «admin», в результате чего$admin
устанавливается значение1
в текущей области.источник
$innocentFunc = 'exec'; $innocentFunc('activate skynet');
.Я думаю, что вы не сможете действительно найти все возможные эксплойты, анализируя ваши исходные файлы.
также, если здесь есть действительно хорошие списки, вы можете пропустить функцию, которая может быть использована
там еще может быть «скрытый» злой код, как этот
Теперь вы можете сказать, что я просто расширяю свой сценарий, чтобы соответствовать этому
но тогда у вас будет этот «возможно злой код», который, кроме того, находится вне контекста
чтобы быть (псевдо) безопасным, вы должны действительно написать хороший код и прочитать весь существующий код самостоятельно
источник
Backtick Operator Backtick на PHP руководство
источник
Я знаю
move_uploaded_file
, было упомянуто, но загрузка файлов в целом очень опасна. Просто наличие$_FILES
должно вызывать некоторое беспокойство.Вполне возможно встроить код PHP в любой тип файла. Изображения могут быть особенно уязвимы с текстовыми комментариями. Проблема особенно проблематична, если код принимает расширение, найденное в
$_FILES
данных, как есть.Например, пользователь может загрузить действительный файл PNG со встроенным кодом PHP как «foo.php». Если скрипт особенно наивный, он может скопировать файл как «/uploads/foo.php». Если сервер сконфигурирован так, чтобы разрешать выполнение сценариев в пользовательских каталогах загрузки (часто это бывает, и это ужасный недосмотр), тогда вы можете мгновенно запустить любой произвольный код PHP. (Даже если изображение сохранено в формате .png, возможно, можно будет выполнить код с помощью других недостатков безопасности.)
(Неисчерпывающий) список вещей, которые нужно проверить при загрузке:
источник
Добавим
pcntl_signal
иpcntl_alarm
в список.С помощью этих функций вы можете обойти любое ограничение set_time_limit, созданное в php.ini или в скрипте.
Этот скрипт, например, будет работать в течение 10 секунд, несмотря на
set_time_limit(1);
(Благодарность идет Себастьяну Бергманну в твиттере и суть :
источник
Существует множество эксплойтов PHP, которые можно отключить с помощью настроек в файле PHP.ini. Очевидным примером является register_globals, но в зависимости от настроек также может быть возможным включать или открывать файлы с удаленных машин через HTTP, что можно использовать, если программа использует переменные имена файлов для любой из своих функций include () или обработки файлов.
PHP также позволяет вызывать функцию переменной, добавляя () в конец имени переменной - например,
$myvariable();
будет вызывать имя функции, указанное в переменной. Это пригодно для использования; Например, если злоумышленник может заставить переменную содержать слово «eval» и может управлять параметром, он может делать все, что захочет, даже если программа на самом деле не содержит функцию eval ().источник
Эти функции также могут иметь некоторые неприятные последствия.
str_repeat()
unserialize()
register_tick_function()
register_shutdown_function()
Первые два могут исчерпать всю доступную память, а последние поддерживают истощение памяти ...
источник
Об этом недавно говорилось на security.stackexchange.com.
Что ж, это немного уменьшает объем, но поскольку print может использоваться для внедрения javascript (и, следовательно, кражи сессий и т. Д.), Он все еще несколько произвольный.
Это разумный подход.
Однако подумайте над написанием собственного парсера - очень скоро вы обнаружите, что подход на основе grep выходит из-под контроля (awk будет немного лучше). Довольно скоро вы тоже захотите начать реализовывать белый список!
В дополнение к очевидным, я бы рекомендовал помечать все, что включает, аргументом чего-либо, кроме строкового литерала. Также следите за __autoload ().
источник
Боюсь, мой ответ может быть слишком негативным, но ...
ИМХО, каждая функция и метод там могут быть использованы в гнусных целях. Думайте об этом как о эффекте небылицы: переменная присваивается пользователю или удаленному вводу, переменная используется в функции, возвращаемое значение функции используется в свойстве класса, свойство класса используется в файловой функции, и так далее. Помните: поддельный IP-адрес или атака «человек посередине» могут использовать весь ваш сайт.
Лучше всего , чтобы след от начала до конца любого возможного пользователя или удаленного ввода, начиная с
$_SERVER
,$_GET
,$_POST
,$_FILE
,$_COOKIE
,include(some remote file)
( еслиallow_url_fopen
включен), все остальные функции / классы , касающиеся удаленных файлов и т.д. Вы программно создать профиль стека трассировки каждого пользовательского или удаленного значения. Это можно сделать программным путем, получив все повторяющиеся экземпляры назначенной переменной и функций или методов, в которых она используется, затем рекурсивно составив список всех вхождений этих функций / методов и т. Д. Изучите его, чтобы убедиться, что он сначала проходит через соответствующие функции фильтрации и проверки относительно всех других функций, которых он касается. Это, конечно, ручной экзамен, иначе у вас будет общее количествоcase
переключатели, равные количеству функций и методов в PHP (включая определяемые пользователем).В качестве альтернативы для обработки только пользовательского ввода имейте статический класс контроллера, инициализированный в начале всех сценариев, который 1) проверяет и сохраняет все предоставленные пользователем входные значения в соответствии с белым списком разрешенных целей; 2) стирает этот входной источник (т.е.
$_SERVER = null
). Вы можете видеть, где это становится немного нацистским.источник
Вот список функций, которые мой провайдер отключает в целях безопасности:
источник
Большинство атак в коде используют несколько источников доступа или несколько шагов для выполнения самих себя. Я бы искал не только код или метод, имеющий вредоносный код, но и все методы, выполняющие функции или вызывающие его. Наилучшая защита также будет включать в себя кодирование и проверку данных формы по мере их поступления.
Также следите за определением системных переменных, они могут впоследствии вызываться из любой функции или метода в коде.
источник
Было обнаружено несколько переполнений буфера с использованием функций 4-битных символов, которые интерпретируют текст. htmlentities () htmlspecialchars ()
на вершине, хорошая защита - использовать mb_convert_encoding () для преобразования в одну кодировку перед интерпретацией.
источник
Вы можете найти постоянно обновляемый список чувствительных приемников (эксплуатируемых функций php) и их параметров в RIPS /config/sinks.php, статическом анализаторе исходного кода на наличие уязвимостей в приложениях PHP, который также обнаруживает бэкдоры PHP.
источник