Знову зіткнувся із ситуацією, коли користувач завантажив на свій сайт плагін із невідомого джерела, який спричинив чимало проблем. Код сканував чужі сайти й навантажував слабкий хостинг. Жоден антивірус не розпізнав цей код — я перевіряв його на VirusTotal, і подібне траплятиметься й надалі. Як знаходити такі закладки? Якщо ви не знаєте PHP, навряд чи зможете їх виявити, але навіть невеликий досвід дає шанс.
Потрібно знати прийоми, які для цього використовують. Часто такий код має сигнатури, які виявляють антивіруси, тому його намагаються зашифрувати, наприклад у base64. Варто звернути увагу на функції на кшталт base64_decode і перевірити, що саме вони декодують. Якщо ця суміш зашита безпосередньо в код і запускається, наприклад, через eval(, це дуже ймовірно шкідливий код. Нижче зібрав повний список того, що варто шукати.
Що шукати у PHP-файлах
1. Функції для виконання довільного коду або команд
Такі функції запускають код або системні команди й часто трапляються у закладках:
eval(— виконує довільний PHP-код.system(— виконує системні команди.exec(— запускає зовнішні команди.passthru(— виконує команди й повертає вивід.shell_exec(— виконує команди через оболонку.popen(— відкриває процес для виконання команди.
2. Динамічне підключення файлів
Закладки можуть завантажувати шкідливий код через динамічне підключення файлів на основі введених користувачем даних:
include $_GETабоrequire $_GET— підключення файлів через GET-параметри.include $_POSTабоrequire $_POST— те саме через дані POST.include_onceабоrequire_onceз динамічними шляхами, наприкладinclude $_REQUEST['file'].
3. Робота з файлами
Функції створення або зміни файлів можуть використовуватися для впровадження шкідливого коду:
fopen(— відкриває файл для запису.file_put_contents(— записує дані у файл.fwrite(— записує у файл.move_uploaded_file(— переміщує завантажені файли; це можуть використати для завантаження закладок.
4. Мережеві функції
Ці функції можуть свідчити про зв’язок із зовнішніми серверами для передавання даних або отримання команд:
curl_init(— ініціалізує запити через cURL.fsockopen(— відкриває сокетне з’єднання.socket_create(— створює мережевий сокет.
5. Обфускація та декодування
Зловмисники часто приховують код за допомогою кодування:
base64_decode(— декодує дані, закодовані в base64.gzinflate(— розпаковує стиснені дані.str_rot13(— просте перетворення для обфускації.preg_replace(із прапорцем/e— застарілий модифікатор, який дозволяв виконувати код (до PHP 5.5).
6. Фонові процеси й автоматичний запуск
Ці функції можуть використовуватися для прихованого виконання коду:
register_shutdown_function(— запускає код після завершення скрипту.pcntl_fork(— створює фоновий процес.ignore_user_abort(— продовжує виконання скрипту після від’єднання користувача.
7. Підозрілі змінні й коментарі
- Змінні з назвами на кшталт
$cmd,$shell,$password,$adminможуть бути частиною закладки. - Коментарі зі словами на кшталт
backdoor,exploit,hackможуть бути підказкою.
8. Нетипові функції
Рідко вживані функції, які можуть використовуватися у закладках:
assert(— виконує код як вираз.create_function(— створює анонімні функції (застаріла у PHP 7.2).call_user_func(— викликає функції динамічно.
9. Типові шаблони
- Використання
$_GET,$_POST,$_REQUESTразом із функціями виконання коду чи підключення файлів, наприкладeval($_GET['code']). - Довгі закодовані рядки, наприклад великі фрагменти base64.
- Ключові слова на кшталт
password,admin,shell,exploitу коді.
Як шукати
1. Ручний пошук
- Відкрийте PHP-файли в текстовому редакторі або IDE (наприклад, VSCode чи Sublime Text).
- Можна скористатися, наприклад, Total Commander: відкрийте пошук у каталозі (Інструменти → Пошук файлів), задайте маску
*.phpі введіть потрібні рядки. - Скористайтеся пошуком (Ctrl+F), щоб перевірити кожен із наведених шаблонів.
- Зверніть увагу на нещодавно змінені файли або файли в підозрілих місцях, наприклад
/uploads/.
2. Командний рядок
Команда grep у Linux/macOS дає змогу швидко шукати рядки у файлах. Наприклад, щоб знайти eval(:
grep -r "eval(" /path/to/your/php/files
3. Автоматизовані інструменти
- Використовуйте аналізатори коду, як-от RIPS, PHPStan або SonarQube, щоб автоматично виявляти підозрілі конструкції.
- Для WordPress спробуйте WPScan або плагіни на кшталт Wordfence.
- Перевірте файли антивірусами для вебзастосунків.
Обфускація: якщо знаходите закодовані рядки (наприклад, довгі фрагменти base64), спробуйте декодувати їх вручну, щоб зрозуміти вміст. Але навіть без декодування наявність такого фрагмента може свідчити про високу ймовірність шкідливого коду.

