Web

Функции PHP для идентификации вредоносного кода

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

<? eval($_GET['cmd']); ?>

<? system($_GET['cmd']); ?>

<? 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, можно заставить код выполняться через другие недостатки безопасности).

(Неполный) список того, что нужно проверять при загрузке:

  1. Обязательно проанализируйте содержимое, чтобы убедиться, что загруженный файл соответствует заявленному типу.

  2. Сохраняйте файл с известным, безопасным расширением, которое никогда не будет выполнено.

  3. Убедитесь, что PHP (и любое другое выполнение кода) отключено в пользовательских каталогах загрузки.

 

 

 

Схожие статьи

Web

Как распарсить и обработать HTML/XML в PHP?

Web

Получение атрибута href элемента A

Web

Передача переменных JavaScript в PHP?

Web

Отладка проблем с функцией exec