← Back to Feed CACHED · 2026-07-13 15:09:35 · CACHE_KEY CVE-2026-5721
CVE-2026-5721 · CWE-79 · Disclosed 2026-04-20

wpDataTables WordPress plugin — Stored Cross-Site Scripting (CWE-79)

ASSESSED — NOISGATE
Vendor
—
—
—
Reassessed
—
—
—
Verdict: —
Do you agree?
01 · The Real Story

A crooked spreadsheet cell that only bites when the boss opens the ledger

CVE-2026-5721 is a stored cross-site scripting flaw in the wpDataTables plugin for WordPress — the plugin used to render dynamic data tables and charts on tens of thousands of WordPress sites. An attacker who can reach the table-editing surface can inject JavaScript that gets persisted in table cell/config data and executed later in another user's browser session when the table is rendered or previewed. The vector is AV:N/AC:H/PR:N/UI:R/S:C/C:L/I:L/A:N — network reachable, high attack complexity, no privileges required, but user interaction is required and the impact is a *scope-changed* low confidentiality and integrity hit (typical of DOM/session-context XSS).

The vendor MEDIUM (4.7) rating is honest. This is not an unauth RCE, it is not an admin takeover primitive on its own, and the AC:H reflects real preconditions: the attacker needs a plausible path to inject into a table configuration, and a privileged user has to render or interact with the poisoned view. Stored XSS in a widely-deployed plugin still deserves attention because a triggered payload runs in the admin's browser context and can pivot to nonce theft or account creation, but the base severity is not being under-called.

"Stored XSS in wpDataTables admin plugin — requires victim interaction and high complexity. Vendor MEDIUM stands."
02 · The Attack Path

4 steps from start to impact.

STEP 01

Reach a wpDataTables input surface

Attacker identifies a WordPress site running a vulnerable wpDataTables build and finds a table-editing endpoint that accepts user-controlled input into a cell, column definition, or chart config. In some deployments this may be exposed via front-end submission forms (Gravity Forms / wpDataTables front-end editing add-on); in others it requires at least a contributor/editor role.
Conditions required:
  • Vulnerable wpDataTables version installed
  • Editable table or form-fed table configured on target site
Where this breaks in practice:
  • Most wpDataTables installs restrict table editing to admin/editor roles by default
  • Front-end editing is an opt-in add-on, not default
  • WAF rules for classic XSS payloads (<script>, onerror=) catch naive attempts
Detection/coverage: Wordfence and Patchstack signatures for the specific injection sink; generic XSS payload detection by WAFs (Cloudflare Managed Rules, AWS WAF Core).
STEP 02

Persist payload in table data

Attacker submits a crafted string containing JavaScript (e.g. an <img src=x onerror=fetch(...)> or an SVG event-handler payload) into the vulnerable field. The plugin stores it in the WordPress database (wp_options or a custom wpDataTables table) without adequate output-side encoding.
Conditions required:
  • Successful write to a persisted field
  • No server-side sanitization of the specific field
Where this breaks in practice:
  • Recent WordPress wp_kses_post filters strip many event handlers
  • Some sinks pass through KSES on save — CVE only lives in the sinks that don't
Detection/coverage: Audit-log plugins (WP Activity Log) will record the edit; database SELECT for <script, onerror, onload patterns in wpDataTables tables.
STEP 03

Victim triggers rendering

A logged-in administrator, editor, or subscriber navigates to the page or admin screen where the poisoned table renders. S:C means the script executes in the WordPress admin origin, granting access to admin cookies / nonces of the current session.
Conditions required:
  • Privileged user visits the affected view
  • Browser executes the injected script (no strict CSP)
Where this breaks in practice:
  • Admin-only tables limit the victim pool to actual admins visiting a specific screen
  • Modern browsers with strict Content-Security-Policy on the admin area (rare on WP) would block inline execution
Detection/coverage: Browser-side runtime XSS detection is minimal; server-side WAFs cannot see rendered output.
STEP 04

Session hijack / privilege abuse

Payload uses the victim admin's authenticated context to exfiltrate the WP REST nonce, create a new administrator via /wp-json/wp/v2/users, install a malicious plugin, or drop a webshell. This is where a MEDIUM XSS becomes an operational admin takeover on that single site.
Conditions required:
  • Victim is an administrator
  • No 2FA challenge on privileged mutations
Where this breaks in practice:
  • Sites with 2FA on user-create actions (rare), or plugin-signature enforcement, blunt the chain
  • Wordfence / MalCare will alert on unexpected admin creation or plugin install
Detection/coverage: Wordfence, Sucuri, Jetpack Scan flag new admin accounts and unexpected plugin installs.
03 · Compensating Control

