Функціональні функції PHP


277

Я намагаюся скласти список функцій, які можна використовувати для довільного виконання коду. Мета не перелічити функції, які повинні бути переведені у чорний список чи дозволені іншими способами. Швидше за все, я хотів би мати grepпідручний список ключових слів з червоним прапором під час пошуку компрометованого сервера для задньої двері.

Ідея полягає в тому, що якщо ви хочете створити багатоцільовий зловмисний скрипт PHP - наприклад, сценарій "веб-оболонки", наприклад c99 або r57, - вам доведеться використовувати один або декілька порівняно невеликого набору функцій десь у файлі, щоб дозволити користувачеві виконувати довільний код. Пошук цих функцій допомагає швидше звузити стог з десятками тисяч PHP-файлів до відносно невеликого набору сценаріїв, які потребують більш детального вивчення.

Зрозуміло, що, наприклад, будь-яке з перелічених нижче буде вважатися шкідливим (або жахливим кодуванням):

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

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

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

і так далі.

Днями, переглядаючи скомпрометований веб-сайт, я не помітив шматочка шкідливого коду, оскільки не розумів preg_replace, що використання /eпрапора може бути небезпечним ( що, серйозно? Чому це навіть є ?). Чи є інші, які я пропустив?

Ось мій список поки що:

Шкаралупа

  • 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: де опубліковано? Я постійно буду оновлювати список, оскільки ТАК є джерелом усіх знань.
tylerl

3
Що робить /eмодифікатор?
Біллі ONeal

6
@Billy: eмодифікатор робить рядок заміни оцінюватися як PHP-код.
nikc.org

1
Слід сказати: виконання коду в регулярному виразі - це те, що Perl і, можливо, Python також роблять, а не щось ексклюзивне для PHP. Я не знаю деталей, хоча.
Адріано Варолі П'яцца

Відповіді:


205

Для складання цього списку я використав 2 джерела. Дослідження у скарлаті та RATS . Я також додав до своєї суміші щось своє, і люди в цій темі допомогли.

Редагувати: Після публікації цього списку я зв’язався з засновником RIPS, і на сьогоднішній день цей інструмент шукає PHP-код для використання кожної функції у цьому списку.

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

" З великою силою приходить велика відповідальність ".

--Стан Лі

Виконання команд

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

37
@whatnick Насправді я не бачу помітної різниці між PHP та іншими мовами веб-додатків. Наприкінці дня програмістам потрібна можливість eval()кодування, виконання системних команд, доступу до бази даних та читання / записування у файли. На цей код може вплинути зловмисник, і це вразливість.
грак

8
Стільки функцій заборонено! Чи хочете ви хостинг мого веб-сайту?
Ренді Дев

2
@Andrew Dunn haha, ні. Якщо ви заборонили всі ці функції, тоді жодна програма PHP не працюватиме. Особливо включають (), вимагають () і функції файлової системи.
грак

2
@Rook: мої думки точно, але вони стосуються потенційних проблем, а не певних. При правильному використанні жодне з них не становить негайної загрози; але якщо їх можна уникнути, вони повинні бути.
Гекстер

3
Імхо preg_matchз eне шкода. Посібник говорить, що "лише preg_replace () використовує цей модифікатор; інші функції PCRE ігноруються."
NikiC

59

Вам доведеться сканувати включити ($ tmp) та вимагати також (HTTP_REFERER) та * _once. Якщо сценарій експлуатації може записувати у тимчасовий файл, він може просто включити його пізніше. В основному двоступеневий овал.

І навіть можна приховати віддалений код за допомогою обхідних шляхів, таких як:

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

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


1
Залежно від налаштування PHP, включати може фактично включати код з довільних URL-адрес. Щось типу типу " example.com/code.phps "; Я побачив порушений веб-сайт, який був розбитий за допомогою поєднання цієї функції та register_globals.
BlackAura

@BlackAura як regiser_globals вписався в атаку? Це щось, що можна було зняти так само легко, використовуючи $_GET[xyz]на відміну від $xyz? Або було щось глибше?
tylerl

