Summary
CVE-2026-19513 is an unauthenticated arbitrary file upload vulnerability in the Gravity Forms plugin for WordPress, affecting all versions up to and including 3.0.2. The flaw resides in the GFAsyncUpload::upload() function and, on servers that do not restrict script execution in the uploads directory, can lead to remote code execution; on other configurations it can result in stored cross-site scripting. The issue carries a CVSS v3.1 base score of 8.1 (High).
Technical details
- Root cause: Insufficient validation in
GFAsyncUpload::upload()allows confusion between public form "state" URL hashes and chunk continuation hashes, combined with unvalidated temporary filenames. - Trigger conditions: A public-facing form must include a multi-file File Upload field; no authentication is required to exploit it.
- Attack vector: Network — an attacker submits crafted chunked upload requests to a public form, reusing state hashes as chunk hashes to write PNG/PDF polyglot files with
.phpor.htmlextensions into the temporary upload directory. - Impact: On servers lacking
.htaccess-style execution protection (e.g., NGINX configurations without equivalent hardening), this can lead to remote code execution; on servers where the uploaded file cannot execute, it can result in stored cross-site scripting.
Affected software
- Gravity Forms (WordPress plugin) — all versions up to and including 3.0.2
Severity
- CVSS v3.1 Base Score: 8.1 (High)
- Vector:
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H
Mitigation and recommended actions
- Immediate: Upgrade Gravity Forms to version 3.0.3 or later, which contains security fixes for this issue.
- If patching is delayed: Ensure the web server blocks execution of scripts (e.g.,
.php,.html) within the WordPress uploads/temporary upload directories, and restrict or monitor public forms that use multi-file File Upload fields until patched.
How IONIX identifies potentially affected assets
IONIX matches the following signals against data already collected when it crawled the asset; identifying the technology sends no request beyond that crawl.
- Raw response body:
<div class="gform_wrapper,<div class="gform_body,<ul class="gform_fields,<link href="wp-content/plugins/gravityforms/css/ - URL of a loaded script:
/wp-content/plugins/gravityforms/js/*.js?ver=<version>