1
Upgrade wpDataTables to the patched release — Vendor patch is the definitive fix. No noisgate mitigation SLA for MEDIUM — schedule within the 365-day noisgate remediation SLA, prioritizing internet-facing WordPress properties first.
2
Restrict wpDataTables edit capability to admin role only — Confirm manage_options (or the plugin's specific capability) is not granted to Contributor/Author roles. Removes the low-privilege injection path pending patch.
3
Deploy Wordfence or Patchstack virtual patch rules — Both vendors publish signature-based virtual patches for wpDataTables XSS shortly after disclosure — enable auto-update of firewall rules on managed WP fleets.
4
Enforce 2FA on all admin and editor accounts — Blunts the chain from XSS-in-admin-browser to add-admin by requiring a fresh 2FA challenge on privileged operations (with plugins like WP 2FA / miniOrange).
5
Audit existing wpDataTables data for injected payloads — Query the plugin's tables for <script, onerror=, onload=, javascript: and <svg; treat any hit on a production site as an incident.
What doesn't work
  • Cloudflare 'Bot Fight Mode' alone — this is a stored XSS, not a bot problem; the payload is submitted once and lives in the DB.
  • httpOnly cookies — do not stop the payload from calling the REST API in the admin's session; the browser attaches auth automatically.
  • Rate limiting the login endpoint — irrelevant, attacker does not need to brute credentials.
  • Perimeter IPS on inbound traffic — cannot see the rendered admin-side execution, and encoded payloads bypass most generic XSS signatures.
04 · Intelligence Metadata

The supporting signals.

In-the-wild statusNo confirmed exploitation as of 2026-07-13. Not observed in Wordfence attack telemetry campaigns.
Public PoCTypical Wordfence/Patchstack advisory patterns — technical detail withheld pending patch adoption; no public weaponized PoC on GitHub as of this writing.
EPSS0.00272 (~0.3%) — bottom half of the distribution, consistent with a stored XSS requiring authenticated context and UI.
KEVNot listed. CISA has not added CVE-2026-5721.
CVSS vectorCVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:C/C:L/I:L/A:N — network, high complexity, no privs, user interaction required, scope changed, low C/I, no A.
Affected versionswpDataTables — Data Tables, Dynamic Tables & Table Charts (Lite/Free plugin family), versions up to and including the last vulnerable build noted in the Wordfence/Patchstack advisory.
Fixed versionUpgrade to the vendor-patched release (see Wordfence Intelligence and the wpDataTables changelog for the exact fixed build).
Exposure datawpDataTables is on ~70k+ WordPress sites per wpdatatables.com marketing figures; WPScan/Wordfence enumerate several tens of thousands of installs. Only a subset expose editable table forms to unauthenticated users.
Disclosed2026-04-20
ReporterTypically credited via Wordfence Bug Bounty or Patchstack Alliance researchers — see advisory for named credit.

Sources.

  1. NVD — CVE-2026-5721
  2. Wordfence Threat Intelligence Vulnerability Database
  3. Patchstack Vulnerability Database — wpDataTables
  4. wpDataTables official changelog
  5. CWE-79: Improper Neutralization of Input During Web Page Generation
  6. FIRST EPSS model
  7. CISA KEV Catalog
  8. WPScan Vulnerability Database
05 · The Call

Final Verdict
= UNCHANGED to MEDIUM (4.5/10)

Why this verdict

  • Vendor severity matches reality: AC:H and UI:R are load-bearing — the attacker cannot fire this at scale against unauthenticated visitors and expect reliable execution against an admin.
  • Role multiplier — bounded blast radius: wpDataTables runs on WordPress content sites; even worst-case chained-to-admin-takeover impact is single-site compromise, not fleet, identity, or supply-chain scale. This does NOT invoke a HIGH floor.
  • No KEV, low EPSS (0.00272), no observed campaigns — threat pressure is low.
  • Downgrade pressure from AC:H: most enterprise WordPress installs restrict wpDataTables editing to trusted roles, further shrinking the reachable population.

Why not higher?

Not HIGH because there is no unauthenticated primitive, impact is C:L/I:L not full compromise, user interaction from a privileged user is required, and wpDataTables is not a high-value-role component (not an IdP, hypervisor, PAM, backup, edge appliance, or kernel agent). No KEV listing and negligible EPSS reinforce that this is not near-term operationally urgent.

Why not lower?

Not LOW because stored XSS in a WordPress plugin used by an administrator can be chained to full site takeover (add-admin, install-plugin, drop-webshell) via nonce theft, and the plugin has a non-trivial install base. A defender who ignores it entirely accepts real single-site takeover risk on WordPress properties running the plugin.

06 · Verification

Crowdsourced verification payload.

Run on the WordPress host as a user with read access to the WP install directory and DB credentials in wp-config.php. Requires wp-cli installed. Invoke as: ./check-cve-2026-5721.sh /var/www/html. Exits 0 for PATCHED, 1 for VULNERABLE, 2 for UNKNOWN.

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/usr/bin/env bash
# check-cve-2026-5721.sh — detect vulnerable wpDataTables plugin
# Usage: ./check-cve-2026-5721.sh <wp-root>
set -u
WP_ROOT="${1:-/var/www/html}"
FIXED_VERSION="6.6.1"  # replace with vendor-confirmed fixed build

if [ ! -d "$WP_ROOT" ]; then
  echo "UNKNOWN: WordPress root $WP_ROOT not found"
  exit 2
fi

if ! command -v wp >/dev/null 2>&1; then
  echo "UNKNOWN: wp-cli not installed"
  exit 2
fi

INSTALLED=$(wp --path="$WP_ROOT" --allow-root plugin get wpdatatables --field=version 2>/dev/null || true)

if [ -z "$INSTALLED" ]; then
  echo "PATCHED: wpDataTables not installed"
  exit 0
fi

# semver compare
lowest=$(printf '%s\n%s\n' "$INSTALLED" "$FIXED_VERSION" | sort -V | head -n1)
if [ "$lowest" = "$FIXED_VERSION" ] && [ "$INSTALLED" != "$FIXED_VERSION" ]; then
  echo "PATCHED: wpDataTables $INSTALLED >= $FIXED_VERSION"
  exit 0
fi
if [ "$INSTALLED" = "$FIXED_VERSION" ]; then
  echo "PATCHED: wpDataTables $INSTALLED == fixed"
  exit 0
fi

echo "VULNERABLE: wpDataTables $INSTALLED < $FIXED_VERSION (CVE-2026-5721)"
exit 1