CVE-2026-44403-WingFTP-v8.1.2-POC-Exploit
يحتوي Wing FTP Server الإصدار 8.1.2 على ثغرة تنفيذ كود عن بُعد (RCE) في آلية تسلسل الجلسة. يمكن لمسؤول مصادق عليه حقن كود Lua تعسفي عبر حقل mydirectory (المجلد الأساسي) لمسؤول النطاق، ويُنفَّذ هذا الكود من جانب الخادم عبر loadfile().
هذه ثغرة منفصلة عن CVE-2025-47812. عالج الإصلاح المطبق في الإصدار 7.4.4 لـ CVE-2025-47812 ناقل حقن البايت الفارغ في حقل اسم المستخدم فقط. أما آلية تسلسل الجلسة غير الآمنة الكامنة فلم يتم إصلاحها، ولا تزال قابلة للاستغلال عبر حقل المجلد الأساسي للمسؤول في الإصدار 8.1.2.
دالة تسلسل الجلسة serialize() في SessionModule.lua (السطر 103) وSessionModuleAdmin.lua (السطر 104) تكتب قيم السلاسل باستخدام ترميز السلسلة الطويلة [[...]] في Lua:
outf("_SESSION["..k.."]=[["..v.."]]\r\n")
إذا احتوت قيمة جلسة على ]]، تُغلق السلسلة الطويلة قبل الأوان ويُفسَّر المحتوى المتبقي ككود Lua قابل للتنفيذ.
يوجد كود لتعقيم الأقواس في cgi.lua (الأسطر 274-275) وcgiadmin.lua (الأسطر 277-278)، لكنه معلّق:
--v = string.gsub(v,"%[","")
--v = string.gsub(v,"%]","")
كما أن الجدول الفوقي للجلسة (metatable) الذي كان سيفرض هذا التعقيم معطّل أيضًا:
--setmetatable(_SESSION,session_metatable) -- cgi.lua:282, cgiadmin.lua:285
الخطوة 1 — حقن الحمولة عبر المجلد الأساسي لمسؤول النطاق:
يقوم مسؤول كامل الصلاحيات ومصادق عليه بإنشاء أو تعديل حساب مسؤول نطاق. يتم تعيين حقل mydirectory على:
C:\ftproot]]os.execute("whoami > C:\\proof.txt")--
لا تقوم نقطتا النهاية service_add_admin.html وservice_modify_admin.html بتعقيم أحرف الأقواس من حقل mydirectory. (تزيل service_add_admin.html الأقواس من اسم المستخدم في السطرين 14-15، لكنها لا تزيلها من mydirectory.)
الخطوة 2 — تحفيز التنفيذ:
عندما يسجّل مسؤول النطاق المُسمَّم الدخول عبر service_login.html، يُخزَّن المجلد الأساسي مباشرةً في الجلسة:
rawset(_SESSION,"admin_basefolder",basefolder) -- service_login.html:95
rawset(_SESSION,"admin_nowpath",basefolder) -- service_login.html:96
يكتب SessionModuleAdmin.save() ذلك إلى ملف الجلسة بالشكل التالي:
_SESSION['admin_basefolder']=[[C:\ftproot]]os.execute("whoami > C:\\proof.txt")--]]
الخطوة 3 — تنفيذ الكود:
عند طلب HTTP التالي الذي يستخدم تلك الجلسة، يستدعي SessionModuleAdmin.load() الدالة loadfile() متبوعةً بـ f() (الأسطر 184-188). يفسّر محلل Lua ملف الجلسة كما يلي:
_SESSION['admin_basefolder']=[[C:\ftproot]] --> assigns string "C:\ftproot"
os.execute("whoami > C:\\proof.txt") --> EXECUTES AS CODE
--]] --> rest is commented out
تُنفَّذ الحمولة بصلاحيات عملية Wing FTP Server (SYSTEM على ويندوز، root على لينكس).
تم تطوير استغلال PoC عملي واختباره ضد Wing FTP Server الإصدار 8.1.2 على ويندوز.
خطوات إعادة الإنتاج:
سجّل الدخول إلى لوحة الإدارة
أنشئ مسؤول نطاق جديد بالقيمة التالية لحقل mydirectory:
C:\ftproot]]os.execute("whoami > C:\\wingftp_rce_proof.txt")--
سجّل الدخول باسم مسؤول النطاق المُنشأ حديثًا
انتقل إلى أي صفحة إدارة (يؤدي ذلك إلى تحميل الجلسة)
تحقق من إنشاء C:\wingftp_rce_proof.txt بحيث يحتوي على اسم مستخدم الخادم