Эксплуатируемые функции PHP

277

Я пытаюсь создать список функций, которые можно использовать для выполнения произвольного кода. Цель не состоит в том, чтобы перечислить функции, которые должны быть помещены в черный список или иначе запрещены. Скорее, я хотел бы иметь возможность 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, так как это часть другого класса эксплойтов.)

Тайлер
источник
43
как примечание, я хотел бы, чтобы этот список был опубликован в ближайшем будущем, если это возможно :)
yoda
16
@yoda: где опубликовано? Я буду держать список обновленным здесь, так как SO является источником всех знаний.
Тайлер
3
Что делает /eмодификатор?
Билли ONEAL
6
@Billy: eмодификатор выполняет замену строки как код PHP.
nikc.org
1
Надо сказать: выполнение кода в регулярном выражении - это то, что делает Perl и, возможно, Python, а не что-то эксклюзивное для PHP. Я не знаю деталей, хотя.
Адриано Вароли Пьяцца

Ответы:

205

Для построения этого списка я использовал 2 источника. Этюд в Скарлет и РАТС . Я также добавил некоторые свои собственные в микс, и люди в этой теме помогли.

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

Большинство из этих вызовов функций классифицируются как Sinks. Когда испорченная переменная (например, $ _REQUEST) передается в функцию приемника, вы получаете уязвимость. Такие программы , как РАТС и рипы использовать 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может быть использован для удаленного выполнения кода в виде Local File Include и Remote File Include уязвимости.

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
Ладья
источник
37
@whatnick На самом деле я не вижу заметной разницы между PHP и другими языками веб-приложений. В конце концов, программистам нужна способность eval()кодировать, выполнять системные команды, получать доступ к базе данных и читать / записывать в файлы. На этот код может повлиять злоумышленник, и это уязвимость.
ладья
8
Так много функций запрещено! Вы хозяин моего сайта случайно?
Рэнди Дев
2
@ Эндрю Данн, ха-ха, нет. Если вы запретили все эти функции, тогда не будет работать ни одно приложение PHP. Особенно include (), require () и функции файловой системы.
ладья
2
@Rook: мои мысли точно, но это для потенциальных проблем, а не конкретных. При правильном использовании ни один из них не представляет непосредственной угрозы; но если их можно избежать, они должны быть.
Geekster
3
Имхо preg_matchс этим eне повредит. Руководство говорит: «Только preg_replace () использует этот модификатор; он игнорируется другими функциями PCRE».
NikiC
59

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

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

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

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

марио
источник
1
В зависимости от того, как настроен PHP, include может фактически включать код из произвольных URL-адресов. Что-то вроде include " example.com/code.phps "; Я увидел взломанный веб-сайт, который был взломан с использованием комбинации этой функции и register_globals.
BlackAura
@ BlackAura, как regiser_globals вписался в атаку? Это то, что можно было бы использовать так же легко, $_GET[xyz]как использовать, а не как $xyz? Или там было что-то более глубокое?
Tylerl
Я не совсем уверен, почему это было сделано таким образом, но сайт продолжал делать такие вещи: include ($ prefix. '/Filename.php'); Я думаю, что идея состояла в том, чтобы вы могли переместить основной код за пределы веб-корня, установив переменную $ prefix в файле конфигурации. Если злоумышленник задает для этого значения что-то вроде « example.com/code.phps ?», PHP будет включать этот удаленный файл. Насколько я могу судить, бот действительно смог взломать с помощью универсального эксплойта. По-видимому, многие старые PHP-коды допустили эту ошибку. По сути, НИКОГДА не позволяйте вводить пользовательские значения где-либо рядом с оператором включения.
BlackAura
Я думаю, что вы можете обобщить это, чтобы включить, которые содержат «:» в имени файла ... за исключением того, что имя файла может быть переменной, что затрудняет его grep. PHP - какая катастрофа.
Tylerl
2
includeне требует скобок; include "…"достаточно.
Гамбо
48

Это не ответ сам по себе, но вот кое-что интересное:

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

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