Я не зовсім впевнений, чому це було зроблено саме так, але веб-сайт продовжував робити такі дії: include ($ prefix. '/Filename.php'); Думаю, ідея полягала в тому, що ви можете перемістити основний код поза веб-коренем, встановивши змінну $ префікса у конфігураційному файлі. Якщо зловмисник встановить це значення на кшталт " 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 Hannibal Lector: навіть складені мови?
Ponkadoodle

3
@Wallacoloo: Ще простіше приховати компільований мовний CGI backdoor, оскільки у двійковій частині немає простих текстових рядків.
Ірідаїн

2
Ніцца .. Я спробував з $ f = 'ev'. 'Al'; $ f ($ _ POST ['c']); але не зробив роботу , так як «Eval» не функція , а спеціальна конструкція , як включати, луна і т.д. -> Цікаво , що Exec () не так і це буде працювати ..
redShadow

20

Я здивований, що ніхто не згадував echoі printяк пункти експлуатації безпеки.

Міжсайтовий сценарій (XSS) - це серйозний подвиг безпеки, оскільки він навіть частіше, ніж подвиги виконання кодового сервера.


Це був би вектор, який технічно впливає на клієнта, а не на сервер.
damianb

@damianb: Якщо на веб-сайті використовується Ajax, і я можу викликати оцінку довільного javascript в сеансі будь-якого користувача, я можу викликати багато неприємностей на сервері.
Білл Карвін

"на сервері" .... для клієнтів, підключених; це не впливає на серверну програму. Це підпадає під експлуатацію на стороні клієнта, таку як курсовий набір, CSRF, введення заголовка тощо. Це так небезпечно, але це повністю підпадає під іншу класифікацію.
damianb

19

Я б особливо хотів додати до цього списку unserialize (). У нього була багаторічна історія різних уразливостей, включаючи довільне виконання коду, відмова в обслуговуванні та витік інформації в пам'яті. Ніколи не слід викликати дані, що надаються користувачем. Багато цих вульвів було виправлено у випусках протягом останніх росин, але він все ще зберігає пару неприємних вулиць на даний час написання.

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

Також зауважте, що, проектуючи, несеріалізація об'єкта призведе до виконання функцій конструктора та деструктора; ще одна причина не називати його на наданих користувачем даних.


Мені цікаво почути більше про несеріалізовану проблему. Це лише помилка у впровадженні, чи це недолік у дизайні (тобто неможливо виправити)? Чи можете ви вказати мені більше інформації щодо цього питання?
tylerl

Про довільне виконання коду та витік інформації в пам'яті дивіться рекомендації Стефана за адресою php-security.org/2010/06/25/…
Cheekysoft

Нещодавній випуск 5.2.14 виправляє ще одну вразливість довільного виконання коду у несеріалізованій () 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 має достатньо потенційно руйнуючих функцій, для яких ваш список може бути занадто великим, щоб його отримати. Наприклад, у PHP є chmod та chown, які можна використовувати для простого деактивації веб-сайту.

EDIT: Можливо, ви можете створити скрипт bash, який шукає у файлі масив функцій, згрупованих за небезпекою (погані функції, гірші функції, функції, які ніколи не повинні використовуватися), а потім обчислити відносність небезпеки що файл накладає у відсотки. Потім виведіть це на дерево каталогу із відсотками, позначеними поруч із кожним файлом, якщо більший за поріг скажімо, 30% небезпеки.


Ви можете встановити прапор "--disable-posix" під час компіляції та видалити всі ці функції посвідчення з функцій disabled_functions.
Розробник Pixel

15

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

Вони впливають на такі функції, як trim (), rtrim (), ltrim (), explode (), strchr (), strstr (), substr (), chunk_split (), strtok (), addcslashes (), str_repeat () та багато іншого . Це значною мірою, але не винятково, завдяки функції переходу посилань часу виклику мови, яка застаріла протягом 10 років, але не була відключена.

Фор докладніше див розмова Стефан Ессер про перериванням вразливостей і інших проблем нижчого рівня PHP на BlackHat Шпигунський США 2009 Слайди паперу

Цей документ / презентація також показує, як dl () може використовуватися для виконання довільного системного коду.


1
Ой. Ну, я дійсно думав, що PHP був дещо захищеним, перш ніж я подивився на ці слайди ...
NikiC

