PHP-FPM представлений як перевага над стандартним PHP FastCGI, пропонуючи функції, які особливо корисні для веб-сайтів з високим трафіком. Він працює через головний процес, який контролює колекцію робочих процесів. Для запиту PHP-скрипта веб-сервер ініціює FastCGI проксі-з'єднання з сервісом PHP-FPM. Цей сервіс має можливість отримувати запити або через мережеві порти на сервері, або через Unix-сокети.
Незважаючи на проміжну роль проксі-з'єднання, PHP-FPM повинен працювати на тій же машині, що й веб-сервер. З'єднання, яке він використовує, хоча й базується на проксі, відрізняється від звичайних проксі-з'єднань. Після отримання запиту доступний робочий процес PHP-FPM обробляє його — виконує PHP-скрипт і потім передає результати назад веб-серверу. Після завершення обробки запиту робочий процес знову стає доступним для наступних запитів.
Але що таке CGI та FastCGI?
CGI
Зазвичай веб-сторінки, файли та всі документи, які передаються з веб-сервера до браузера, зберігаються в певному публічному каталозі, наприклад home/user/public_html. Коли браузер запитує певний контент, сервер перевіряє цей каталог і надсилає потрібний файл до браузера.
Якщо CGI встановлено на сервері, специфічний каталог cgi-bin також додається туди, наприклад home/user/public_html/cgi-bin. CGI-скрипти зберігаються в цьому каталозі. Кожен файл у каталозі розглядається як виконувана програма. Коли доступ до скрипта з каталогу, сервер надсилає запит до програми, відповідальної за цей скрипт, замість того, щоб надсилати вміст файлу до браузера. Після завершення обробки вхідних даних програма надсилає вихідні дані до веб-сервера, який передає дані HTTP-клієнту.
Наприклад, коли доступ до CGI-скрипта http://mysitename.com/cgi-bin/file.pl, сервер запустить відповідну Perl-програму через CGI. Дані, згенеровані під час виконання скрипта, будуть надіслані програмою до веб-сервера. Сервер, у свою чергу, передасть дані до браузера. Якщо б сервер не мав CGI, браузер відобразив би .pl код файлу. (пояснення з тут)
FastCGI
FastCGI — це новіша веб-технологія, покращена версія CGI, оскільки основна функціональність залишається такою ж.
Необхідність розробки FastCGI виникла через швидкий розвиток і складність додатків, а також для вирішення проблем масштабованості технології CGI. Щоб задовольнити ці вимоги Open Market представив FastCGI — версію CGI-технології з високою продуктивністю з покращеними можливостями.
disable_functions bypass
Можливо виконати PHP-код, зловживаючи FastCGI та уникаючи обмежень disable_functions.
Via Gopherus
Я не впевнений, чи це працює в сучасних версіях, оскільки я пробував один раз, і нічого не виконалося. Будь ласка, якщо у вас є більше інформації про це, зв'яжіться зі мною через [PEASS & HackTricks telegram group here](https://t.me/peass), або twitter [@carlospolopm](https://twitter.com/hacktricks_live).
Використовуючи Gopherus, ви можете згенерувати корисне навантаження для надсилання до FastCGI слухача та виконати довільні команди:
Завантажуючи та отримуючи доступ до цього скрипту, експлойт буде надіслано до FastCGI (вимкнення disable_functions), і виконуються вказані команди.
PHP експлойт
Я не впевнений, чи це працює в сучасних версіях, оскільки я спробував один раз, і не зміг нічого виконати. Насправді, я зміг побачити, що phpinfo() з виконання FastCGI вказувало, що disable_functions було порожнім, але PHP (якимось чином) все ще заважав мені виконувати будь-яку раніше вимкнену функцію. Будь ласка, якщо у вас є більше інформації про це, зв'яжіться зі мною через [PEASS & HackTricks telegram group here](https://t.me/peass), або twitter [@carlospolopm](https://twitter.com/hacktricks_live).
Це php-скрипт для експлуатації протоколу fastcgi для обходу open_basedir та disable_functions.
Це допоможе вам обійти суворі disable_functions для RCE, завантажуючи шкідливе розширення.
Ви можете отримати доступ до нього тут: https://github.com/w181496/FuckFastcgi або трохи модифіковану та покращену версію тут: https://github.com/BorelEnzo/FuckFastcgi
Ви виявите, що експлойт дуже схожий на попередній код, але замість того, щоб намагатися обійти disable_functions, використовуючи PHP_VALUE, він намагається завантажити зовнішній PHP модуль для виконання коду, використовуючи параметри extension_dir та extension всередині змінної PHP_ADMIN_VALUE.
NOTE1: Вам, ймовірно, потрібно буде перекомпілювати розширення з тою ж версією PHP, яку використовує сервер (ви можете перевірити це виводі phpinfo):
NOTE2: Мені вдалося змусити це працювати, вставивши значення extension_dir та extension всередину PHP .ini конфігураційного файлу (щось, що ви не зможете зробити, атакуючи сервер). Але з якоїсь причини, коли я використовував цей експлойт і завантажував розширення з змінної PHP_ADMIN_VALUE, процес просто зупинився, тому я не знаю, чи ця техніка все ще дійсна.
Уразливість віддаленого виконання коду PHP-FPM (CVE-2019–11043)