
PoC of CVE-2025-22652
Plugin WordPress
Nome do componente Payment Forms for Paystack
Versão vulnerável <= 4.0.1
Slug do componente payment-forms-for-paystack
Link do componente https://wordpress.org/plugins/payment-forms-for-paystack/
Classe de vulnerabilidade A3: Injeção
Tipo de vulnerabilidade Injeção SQL
Administrador
No plugin Payment Forms for Paystack versão 4.0.1 e anteriores, existe uma vulnerabilidade de Injeção SQL devido à validação de entrada insuficiente e ao processamento de escape para o parâmetro de URL order ao visualizar a lista de pagamentos nos formulários de pagamento. Através disso, um atacante com privilégios de administrador pode extrair todas as informações da base de dados do site alvo.
Embora esta vulnerabilidade não permita consultas diretas de dados, os dados podem ser extraídos usando técnicas de Injeção SQL Baseada em Tempo.
Prepare um site WordPress com o plugin Payment Forms for Paystack instalado na versão 4.0.1 ou inferior.
Como é necessário adicionar um formulário Paystack para realizar a consulta, adicione um formulário a partir do menu de adição de formulários Paystack (wp-admin/post-new.php?post_type=paystack_form).

Após adicionar o formulário, pode verificar o ShortCode e inserir o atributo ID desse ShortCode no parâmetro de URL form no URL abaixo antes de aceder.
http://localhost:8080/wp-admin/edit.php?post_type=paystack_form&page=submissions&form=<Ponto de Inserção>&orderby=&order=,+(select+sleep(5)+from+dual+where+1=1)
Por exemplo, se [pff-paystack id="13"], aceda 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, uma vez que a cláusula de condição where 1=1 no payload de Injeção SQL inserido no parâmetro de URL order é sempre verdadeira, pode confirmar que a função é executada e a resposta chega após 5 segundos.
Ao solicitar o URL onde a vulnerabilidade ocorre, a função get_payments_by_id no ficheiro /wp-content/plugins/payment-forms-for-paystack/includes/classes/class-helpers.php é chamada.
Neste ponto, o parâmetro de URL order é inserido diretamente na consulta SQL e executado na base de dados sem qualquer validação de entrada ou processamento de escape.

Portanto, quando o payload de Injeção SQL , (select sleep(5) from dual where 1=1) é inserido no parâmetro de URL order, a consulta SQL mostrada abaixo é executada. Neste ponto, dependendo se a cláusula de condição no payload é verdadeira ou falsa, há uma diferença no tempo de resposta, e esta diferença de tempo pode ser usada para extrair dados da base de dados.
SELECT * FROM %i WHERE post_id = %d AND paid = %s ORDER BY %i , (select sleep(5) from dual where 1=1)
Abra o código PoC num editor e insira o endereço do site WordPress e as credenciais de administrador.

Em seguida, execute o seguinte comando para executar o código PoC.
Módulo necessáriorequests
python poc.py

sleep(5)
Por outro lado, se alterar a cláusula de condição no payload de Injeção SQL inserido em order para where 1=2, pode confirmar que a resposta chega imediatamente.
http://localhost:8080/wp-admin/edit.php?post_type=paystack_form&page=submissions&form=<Ponto de Inserção>&orderby=&order=,+(select+sleep(5)+from+dual+where+1=2)
Por exemplo, se [pff-paystack id="13"], aceda 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)
