Я пытаюсь составить список функций, которые могут быть использованы для выполнения произвольного кода. Цель не в том, чтобы перечислить функции, которые должны быть занесены в черный список или иным образом запрещены. Скорее, я хотел бы иметь список ключевых слов, по которым можно определить специализированные функции для идентификации back-doors на взломанном сервере. Идея заключается в том, что если вы хотите создать многоцелевой вредоносный PHP-скрипт - например, скрипт «веб-оболочки» типа c99 или r57 - вам придется использовать одну или несколько из относительно небольшого набора функций где-то в файле, чтобы позволить пользователю выполнить произвольный код. Поиск этих функций поможет вам быстрее найти решение из десятков тысяч PHP-файлов до относительно небольшого набора скриптов, требующих более тщательного изучения. Очевидно, что, например, любой из следующих сценариев будет считаться вредоносным (или сложным кодированием):
<
<
<? preg_replace('/.*/e',$_POST['code']); ?>
и так далее.
Просматривая на днях взломанный сайт, я не заметил ни одного вредоносного кода, потому что не знал, что preg_replace можно сделать опасным с помощью флага «/e». Есть ли другие, которые я пропустил? Вот мой список на данный момент:
hell Execute
system
exec
popen
backtick operator
pcntl_exec
PHP Execute
eval
preg_replace (с /e флагом)
create_function
include[_once] / require[_once]
Также может быть полезно иметь список функций, способных модифицировать файлы, но я полагаю, что в 99% случаев код эксплойта будет содержать хотя бы одну из вышеперечисленных функций. Но если у вас есть список всех функций, способных редактировать или выводить файлы, опубликуйте его.
Ответ 1
Для составления этого списка я использовал 2 источника: A Study In Scarlet и RATS. Я также добавил несколько своих собственных. После публикации этого списка я связался с основателем RIPS, и на данный момент этот инструмент ищет в коде PHP использование каждой функции из этого списка. Большинство вызовов этих функций классифицируются как уязвимые. Когда испорченная переменная (например, $_REQUEST) передается в функцию из этого списка, то у вас есть уязвимость. Такие программы, как RATS и RIPS, используют функцию grep для выявления всех уязвимостей в приложении. Это означает, что программисты должны быть особенно осторожны при использовании этих функций, но если бы все они были запрещены, то вы не смогли бы многого добиться.
Функции PHP для выполнения произвольного кода
Помимо eval существуют и другие способы выполнения PHP-кода: include/require могут быть использованы для удаленного выполнения кода в виде уязвимостей Local File Include и Remote File Include.
eval()
assert() - идентичен eval()
preg_replace('/.*/e',...) - /e выполняет eval() для совпадения
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());
Список функций, принимающих обратные вызовы
Эти функции принимают строковый параметр, который может быть использован для вызова функции по выбору злоумышленника. В зависимости от функции у злоумышленника может быть или не быть возможности передать параметр. В этом случае можно использовать функцию раскрытия информации, например phpinfo().
Функция => Положение аргументов обратного вызова
'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 - открывает back-door для атак register_globals.
parse_str - работает как extract, если указан только один аргумент.
putenv
ini_set
mail - имеет инъекцию CRLF в третьем параметре, открывает back-door для спама.
header - на старых системах инъекция CRLF могла быть использована для xss или других целей, сейчас это все еще проблема, если используется header("location: ..."); Скрипт продолжает выполняться после вызова header(), и будет продолжать нормально печатать вывод. Это неприятно, если вы пытаетесь защитить административную часть сервера.
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, любой из этих функций файловой системы может быть использован для перенаправления атаки на другой хост через ваш сервер.
// обработчик открытых файлов
fopen
tmpfile
bzopen
gzopen
SplFileObject->__construct
// запись в файловую систему (частично в сочетании с чтением)
chgrp
chmod
chown
copy
file_put_contents
lchgrp
lchown
link
mkdir
move_uploaded_file
rename
rmdir
symlink
tempnam
touch
unlink
imagepng - 2-й параметр - путь.
imagewbmp - 2-й параметр - путь.
image2wbmp - 2-й параметр - путь.
imagejpeg - 2-й параметр - путь.
imagexbm - 2-й параметр - путь.
imagegif - 2-й параметр - путь.
imagegd - 2-й параметр - путь.
imagegd2 - 2-й параметр - путь.
iptcembed
ftp_get
ftp_nb_get
// чтение из файловой системы
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
Функции выполнения произвольных команд
exec - Возвращает последнюю строку вывода команд
passthru - Передает вывод команд непосредственно в браузер
system - Передает вывод команд непосредственно в браузер и возвращает последнюю строку.
shell_exec - Возвращает вывод команд
` (backticks) - То же, что и shell_exec()
popen - Открывает канал чтения или записи к процессу команды
proc_open - Аналогично popen(), но с большей степенью контроля
pcntl_exec - Выполняет программу
Ответ 2
Я бы особенно хотел добавить в этот список unserialize(). Она имеет долгую историю различных уязвимостей, включая выполнение произвольного кода, отказ в обслуживании и утечку информации из памяти. Ее никогда не следует вызывать для данных, предоставленных пользователем. Многие из этих уязвимостей были исправлены в релизах за последние несколько лет. Для получения другой информации о сомнительных функциях/использовании php обратитесь к проекту Hardened PHP Project и его рекомендациям. Также обратите внимание, что по замыслу, отсериализация объекта приведет к выполнению функций конструктора и деструктора; еще одна причина не вызывать ее для данных, предоставленных пользователем.
Ответ 3
Мой 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, которые могут быть использованы для простой деактивации веб-сайта. Возможно, вы захотите создать сценарий bash, который будет искать в файле массив функций, сгруппированных по степени опасности (функции, которые плохи, функции, которые еще хуже, функции, которые никогда не следует использовать), а затем вычислять относительную степень опасности, которую налагает файл, в процентах. Затем выводит это в дерево каталога с процентами, отмеченными рядом с каждым файлом, если опасность превышает порог, например, на 30%.
Ответ 4
Вполне возможно внедрить PHP-код в любой тип файла. Изображения могут быть особенно уязвимы с текстовыми комментариями. Проблема становится особенно серьезной, если код принимает расширение, найденное в данных $_FILES, как есть.
Например, пользователь может загрузить правильный PNG-файл, с внедренным PHP-кодом под именем "foo.php". Если скрипт особенно плох, он может фактически скопировать файл как "/uploads/foo.php". Если сервер настроен на разрешение выполнения скриптов в пользовательских каталогах загрузки (что часто случается, и это опасное упущение), то вы мгновенно можете запустить любой произвольный PHP-код. (Даже если изображение сохранено как .png, можно заставить код выполняться через другие недостатки безопасности).
(Неполный) список того, что нужно проверять при загрузке:
Обязательно проанализируйте содержимое, чтобы убедиться, что загруженный файл соответствует заявленному типу.
Сохраняйте файл с известным, безопасным расширением, которое никогда не будет выполнено.
Убедитесь, что PHP (и любое другое выполнение кода) отключено в пользовательских каталогах загрузки.
Web