
PoC of CVE-2025-22710
Extension WordPress
Nom du composant WooCommerce Advanced Bulk Edit Products, Orders, Coupons, Any WordPress Post Type – Smart Manager
Version vulnérable <= 8.50.0
Slug du composant smart-manager-for-wp-e-commerce
Lien du composant https://wordpress.org/plugins/smart-manager-for-wp-e-commerce/
Classe de vulnérabilité A3 : Injection
Type de vulnérabilité Injection SQL
Administrateur
L'extension WooCommerce Advanced Bulk Edit Products, Orders, Coupons, Any WordPress Post Type – Smart Manager (ci-après Smart Manager) est une extension qui permet la modification en masse et l'affichage de tous les types de publications dans WordPress.
Dans l'extension Smart Manager version 8.50.0 et antérieures, lors de l'utilisation de la fonction de recherche avancée pour afficher les publications, une vulnérabilité d'injection SQL se produit car les valeurs de filtrage sont passées aux requêtes de base de données sans échappement.
Cependant, bien que les résultats directs des attaques par injection SQL ne soient pas visibles à l'écran, une injection SQL aveugle est possible grâce aux différences dans les valeurs de réponse basées sur des conditions vrai/faux.
⚠️ Au moins une publication doit exister pour observer la différence dans les valeurs de réponse basées sur des conditions vrai/faux.
/wp-admin/admin.php?page=smart-manager).

' OR 1=1 )) # dans le champ de texte. Ensuite, cliquez sur le bouton de recherche en haut.

' OR 1=2 )) # dans le champ de texte, aucune publication ne sera récupérée car la condition est toujours fausse (OR 1=2).

Lors de l'exécution de la fonction « Recherche avancée » décrite dans la description du PoC ci-dessus, le paquet suivant est généré et les valeurs de filtrage (Titre de la publication, est, ' OR 1=1 )) #) saisies dans la recherche avancée sont introduites dans les données de requête advanced_search_query.
advanced_search_query=[{"condition":"OR","rules":[{"condition":"AND","rules":[{"type":"wp_posts.post_title","operator":"is","value":"' OR 1=1 )) #"}]}]}]

Lorsque ce paquet est demandé, la fonction get_data_model dans le fichier /wp-content/plugins/smart-manager-for-wp-e-commerce/classes/class-smart-manager-base.php est appelée et effectue des requêtes de base de données dans l'ordre suivant.
Si les données de requête advanced_search_query existent, elle appelle la fonction process_search_cond. À ce moment, les données de requête advanced_search_query sont transmises à la valeur avec la clé search_query dans l'argument de paire clé-valeur.
search_query=[{"condition":"OR","rules":[{"condition":"AND","rules":[{"type":"wp_posts.post_title","operator":"is","value":"' OR 1=1 )) #"}]}]}]

La fonction appelée process_search_cond parcourt la valeur avec la clé search_query, initialise la valeur de filtrage Titre de la publication (post_title) dans la variable $search_col, et initialise la valeur de filtrage ' OR 1=1 )) # contenant la charge utile d'injection SQL dans la variable .
Dans la fonction de recherche avancée, l'entrée utilisateur (' OR 1=1 )) #) est directement incluse dans la requête de base de données sans échappement, ce qui entraîne une vulnérabilité d'injection SQL. Cette vulnérabilité permet aux attaquants d'exécuter des requêtes SQL arbitraires, ce qui peut conduire à des risques de sécurité graves tels que la fuite ou la manipulation d'informations sensibles de la base de données.
⚠️ L'implémentation du code PoC interroge le nom de la base de données en exploitant la vulnérabilité d'injection SQL.
Ouvrez le code PoC dans un éditeur et saisissez l'adresse du site WordPress et les identifiants administrateur.

Ensuite, saisissez la commande suivante pour exécuter le code PoC.
Module requisrequests
python poc.py

$search_value
Les variables $search_col et $search_value sont transmises respectivement aux clés search_col (=post_title) et search_value (=' OR 1=1 )) #) du tableau $search_params. Ensuite, cette variable $search_params est transmise comme valeur avec la clé search_params à la fonction create_flat_table_search_query.

Ensuite, la fonction create_flat_table_search_query définit la clause WHERE de la requête SQL, et à ce stade, le search_value (=' OR 1=1 )) #) de la clé search_params passé comme argument est inclus dans la clause WHERE sans aucun échappement.

Ensuite, la valeur de retour de la fonction create_flat_table_search_query (contenant la charge utile d'injection SQL) est transmise comme argument à la fonction process_flat_table_search_query.

La fonction process_flat_table_search_query construit une requête de base de données en utilisant l'argument reçu, en initialisant les variables $select, $from et $where. Ici, on peut voir que la charge utile d'injection SQL est transmise directement à la variable $where sans aucune validation.

Les variables $select, $from, $where sont directement affectées à la variable $query_posts_search, et cette variable est finalement transmise comme argument à la fonction qui exécute la requête de base de données.
