Elementor Pro 4.2.2 closed an unauthenticated file upload (CVE-2026-32475)

A form with an upload field was enough for anyone to drop a PHP file into your uploads folder. What the flaw needed, which version fixes it, and the folder worth opening on any site that ran 4.2.1 or below.

Two loops disagreed about an empty file. That was the whole bug, and it let anyone upload a PHP file to a site running Elementor Pro 4.2.1 or below.

What the flaw was

Elementor Pro's Forms widget validated uploads in one loop and moved them in another. When the first entry in a multipart upload array came back as "no file", validation returned early instead of carrying on to the later entries. Processing did not stop. A second entry, carrying a PHP file, went past extension and type checks and got written to disk.

Wordfence scores it 9.8 and tracks it as CVE-2026-32475; Patchstack, who published the technical write-up, score the same issue 9.0. Either way it is the shape of bug that turns a contact form into a shell, and Wordfence reported blocking more than 190,000 exploit attempts after disclosure on 19 August 2026.

Elementor Pro 4.2.2, published the same day, is the fix. Elementor free is not affected. The flaw is in the Pro Forms upload field.

What it needed

One thing, and most Elementor Pro sites have it: at least one published page with a Form widget that has a File Upload field. Job applications, support requests, quote forms, anything that takes a document. No unusual setting was required, because the default state of the field was enough.

A site running Elementor Pro with no upload field anywhere was not exposed through this path. That is worth knowing before anyone panics at a client, and worth checking rather than assuming, because forms accumulate quietly over the years a site has been live.

The folder to open

Uploaded files landed in wp-content/uploads/elementor/forms/, named from PHP's uniqid() with whatever extension the attacker chose. So on any site that ran 4.2.1 or below with a form upload field, open that folder once and look for anything that is not a document or image type your forms actually accept. A .php file in there is not ambiguous.

Two follow-ups if you find one. First, the file's timestamp tells you roughly when, which tells you which backup predates it. Second, a dropper that ran can have left an administrator account or other files behind, so check accounts created around that date before calling it done.

One more thing worth fixing whether or not anything turns up: ask your host whether PHP executes under wp-content/uploads. On a server that refuses to run PHP there, the same bug leaves a useless file instead of a shell. Respira's security audit can test this directly by writing one inert file, requesting it, and deleting it, which is the only honest way to know, since the answer lives in server configuration that PHP cannot read.

Across a fleet

The agencies i talk to did not miss this update because they are careless. They missed it on the three sites that are not in the monthly maintenance list, the ones a client set up themselves and handed over.

Respira's WordPress vulnerability scanner compares every plugin and version on every connected site against the Wordfence Intelligence database, refreshed every six hours, so a site still on 4.2.1 shows up without anyone remembering to look. The fix is approval-gated: the agent proposes the update, you approve it, and a second scan produces the receipt.

If you also want your AI assistant to read and edit those Elementor pages rather than only report on them, that is what the Elementor MCP server does: classic widgets and Atomic elements, every edit on a copy first, with undo.

Sources

Checked on 22 September 2026.

Join the conversation

0 comments · Respira account

No comments yet. Be the first to weigh in.

You're not the only one talking to WordPress.

The Respira community is where agency owners debug Divi migrations at 11pm, where vibe coders swap prompts that actually ship, and where the roadmap gets written out loud. Breathe with us.

Lines of code pushed through Respira
17,310,587
Live from the Respira ecosystem · updates as the agent ships