оборота Эйлин
источник
1
И нет способа найти это без выполнения кода :( Статический анализ здесь не поможет.
NikiC
15
@tylerl: ... или любой другой язык?
Доктор Ганнибал Лектер
@dr Ганнибал Лектор: даже скомпилированные языки?
Ponkadoodle
3
@Wallacoloo: Еще проще спрятать бэкдор CGI скомпилированного языка, поскольку в двоичном файле нет простых текстовых строк, которые нужно найти.
Ииридайн
2
Хорошо .. Я пытался с $ f = 'ev'. 'Al'; $ е ($ _ POST [ 'с']); но не сделал работу , так как «Eval» не функция , а специальная конструкция , как включать, эхо и т.д. -> Интересно , что Exec () не так и это будет работать ..
redShadow
20

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

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

Билл Карвин
источник
Это будет вектор, который технически влияет на клиента, а не на сервер.
Дамианб
@damianb: Если сайт использует Ajax, и я могу заставить произвольный javascript быть оцененным во время сеанса любого пользователя, я могу причинить много вреда на сервере.
Билл Карвин
"на сервере" .... к клиентам подключенным; это не влияет на серверную часть. Это относится к эксплойтам на стороне клиента, таким как перехват курсора, CSRF, внедрение заголовка и так далее. Да, это опасно, но полностью подпадает под другую классификацию.
Дамианб
19

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

Для получения дополнительной информации о хитрых функциях / использовании php посмотрите проект Hardened PHP Project и его рекомендации. Кроме того, в последнее время Месяц PHP Security и 2007 в Месяц PHP Bugs проектов

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

Cheekysoft
источник
Мне интересно узнать больше о проблеме несериализации. Это просто ошибка в реализации, или это недостаток в дизайне (то есть не может быть исправлено)? Можете ли вы указать мне больше информации по этой проблеме в частности?
Tylerl
О выполнении произвольного кода и утечке информации в памяти см. Рекомендации
Cheekysoft,
В последнем выпуске 5.2.14 исправлена ​​еще одна уязвимость, связанная с выполнением произвольного кода, в unserialize () cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2010-2225 php.net/ChangeLog-5.php#5.2. 14
Cheekysoft
17

Мой 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 достаточно потенциально разрушаемых функций, поэтому ваш список может быть слишком большим для grep. Например, в PHP есть chmod и chown, которые можно использовать для простой деактивации сайта.

РЕДАКТИРОВАТЬ: Возможно, вы захотите создать сценарий bash, который ищет файл для массива функций, сгруппированных по опасности (плохие функции, худшие функции, функции, которые никогда не должны использоваться), а затем рассчитывает относительную опасность что файл накладывается в процентах. Затем выведите это в дерево каталога с процентами, помеченными рядом с каждым файлом, если они превышают порог, скажем, 30% опасности.

Джош
источник
Вы можете установить флаг "--disable-posix" во время компиляции и удалить все эти функции posix из disable_functions.
Pixel Developer
15

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

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

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

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

оборота Cheekysoft
источник
1
Уч. Ну, я действительно думал, что PHP был в некоторой степени безопасным, прежде чем я посмотрел на эти слайды ...
NikiC 31.10.10
14

Специфичные для платформы, но и теоретические векторы выполнения:

  • dotnet_load ()
  • новый COM ("WScript.Shell")
  • новая Java ("java.lang.Runtime")
  • event_new () - очень рано

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

  • proc_open - псевдоним для popen
  • call_user_func_array ("exE" .chr (99), массив ("/ usr / bin /mage", "--all"));
  • file_put_contents ("/ cgi-bin / nextinvocation.cgi") && chmod (...)
  • PharData :: setDefaultStub - еще немного работы для изучения кода в файлах .phar
  • runkit_function_rename ("exec", "innocent_name") или APD rename_function
марио
источник
также call_user_func () во втором списке
Cheekysoft
1
Достаточно одного ответа;) Вы должны просто добавить его к предыдущему.
Джастин Джонсон
13

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

assert('ex' . 'ec("kill --bill")');
NikiC
источник
10

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

MVDS
источник
Пути к файлам с пустыми значениями больше не будут разрешены в 5.4 и последних версиях 5.3.
StasM
@stasM Это одна из лучших вещей, которые я когда-либо слышал о PHP. Спасибо, что поделился.
Уильям
9

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

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

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

L̳o̳̳n̳̳g̳̳p̳o̳̳k̳̳e̳̳
источник
Я понимаю, что вы имеете в виду, но это похоже на другой класс эксплойтов. Есть ли способ, которым вы можете выполнить произвольный код PHP с помощью этого механизма (без использования какой-либо из вышеперечисленных функций)? Или его можно использовать только для изменения содержимого переменных? Если я что-то упустил, я хочу сделать это правильно.
Тайлер
6
Вы также можете использовать переменные функции, которые невозможно будет выполнить без оценки сценария. Например: $innocentFunc = 'exec'; $innocentFunc('activate skynet');.
Эриско
Также обратите внимание на отражение.
Эриско
6

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

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

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

$ myEvilRegex = base64_decode ('Ly4qL2U =');

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

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

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

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

Андреас Линден
источник
Я видел, как base64_decode () часто используется для зла в вредоносных программах на основе Wordpress. Хорошее дополнение к списку.
Крис Аллен Лэйн
5

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

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

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

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

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

Добавим 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";
}
edorian
источник
4

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

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

Spudley
источник
4

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

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

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

Аликс Аксель
источник
2

Об этом недавно говорилось на security.stackexchange.com.

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

Что ж, это немного уменьшает объем, но поскольку print может использоваться для внедрения javascript (и, следовательно, кражи сессий и т. Д.), Он все еще несколько произвольный.

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

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

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

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

оборота симка
источник
2

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

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

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

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

боб-разрушитель
источник
Да, конечно, как и во многих языках программирования, нет никаких способов скрыть свои злые дела. Однако я думаю, что это не соответствует цели, о которой я просил. Сценарий примерно такой: вы призваны помочь после взлома сайта. Клиент доплатит, если вы сможете обезопасить его сайт до утра. Сайт содержит 475 PHP-файлов, а полезные подробности судебной экспертизы уничтожены - у вас огромный стог сена и печально известная маленькая иголка ... с чего вы начали искать? (Моя дневная работа в двух словах)
Tylerl
1

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

  • 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
Владислав Раструсный
источник
1

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

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

Cninroh
источник
0

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

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

Эхимэ
источник
0

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

Reiners
источник
RIPS использует список с этой страницы.
Ладья