NVD has published CVE-2026-15896, a CVSS 9.1 (CRITICAL) directory traversal vulnerability in the Super Forms – Drag & Drop Form Builder plugin for WordPress. Every version up to and including 6.3.316 is affected. The flaw lives in the plugin's parse_request function and allows an unauthenticated, remote attacker to read arbitrary files from the underlying server — no credentials, no user interaction, no special positioning required.
One note on the public record: some early feed headlines labeled this CVE as a Windows platform issue. That is a misclassification in the source metadata. The affected component is unambiguously the Super Forms WordPress plugin, and the vulnerable code path is platform-agnostic PHP — it impacts WordPress installations on both Linux and Windows hosts. Do not let an inaccurate platform tag in your vuln scanner's feed cause this to fall out of your WordPress triage queue.
Why this matters operationally: the first file every attacker reaches for on a WordPress host is wp-config.php. It contains database credentials, authentication keys, and salts in cleartext. From there, the path to full site compromise — database dump, admin session forgery, webshell upload — is measured in minutes, not days. With a network-reachable, unauthenticated primitive and a default configuration that requires no authentication, this is the kind of bug that gets mass-scanned within hours of public disclosure.
Technical Analysis
Affected Products and Versions
- Product: Super Forms – Drag & Drop Form Builder (WordPress plugin)
- Affected versions: All versions up to and including 6.3.316
- Platforms: Any OS hosting WordPress with the plugin installed (Linux, Windows/IIS)
- CVE / CVSS: CVE-2026-15896 — CVSS 9.1 (CRITICAL), attack vector: NETWORK, unauthenticated
How the Vulnerability Works
The vulnerable component is the plugin's parse_request function, which handles incoming file-related requests — including requests tied to form file uploads and file retrieval. The function fails to properly sanitize user-supplied input used in file path construction. By injecting path traversal sequences (../ and URL-encoded variants such as ..%2f, ..%252f, ....//, or ..\ on Windows hosts), an attacker can escape the intended upload/plugin directory and read any file readable by the web server process account.
The attack chain from a defender's perspective:
- Reconnaissance: Attacker enumerates sites running Super Forms (plugin paths like
/wp-content/plugins/super-forms/are trivially fingerprintable via public assets, version strings in readme.txt, or scanner signatures). - Exploitation: A crafted HTTP request hits the endpoint routed through
parse_request(commonly via/wp-admin/admin-ajax.phpor a plugin-specific handler) with a traversal payload in the file/path parameter. - File read: The server returns the contents of the requested file. High-value targets:
/var/www/html/wp-config.php— DB credentials,AUTH_KEY,SECURE_AUTH_KEY, salts (enables forged session cookies and direct DB access)/etc/passwd(Linux) — user enumeration and a clean PoC signalC:\Windows\win.inior IISweb.config/applicationHost.config(Windows hosts)- Other sites' configs in shared-hosting or multisite environments
- Post-exploitation: DB creds → database exfiltration; auth keys → administrative session forgery → plugin/theme editor webshell upload.
The Authentication Setting Is Not a Fix
This is the detail defenders must internalize. The plugin ships with an optional file_upload_auth setting that defaults to empty — meaning no authentication is required in the default configuration. Enabling this setting gates the vulnerable endpoint behind authentication, which mitigates the unauthenticated attack path. It does not remediate the underlying path traversal. Any authenticated user — including a low-privilege subscriber account on sites with open registration — could still traverse the filesystem. Treat file_upload_auth as a risk-reduction workaround, never as a patch substitute.
Exploitation Status
At the time of writing, there is no confirmed CISA KEV entry for CVE-2026-15896, and no public in-the-wild exploitation campaign has been formally attributed to this CVE. However: the vulnerability class (unauthenticated arbitrary file read in a popular WordPress plugin), the trivial exploitation bar, and the value of wp-config.php make near-term mass scanning a near-certainty. Monitor the CISA KEV catalog and your WAF/IDS telemetry daily. Unauthenticated file-read bugs in WordPress plugins historically move from disclosure to botnet-driven exploitation in under 72 hours.
Detection & Response
The highest-fidelity detection surface is the web access log (Apache, Nginx, or IIS) of your WordPress hosts. Traversal attempts against this plugin produce an unmistakable pattern: requests touching Super Forms endpoints or AJAX actions combined with directory traversal sequences in the query string or POST body. Endpoint telemetry on the web server itself is a secondary surface — a worker process reading files outside the webroot is worth alerting on, but log-based detection is where you will catch this first.
Sigma Rules
---
title: Super Forms Plugin Path Traversal Exploitation Attempt (CVE-2026-15896)
id: 4f8c2e71-9b3a-4d55-8e1f-6a7c9d2e5b01
status: experimental
description: Detects HTTP requests containing directory traversal sequences targeting Super Forms WordPress plugin endpoints, consistent with exploitation of CVE-2026-15896 unauthenticated arbitrary file read via the parse_request function.
references:
- https://nvd.nist.gov/vuln/detail/CVE-2026-15896
- https://attack.mitre.org/techniques/T1190/
author: Security Arsenal
date: 2026/06/09
tags:
- attack.initial_access
- attack.t1190
logsource:
category: webserver
detection:
selection_endpoint:
cs-uri|contains:
- '/wp-content/plugins/super-forms/'
- 'admin-ajax.php'
- '/wp-json/'
selection_traversal:
cs-uri-query|contains:
- '../'
- '..\\'
- '..%2f'
- '..%5c'
- '%2e%2e%2f'
- '%2e%2e/'
- '..%252f'
- '....//'
selection_target:
cs-uri-query|contains:
- 'wp-config'
- 'passwd'
- 'win.ini'
- 'web.config'
condition: selection_endpoint and (selection_traversal or selection_target)
falsepositives:
- Legitimate admin-ajax.php requests do not contain traversal sequences; combined conditions keep noise low
level: critical
---
title: Web Server Worker Process Reading Sensitive Files Outside Webroot
id: 8b1d4f60-2c7e-4a39-b5d8-3e6f1a9c0d42
status: experimental
description: Detects web server worker processes (php-fpm, Apache, Nginx, w3wp.exe) opening sensitive operating system or configuration files, indicating successful arbitrary file read exploitation such as CVE-2026-15896.
references:
- https://nvd.nist.gov/vuln/detail/CVE-2026-15896
- https://attack.mitre.org/techniques/T1190/
author: Security Arsenal
date: 2026/06/09
tags:
- attack.initial_access
- attack.t1190
logsource:
category: file_event
product: linux
detection:
selection_process:
Image|endswith:
- '/php-fpm'
- '/apache2'
- '/httpd'
- '/nginx'
selection_file:
TargetFilename:
- '/etc/passwd'
- '/etc/shadow'
- '/etc/nginx/nginx.conf'
TargetFilename|endswith:
- '/wp-config.php'
- '/.env'
condition: selection_process and selection_file
falsepositives:
- php-fpm legitimately reads wp-config.php during normal page loads; alert on volume anomalies and correlate with inbound traversal requests in web logs
level: high
The second rule has an intentional caveat baked into its false-positive note: wp-config.php is read on every legitimate page load. Do not deploy it as a standalone alert. Use it as a correlation signal — a worker process reading /etc/passwd, /etc/shadow, or .env is never normal, and wp-config.php reads spiking from a single source IP alongside web-log traversal hits is your confirmation of successful exploitation versus scanning noise.
KQL — Microsoft Sentinel
This query assumes your WordPress access logs (Apache/Nginx/IIS) are ingested into Sentinel via the Syslog/CEF connector or a custom log pipeline. It hunts for traversal patterns against WordPress AJAX and plugin endpoints and aggregates by source to separate scanners from one-off probes.
// Hunt for CVE-2026-15896 traversal attempts against Super Forms / WordPress AJAX endpoints
let traversalPatterns = dynamic(["../", "..%2f", "%2e%2e%2f", "%2e%2e/", "..%5c", "..%252f", "....//", "..\\"]);
let targetFiles = dynamic(["wp-config", "passwd", "shadow", "win.ini", "web.config", ".env"]);
union isfuzzy=true
(CommonSecurityLog
| where RequestURL has_any (traversalPatterns) or RequestURL has_any (targetFiles)
| where RequestURL has "admin-ajax.php" or RequestURL has "super-forms" or RequestURL has "wp-json"
| extend Url = RequestURL, SrcIP = SourceIP, Method = RequestMethod, Status = tostring(EventOriginalSeverity)
| project TimeGenerated, SrcIP, Method, Url, Status, DeviceVendor),
(Syslog
| where SyslogMessage has_any (traversalPatterns)
| where SyslogMessage has "admin-ajax.php" or SyslogMessage has "super-forms"
| extend Url = extract(@"GET\s+([^\s]+)", 1, SyslogMessage)
| extend SrcIP = extract(@"^([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})", 1, SyslogMessage)
| project TimeGenerated, SrcIP, Url, SyslogMessage, Computer)
| summarize Requests = count(), DistinctUrls = dcount(Url), SampleUrls = make_set(Url, 5), FirstSeen = min(TimeGenerated), LastSeen = max(TimeGenerated) by SrcIP
| where Requests > 3 or DistinctUrls > 1
| sort by Requests desc
Tune the aggregation thresholds to your baseline. A source IP cycling through multiple traversal encodings (../, then ..%2f, then ..%252f) against admin-ajax.php is an attacker iterating through filter evasion — that pattern is a high-confidence indicator even at low volume.
Velociraptor VQL
If you have Velociraptor deployed on your web servers (or collect their logs into a hunt), this artifact greps the Apache/Nginx access logs for traversal attempts hitting Super Forms or AJAX endpoints, giving you a fleet-wide view of who has been probed and when.
-- Hunt web access logs for CVE-2026-15896 traversal attempts against Super Forms
LET logs = SELECT FullPath FROM glob(globs=['/var/log/apache2/access*.log', '/var/log/nginx/access*.log', '/var/log/httpd/access*.log'])
SELECT FullPath AS LogFile,
Line AS RawRequest,
timestamp(string=parse_string_from_string(string=Line, format='[%d/%b/%Y:%H:%M:%S')) AS ApproxTime
FROM foreach(row=logs,
query={
SELECT FullPath, Line
FROM parse_lines(filename=FullPath, accessor='file')
WHERE Line =~ '(?i)(super-forms|admin-ajax\\.php)'
AND Line =~ '(?i)(\\.\\./|%2e%2e|\\.\\.%2f|%252f|\\.\\.\\\\|wp-config|etc/passwd|win\\.ini)'
})
ORDER BY ApproxTime DESC
LIMIT 500
Adjust the glob paths for your distribution and log rotation scheme. On IIS-hosted WordPress, point the glob at C:/inetpub/logs/LogFiles/W3SVC*/u_ex*.log and adapt the timestamp parsing accordingly.
Response Priorities
If the hunt returns hits:
- Determine success vs. attempt. A
200response with a large response body to a traversal request is a successful read. A400/403/404is an attempt. Pull full request/response pairs if your WAF or reverse proxy retains them. - Assume credential exposure on any successful read of
wp-config.php. Rotate the database password, all WordPress salts and keys (AUTH_KEYthroughNONCE_SALT), and any credentials stored in other readable files. Rotating salts invalidates all active sessions — do it during the response, not after. - Block the source IP at the WAF/edge, but treat IP blocking as containment only — scanners rotate infrastructure constantly.
- Preserve logs before rotation. Apache/Nginx default rotations can overwrite evidence within days on busy sites.
Remediation
Primary Fix: Update the Plugin
All versions up to and including 6.3.316 are vulnerable. Update Super Forms to the latest available release immediately via the WordPress admin dashboard or WP-CLI, and verify the installed version exceeds 6.3.316. Check the plugin's official WordPress.org page and the developer's changelog for the fixed release number, and consult the NVD entry for the authoritative record: https://nvd.nist.gov/vuln/detail/CVE-2026-15896
Interim Mitigations (If Patching Is Not Immediately Possible)
- Enable
file_upload_authin the Super Forms settings. This requires authentication for the vulnerable endpoint, eliminating the unauthenticated attack path. Reiterate: this does not fix the traversal — it raises the bar to any authenticated user. - Deactivate the plugin if it is not business-critical. A deactivated plugin's
parse_requesthandler is not reachable. - WAF / reverse-proxy rule: Block requests to
admin-ajax.phpand/wp-content/plugins/super-forms/*where the query string or POST body contains traversal sequences (../,..%2f,%2e%2e,..%5c,..%252f,....//). ModSecurity's OWASP CRS already covers generic traversal (rule 930xx family) — verify it is in blocking mode, not detection-only, for your WordPress vhosts. - Filesystem hardening: Ensure the web server process account has read access only to what it needs.
wp-config.phpshould be640/400owned by a non-web user where your deployment model allows, and on shared hosts, isolate per-site users. - Move
wp-config.phpone level above the webroot if not already done — WordPress supports this natively and it removes the highest-value file from the directly servable tree.
Verification and Hardening Script
Run this on each WordPress host (requires WP-CLI; adjust WP_PATH per site). It inventories the Super Forms version, enables the authentication setting as a stopgap, checks access logs for exploitation indicators, and verifies wp-config.php permissions.
#!/bin/bash
# CVE-2026-15896 - Super Forms traversal: inventory, stopgap, and log sweep
# Run as a user with WP-CLI access to each WordPress installation.
WP_PATH="/var/www/html"
VULN_MAX="6.3.316"
echo "[+] Checking Super Forms version in $WP_PATH"
SF_VER=$(wp plugin get super-forms --path="$WP_PATH" --field=version --allow-root 2>/dev/null)
if [ -z "$SF_VER" ]; then
echo "[-] Super Forms not installed at $WP_PATH. Nothing to do."
else
echo "[!] Super Forms version: $SF_VER (vulnerable if <= $VULN_MAX)"
# Stopgap: require auth for the vulnerable file handler (does NOT fix traversal)
wp option patch insert super_settings file_upload_auth "true" --path="$WP_PATH" --allow-root 2>/dev/null \
&& echo "[+] file_upload_auth stopgap enabled (interim only - patch still required)"
# Prompt for update
wp plugin update super-forms --path="$WP_PATH" --allow-root --dry-run
fi
echo "[+] Hardening wp-config.php permissions"
[ -f "$WP_PATH/wp-config.php" ] && chmod 640 "$WP_PATH/wp-config.php" && stat -c '%a %U:%G %n' "$WP_PATH/wp-config.php"
echo "[+] Sweeping access logs for traversal attempts (last 7 days)"
for LOG in /var/log/apache2/access*.log /var/log/nginx/access*.log /var/log/httpd/access*.log; do
[ -e "$LOG" ] || continue
grep -Ei 'super-forms|admin-ajax\.php' "$LOG" 2>/dev/null \
| grep -Ei '\.\./|%2e%2e|%252f|\.\.%2f|\.\.\\|wp-config|etc/passwd|win\.ini' \
&& echo "[!] SUSPICIOUS requests found in $LOG — investigate response codes and bodies"
done
echo "[+] Done. Confirm final patched version > $VULN_MAX and rotate credentials if any successful reads are found."
Strategic Recommendations
- Inventory first. Most organizations do not know how many WordPress instances they own — marketing microsites, abandoned campaign pages, and subsidiary blogs are exactly where this gets exploited. Enumerate your external attack surface for
/wp-content/plugins/super-forms/fingerprints this week. - Credential rotation readiness. Pre-stage a runbook for rotating WordPress DB creds and all eight salt/key constants. When an unauthenticated file-read bug hits KEV, you will not have time to write it then.
- Virtual patching at the edge. If you run a WAF (Cloudflare, AWS WAF, ModSecurity, F5), push a virtual patch rule now even if endpoint patching is scheduled — the window between disclosure and mass scanning is the exposure window that matters.
- WordPress hardening baseline. Disable file editing in wp-admin (
DISALLOW_FILE_EDIT), enforce least-privilege DB users (the WordPress DB user does not needDROPorGRANT), and log to a remote SIEM so local log tampering does not blind you post-compromise.
CVE-2026-15896 is a textbook example of why plugin sprawl is the soft underbelly of WordPress security: one third-party component, one missing input-validation check, and your database credentials are on the wire. Patch, hunt, and verify — in that order, starting today.
Related Resources
Security Arsenal Penetration Testing Services AlertMonitor Platform Book a SOC Assessment vulnerability-management Intel Hub
Is your security operations ready?
Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.