
PoC of CVE-2025-22652
Plugin WordPress
Nom du composant Payment Forms for Paystack
Version vulnérable <= 4.0.1
Slug du composant payment-forms-for-paystack
Lien du composant https://wordpress.org/plugins/payment-forms-for-paystack/
Classe de vulnérabilité A3 : Injection
Type de vulnérabilité Injection SQL
Administrateur
Dans le plugin Payment Forms for Paystack version 4.0.1 et inférieure, il existe une vulnérabilité d'injection SQL due à une validation insuffisante des entrées et à un traitement d'échappement pour le paramètre d'URL order lors de l'affichage de la liste des paiements dans les formulaires de paiement. Grâce à cela, un attaquant disposant de privilèges d'administrateur peut extraire toutes les informations de la base de données du site cible.
Bien que cette vulnérabilité ne permette pas d'interroger directement les données, celles-ci peuvent être extraites à l'aide de techniques d'injection SQL basées sur le temps.
Préparez un site WordPress avec le plugin Payment Forms for Paystack installé version 4.0.1 ou inférieure.
Comme vous devez ajouter un formulaire Paystack pour effectuer la recherche, ajoutez un formulaire depuis le menu d'ajout de formulaire Paystack (wp-admin/post-new.php?post_type=paystack_form).

Après avoir ajouté le formulaire, vous pouvez vérifier le ShortCode et insérer l'attribut ID de ce ShortCode dans le paramètre d'URL form dans l'URL ci-dessous avant d'y accéder.
http://localhost:8080/wp-admin/edit.php?post_type=paystack_form&page=submissions&form=<Point d'insertion>&orderby=&order=,+(select+sleep(5)+from+dual+where+1=1)
Par exemple, si [pff-paystack id="13"], accédez à http://localhost:8080/wp-admin/edit.php?post_type=paystack_form&page=submissions&form=13&orderby=&order=,+(select+sleep(5)+from+dual+where+1=1)

En conséquence, comme la clause de condition where 1=1 dans la charge utile d'injection SQL insérée dans le paramètre d'URL order est toujours vraie, vous pouvez confirmer que la fonction est exécutée et que la réponse arrive après 5 secondes.
Lors de la demande de l'URL où la vulnérabilité se produit, la fonction get_payments_by_id dans le fichier /wp-content/plugins/payment-forms-for-paystack/includes/classes/class-helpers.php est appelée.
À ce stade, le paramètre d'URL order est inséré directement dans la requête SQL et exécuté sur la base de données sans aucune validation des entrées ni traitement d'échappement.

Par conséquent, lorsque la charge utile d'injection SQL , (select sleep(5) from dual where 1=1) est insérée dans le paramètre d'URL order, la requête SQL ci-dessous est exécutée. À ce stade, selon que la clause de condition dans la charge utile est vraie ou fausse, il existe une différence de temps de réponse, et cette différence de temps peut être utilisée pour extraire des données de la base de données.
SELECT * FROM %i WHERE post_id = %d AND paid = %s ORDER BY %i , (select sleep(5) from dual where 1=1)
Ouvrez le code PoC dans un éditeur et saisissez l'adresse du site WordPress et les identifiants de l'administrateur.

Saisissez ensuite la commande suivante pour exécuter le code PoC.
Module requisrequests
python poc.py

sleep(5)
D'autre part, si vous modifiez la clause de condition dans la charge utile d'injection SQL insérée dans order pour where 1=2, vous pouvez confirmer que la réponse arrive immédiatement.
http://localhost:8080/wp-admin/edit.php?post_type=paystack_form&page=submissions&form=<Point d'insertion>&orderby=&order=,+(select+sleep(5)+from+dual+where+1=2)
Par exemple, si [pff-paystack id="13"], accédez à http://localhost:8080/wp-admin/edit.php?post_type=paystack_form&page=submissions&form=13&orderby=&order=,+(select+sleep(5)+from+dual+where+1=2)
