
API SAS Utilisez son flux RCE
Identifiant: CVE-2025-50881
Produit concerné : API Use it Flow Version 8.2.0 (Rev 15851), Version 9.2.0 (Rev 18093)
Éditeur : https://www.tenorsolutions.com (anciennement https://api-sas.fr/)
Composant(s) concerné(s) : flow/admin/moniteur.php
Type de vulnérabilité : Exécution de code à distance (RCE) via injection dans eval()
Sévérité : Critique
Description :
Le script flow/admin/moniteur.php est vulnérable à l’exécution de code à distance. Lors du traitement des requêtes GET, le script prend l’entrée fournie par l’utilisateur dans le paramètre action de l’URL, effectue une validation insuffisante et intègre cette entrée dans une chaîne ($wscom) qui est ensuite exécutée par la fonction eval(). Bien qu’une vérification method_exists() soit effectuée, elle ne valide que la partie de l’entrée utilisateur avant la première parenthèse (, permettant à un attaquant d’ajouter du code PHP arbitraire après une structure d’appel de méthode valide. Une exploitation réussie permet à un attaquant non authentifié ou trivialement authentifié d’exécuter du code PHP arbitraire sur le serveur avec les privilèges du processus serveur web.
Extraits de code vulnérables :
Fichier : flow/admin/moniteur.php
Lecture de l’entrée utilisateur (ligne ~45) :
if (isset($_GET['action'])) {$action=urldecode(htmlentities($_GET['action']));} else notice($server);
Commentaire : $action est dérivée directement de l’entrée utilisateur ($_GET['action']) avec seulement un décodage d’URL et un encodage d’entités HTML, ce qui n’empêche pas l’injection de code.
Construction de la chaîne de commande (ligne ~47) :
$wscom='$ws->'.$action;
Commentaire : Le $action contrôlé par l’utilisateur est concaténé dans la chaîne $wscom.
Validation insuffisante (ligne ~49) :
$func=explode("(",$action);
if (method_exists($ws, $func[0])) {
Commentaire : Seule la partie de $action avant la première parenthèse est vérifiée par rapport aux méthodes valides de la classe UIFWebService.
Exploitation :
Un attaquant peut concevoir une requête GET vers moniteur.php, en fournissant des paramètres login et password arbitraires (car ils sont utilisés pour l’authentification dans la méthode appelée, et non pour eval lui-même) ainsi qu’un paramètre action malveillant. Le paramètre action doit commencer par un nom de méthode valide de la classe UIFWebService (par exemple get_data) pour passer la vérification method_exists, suivi de code PHP injecté.
Exemple de charge utile :
GET /admin/moniteur.php?login=foo&password=bar&action=get_data(1);phpinfo();$res=0; HTTP/1.1
Host: <target>
Cette charge utile entraîne l’exécution par eval() d’un code similaire à :
$res = $ws->get_data(1);phpinfo();$res=0;;
Ceci exécute la méthode get_data, puis exécute phpinfo(), et enfin définit $res à 0.
Impact :
Divulgation :
Exécution de code via eval() (ligne ~50) :
eval('$res=' . $wscom . ';');
Commentaire : La chaîne construite $wscom, contenant l’entrée utilisateur, est exécutée en tant que code PHP.