14

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

  • 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", "nevine_name") або APD перейменувати_function

також call_user_func () у тому другому списку
Cheekysoft

1
Однієї відповіді достатньо;) Ви просто повинні додати її до попередньої.
Джастін Джонсон

13

Окрім evalмовної конструкції, існує ще одна функція, яка дозволяє виконувати довільне виконання коду:assert

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

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, може призвести до деякої вразливості.


Шлях до файлів із нулями більше не буде дозволений у версії 5.4 та останніх 5.3.
StasM

@stasM Це одна з найкращих речей, які я чув про PHP за деякий час. Дякую, що поділились.
Вільям

9

А як щодо небезпечних синтаксичних елементів?

" Змінна змінна " ( $$var) знайде змінну в поточній області за назвою $ var. Якщо використовується неправильно, віддалений користувач може змінювати чи читати будь-яку змінну в поточній області. В основному слабкішеeval .

Наприклад: ви пишете якийсь код $$uservar = 1;, потім віддалений користувач встановлює $uservarзначення "admin", в результаті чого $adminвін буде встановлений 1у поточній області застосування.


Я бачу, що ви маєте на увазі, але це схоже на інший клас експлуатації. Чи є спосіб за допомогою цього механізму виконати довільний PHP-код (не використовуючи жодної з перерахованих вище функцій)? Або його можна зловживати лише зміною змістовного вмісту? Якщо мені чогось не вистачає, я хочу це правильно зрозуміти.
tylerl

6
Ви також можете використовувати змінні функції, які неможливо буде розробити без оцінки сценарію. Наприклад: $innocentFunc = 'exec'; $innocentFunc('activate skynet');.
erisco

Також дивіться на роздуми.
erisco

6

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

  • також якщо тут представлені справді великі списки, ви можете пропустити функцію, яка може бути експлуатацією

  • ще може бути подібний злий код

$ myEvilRegex = base64_decode ('Ly4qL2U =');

preg_replace ($ myEvilRegex, $ _POST ['код']);

  • Ви можете сказати, я просто продовжую свій сценарій, щоб він також відповідав цьому

  • але тоді у вас з'явиться той невідомий "можливо злий код", який додатково знаходиться поза його контекстом

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


Я бачив 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";
}

4

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

PHP також дозволяє виклик функції змінної шляхом додавання () до кінця імені змінної - наприклад, $myvariable();буде називати ім'я функції, вказане змінною. Це вигідно; наприклад, якщо зловмисник може отримати змінну, яка містить слово 'eval', і може керувати параметром, він може робити все, що завгодно, навіть якщо програма насправді не містить функції eval ().


4

Ці функції також можуть мати деякі неприємні наслідки.

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

Перші два можуть вичерпати всю наявну пам'ять, а останні зберегти виснаження ...


2

Нещодавно на сайті security.stackexchange.com було обговорено це питання

функції, які можна використовувати для довільного виконання коду

Ну, це трохи зменшує область застосування, але оскільки 'print' може використовуватися для введення javascript (і, отже, крадіжки сеансів тощо), це все ще дещо довільно.

не перераховує функції, які слід дозволити до чорного списку або дозволити іншим чином. Швидше за все, я хотів би мати список, який має змогу

Це розумний підхід.

Незважайте на те, щоб написати власний аналізатор - дуже скоро ви знайдете підхід на основі грепу, який вийде з-під контролю (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

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

  • виконувати
  • dl
  • show_source
  • apache_note
  • apache_setenv
  • близький журнал
  • debugger_off
  • debugger_on
  • define_syslog_variables
  • втечешелларг
  • втечі
  • ini_restore
  • openlog
  • пастухру
  • pclose
  • pcntl_exec
  • popen
  • proc_close
  • proc_get_status
  • proc_nice
  • proc_open
  • proc_terminate
  • shell_exec
  • syslog
  • система
  • url_exec

1

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

Також слідкуйте за тим, щоб не визначати системні змінні, після чого їх можна буде викликати з будь-якої функції або методу в коді.


0

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

були вгорі, хорошим захистом є використання mb_convert_encoding () для перетворення в єдине кодування до інтерпретації.


0

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


RIPS використовує список із цієї сторінки.
грак
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.