
PoC de CVE-2025-22652
Plugin de WordPress
Nombre del componente Payment Forms for Paystack
Versión vulnerable <= 4.0.1
Slug del componente payment-forms-for-paystack
Enlace del componente https://wordpress.org/plugins/payment-forms-for-paystack/
Clase de vulnerabilidad A3: Injection
Tipo de vulnerabilidad Inyección SQL
Administrador
En el plugin Payment Forms for Paystack versión 4.0.1 y anteriores, existe una vulnerabilidad de Inyección SQL debido a una validación de entrada insuficiente y procesamiento de escape para el parámetro de URL order al visualizar la lista de pagos en los formularios de pago. A través de esto, un atacante con privilegios de administrador puede extraer toda la información de la base de datos del sitio objetivo.
Si bien esta vulnerabilidad no permite la consulta directa de datos, los datos pueden extraerse mediante técnicas de Inyección SQL basada en tiempo.
Prepare un sitio WordPress con el plugin Payment Forms for Paystack instalado en la versión 4.0.1 o inferior.
Dado que es necesario agregar un formulario Paystack para realizar la consulta, agregue un formulario desde el menú de agregar formulario Paystack (wp-admin/post-new.php?post_type=paystack_form).

Después de agregar el formulario, puede verificar el ShortCode e insertar el ID de atributo de ese ShortCode en el parámetro de URL form en la URL a continuación antes de acceder a ella.
http://localhost:8080/wp-admin/edit.php?post_type=paystack_form&page=submissions&form=<Insertion Point>&orderby=&order=,+(select+sleep(5)+from+dual+where+1=1)
Por ejemplo, si [pff-paystack id="13"], acceda a 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)

Como resultado, dado que la cláusula de condición where 1=1 en la carga útil de Inyección SQL insertada en el parámetro de URL order siempre es verdadera, puede confirmar que la función se ejecuta y la respuesta llega después de 5 segundos.
Al solicitar la URL donde ocurre la vulnerabilidad, se llama a la función get_payments_by_id en el archivo /wp-content/plugins/payment-forms-for-paystack/includes/classes/class-helpers.php.
En este punto, el parámetro de URL order se inserta directamente en la consulta SQL y se ejecuta en la base de datos sin ninguna validación de entrada ni procesamiento de escape.

Por lo tanto, cuando la carga útil de Inyección SQL , (select sleep(5) from dual where 1=1) se inserta en el parámetro de URL order, se ejecuta la consulta SQL que se muestra a continuación. En este punto, dependiendo de si la cláusula de condición en la carga útil es verdadera o falsa, hay una diferencia en el tiempo de respuesta, y esta diferencia de tiempo se puede usar para extraer datos de la base de datos.
SELECT * FROM %i WHERE post_id = %d AND paid = %s ORDER BY %i , (select sleep(5) from dual where 1=1)
Abra el código PoC en un editor e ingrese la dirección del sitio WordPress y las credenciales de administrador.

Luego ingrese el siguiente comando para ejecutar el código PoC.
Módulo requeridorequests
python poc.py

sleep(5)
Por otro lado, si cambia la cláusula de condición en la carga útil de Inyección SQL insertada en order a where 1=2, puede confirmar que la respuesta llega de inmediato.
http://localhost:8080/wp-admin/edit.php?post_type=paystack_form&page=submissions&form=<Insertion Point>&orderby=&order=,+(select+sleep(5)+from+dual+where+1=2)
Por ejemplo, si [pff-paystack id="13"], acceda a 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)
