Nxploited/CVE-2025-29009
PoC files
3 filesFile viewing is interactive and short-lived. Downloads are password-protected ZIP archives using password eip.
Analysis
Technical assessment
Python script that exploits CVE-2025-29009, an unauthenticated arbitrary file upload vulnerability in the WordPress Medical Prescription Attachment Plugin for WooCommerce. It extracts a nonce from the target's frontend, uploads a user-supplied PHP web shell, verifies the shell by checking for a signature string, and saves the shell URL.
Backdoor review
No backdoor observed in reviewed code
The PoC is a straightforward exploit for CVE-2025-29009. It uploads a user-supplied PHP shell to a vulnerable WordPress plugin endpoint and verifies the upload by checking for a user-supplied signature string. No concealed, deceptive, or operator-directed harmful behavior beyond the stated exploit was observed in the reviewed text files.
Classification basis and observed behavior
Classification basis
The Python script actively uploads a user-provided PHP web shell to a vulnerable target, verifies its presence, and saves the URL for later use. This constitutes exploitation, not mere detection or scanning. The README explicitly describes the attack flow as 'Upload shell' and 'Verify shell'.
CVE-2025-29009.py:216-283README.md:49-61Requirements
- Target running vulnerable Medical Prescription Attachment Plugin for WooCommerce <= 1.2.3
README.md:2 - User-supplied PHP web shell file present on local filesystem
CVE-2025-29009.py:105-108 - Target's frontend exposes wkwcpaFrontObj JavaScript object containing ajaxUrl and ajaxNonce
README.md:34
Observed behavior
- Reads target URLs from a file and enqueues them for multithreaded processing
CVE-2025-29009.py:118-132 - Fetches frontend pages to extract the AJAX nonce from the wkwcpaFrontObj JavaScript object
CVE-2025-29009.py:143-179 - Uploads a local PHP file via a multipart POST request to the extracted AJAX endpoint with action=wkwcpa_handle_prescription_session and type=upload
CVE-2025-29009.py:216-241 - Parses the JSON response to extract the uploaded shell's public URL
CVE-2025-29009.py:254-283 - Verifies the uploaded shell by sending a GET request and checking for a user-defined signature string in the response body
CVE-2025-29009.py:286-298 - Saves verified shell URLs to shells.txt
CVE-2025-29009.py:135-140
Behaviors behind the backdoor verdict
Observables
- Exploit Behavior
- Uploads a user-supplied PHP file to a target WordPress site via the wkwcpa_handle_prescription_session AJAX handler, then verifies the upload by checking for a user-supplied signature string in the response.This is the normal, stated behavior of the CVE-2025-29009 exploit. The script does not contain any hidden or unrelated actions.
CVE-2025-29009.py:216-283CVE-2025-29009.py:286-298 - User Interaction
- The script prompts the user for a local shell filename and a unique shell signature, and uses these to perform the upload and verification.The script does not contain any hardcoded shell or backdoor; it relies entirely on user-provided files and strings.
CVE-2025-29009.py:90-115 - Output File
- shells.txtThe script saves verified shell URLs to a local file named shells.txt. This is a standard output mechanism for an exploit scanner.
CVE-2025-29009.py:135-140
What the analysis did not establish
- One file (requirements.txt) was omitted from the text evidence; its content is not inspected.
- The artifact's behavior is assessed solely from static source code analysis; the code was not executed.
- One file (requirements.txt) was omitted from the text evidence; its content was not reviewed, but it is a standard Python dependency file and unlikely to contain executable backdoor logic.
- Binary content was not present in the evidence.
- The review is limited to the supplied text; no dynamic analysis was performed.
This review is limited to the supplied PoC code and context. It does not assert that the code works or is safe to execute.