← Back to Feed CACHED · 2026-05-17 09:42:19 · cache_key CVE-2025-29912
CVE-2024-3200 · CWE-89 · Disclosed 2024-06-01

The wpForo Forum plugin for WordPress is vulnerable to SQL Injection via the 'slug' attribute of the…

ASSESSED — NOISGATE V0.5
Vendor
Reassessed
Verdict:
01 · The Real Story

This is a sharp knife locked in the break room, not a bomb wired to the lobby door

CVE-2024-3200 is an SQL injection flaw in the wpForo shortcode's slug attribute in wpForo Forum for WordPress <= 2.3.3. The vulnerable path lets an attacker who already has WordPress contributor-level access or higher feed crafted input into a query that is not safely prepared, enabling database reads and potentially broader follow-on abuse depending on what secrets are stored in that WordPress database. The upstream fix landed in 2.3.4.

The vendor's 9.9 CRITICAL score overstates the operational risk for most enterprises. The decisive friction is not the SQL syntax; it's the attacker position requirement: this is not unauthenticated internet spray, it is post-auth web app abuse against a plugin with about 20,000+ active installs, and many real deployments do not hand out contributor rights to strangers. NVD's later 6.5 MEDIUM is closer to reality because the most reliable outcome is data extraction, not turnkey site destruction.

"Real bug, wrong label: this is post-auth SQLi on a 20k-install plugin, not a fleet-wide fire drill."
02 · The Attack Path

4 steps from start to impact.

STEP 01

Obtain a contributor-capable WordPress account

The attacker first needs a valid WordPress account with at least contributor permissions, or another role allowed to create content that renders shortcodes. In practice this usually comes from credential stuffing, phishing, reused passwords, compromised editorial users, or a site that intentionally grants elevated content roles to community members.
Conditions required:
  • Target runs WordPress with the wpForo plugin installed
  • Attacker has valid credentials with contributor-or-higher capability
  • The role can create or modify content that will execute the shortcode path
Where this breaks in practice:
  • Most enterprises do not expose contributor accounts to anonymous internet users
  • Self-registration commonly maps to subscriber, not contributor
  • MFA, SSO, and admin approval workflows often block this step
Detection/coverage: Identity controls and WordPress audit plugins can usually see the login, but vuln scanners cannot prove exploitability from the outside unless they also know role assignments.
STEP 02

Render a malicious wpforo shortcode

Using the stolen or legitimate account, the attacker places a crafted [wpforo slug="..."] shortcode into content and triggers rendering through preview or published content. The vulnerable code path processes the attacker-controlled slug value and passes it into an unsafe SQL construction.
Conditions required:
  • Shortcodes are enabled in the target content path
  • The attacker can preview or publish content that invokes wpforo
  • The site uses a vulnerable wpForo version <= 2.3.3
Where this breaks in practice:
  • Contributor content often requires editorial approval before broad publication
  • Some sites restrict where forum shortcodes can be used
  • Caching, sanitization plugins, or content workflow can reduce easy triggering
Detection/coverage: Version-based scanners can flag wpforo <= 2.3.3; content security products rarely understand malicious shortcode parameters well enough to stop this reliably.
STEP 03

Exploit SQL injection to read application data

Once the shortcode is rendered, the attacker uses SQLi techniques to alter the backend query and extract database content. The most realistic impact is exposure of WordPress data such as user information, password hashes, email addresses, salts, forum content, or plugin configuration data that can assist later compromise.
Conditions required:
  • Database account used by WordPress can read the relevant tables
  • The injected query can return data through the application response
Where this breaks in practice:
  • Not every deployment exposes rich query output back to the browser
  • WAFs, SQL error suppression, and logging noise can slow iterative exploitation
  • Time-to-value is lower than RCE; attackers still need follow-on use of stolen data
Detection/coverage: WAFs and database monitoring may catch obvious UNION/time-based payloads, but coverage is inconsistent for authenticated traffic coming from a real user session.
STEP 04

Pivot from data theft to broader site compromise

If the attacker recovers password hashes, API keys, reset tokens, or plugin secrets, they may pivot into account takeover or administrative actions. That is an important downstream risk, but it is not guaranteed by the bug itself; the vulnerability's native value is primarily confidentiality impact.
Conditions required:
  • Useful secrets exist in the database
  • The attacker can crack, replay, or operationalize what was stolen
Where this breaks in practice:
  • Modern password hashing and MFA blunt immediate account takeover
  • Many sites separate database compromise from direct OS-level execution
  • Blast radius is usually a single WordPress site or tenant, not broad enterprise lateral movement
Detection/coverage: Follow-on misuse may be more visible than the original SQLi: account resets, privilege changes, suspicious plugin edits, and anomalous admin logins are stronger signals.
03 · Intelligence Metadata

The supporting signals.

In-the-wild statusNo public active exploitation evidence found in the sources reviewed, and not listed in the CISA KEV catalog.
PoC availabilityThe exploit path is publicly described by Wordfence and a public WordPress patch diff reference exists, but I did not find evidence of a widely adopted weaponized repo in the reviewed sources.
EPSSEPSS is 0.01029 (~1.03% probability over 30 days), roughly 76.7th percentile per OpenCVE, CVE Details, and the user-supplied intel.
KEV statusNo KEV listing. That matters: for internet-facing WordPress flaws, real exploitation usually shows up fast when the bug is truly hot.
CVSS splitThere is a major scoring disagreement: Wordfence 9.9 CRITICAL vs NVD 6.5 MEDIUM (NVD). The NVD vector removes integrity/availability impact and treats this as a narrower data-exposure problem.
Affected versionsAll versions up to and including 2.3.3 are affected; NVD also models the CPE as versions before 2.3.4.
Fixed versionsUpstream fix is wpForo 2.3.4. For WordPress plugin consumers there is no meaningful distro backport story to rely on; you need the plugin update itself.
Exposure populationWordPress.org currently reports 20,000+ active installations for wpForo (plugin page). That is real exposure, but it is nowhere near mass-market WordPress plugin scale.
DisclosurePublicly disclosed 2024-06-01; researcher credited as Krzysztof Zając / CERT PL in Wordfence and Patchstack.
Detection coverageAsset and vuln scanners are good at version detection for wpforo <= 2.3.3; they are much worse at proving role-based reachability or whether contributors can actually trigger the shortcode path.
04 · The Call

noisgate verdict.

Final Verdict
DOWNGRADED to MEDIUM (6.1/10)

The single biggest severity reducer is the authenticated contributor requirement, which means the attacker is already past your front door or benefits from a permissive registration model. This is a serious WordPress data-exposure bug, but it is not the kind of unauthenticated edge exploit that justifies CRITICAL handling across a 10,000-host estate.

HIGH Affected version range and fixed version
HIGH Authentication/role prerequisite materially reduces exposed population
MEDIUM Practical exploit outcomes beyond data theft

Why this verdict

  • Downward pressure: requires authenticated contributor+ access — this is not unauthenticated remote exploitation; it assumes prior compromise, weak role assignment, or an intentionally open content workflow.
  • Downward pressure: exposed population is narrower than the CVSS suggests — wpForo shows about 20,000+ installs, and only a subset of those also grant contributors the ability to hit this shortcode path.
  • Downward pressure: likely impact is confidentiality-first — NVD's 6.5 MEDIUM vector better matches the most dependable outcome: database read/exfiltration rather than direct integrity/availability takeover.
  • Upward pressure: internet-facing app and low exploit complexity once prerequisites are met — if an attacker already has the right WordPress role, exploitation is straightforward and can expose high-value secrets.
  • Upward pressure: WordPress secrets often chain well — password hashes, salts, plugin tokens, and email data can enable follow-on account takeover or content abuse.

Why not higher?

Because the prerequisite stack compounds hard: internet-facing WordPress is not enough; the attacker also needs valid credentials, the right role, and a renderable shortcode path. There is also no KEV listing and no strong public evidence of large-scale exploitation pressure, so treating this as CRITICAL would blur the line between pre-auth edge risk and post-auth application abuse.

Why not lower?

Because this is still SQL injection in a public web application, not a cosmetic bug. Once the attacker has the required role, the path to database exposure is short, and WordPress databases often contain enough secrets to turn a 'read-only' web bug into materially useful compromise.

05 · Compensating Control

What to do — in priority order.

  1. Restrict contributor issuance — Audit WordPress role assignments and remove unnecessary contributor or higher privileges on sites running wpForo. This directly attacks the main exploit prerequisite and should be completed within the MEDIUM-severity decision window by prioritizing immediately where roles are internet-reachable, even though there is no formal mitigation SLA for MEDIUM.
  2. Force MFA on WordPress logins — Require MFA for all editorial and administrative WordPress accounts, especially any account able to create content or manage forum pages. This reduces the most realistic attacker path—credential theft—and should be deployed as a durable control while you work through remediation.
  3. Disable unneeded self-registration and content preview paths — If a site does not need public account creation or user-authored shortcode content, turn those off. This shrinks the reachable population materially and is the cleanest temporary control where patching must be staged.
  4. Monitor shortcode-bearing content changes — Alert on new or modified posts/pages containing [wpforo and correlate with non-admin users. This will not block exploitation, but it gives defenders a cheap tripwire for the exact abuse path.
  5. Tune WAF and DB logging for authenticated SQLi — Focus signatures and anomaly rules on authenticated requests hitting forum/post rendering endpoints with suspicious quote, UNION, comment, or timing patterns. It is not perfect, but it raises attacker cost and may catch iterative testing before large exfiltration.
What doesn't work
  • Generic perimeter blocking alone doesn't help; the attack uses valid authenticated web traffic over normal WordPress routes.
  • Relying on low EPSS as a pass is a mistake; EPSS measures population-level exploitation likelihood, not whether your specific forum with weak roles is easy prey.
  • Assuming subscriber-only public registration makes you safe can be false comfort if attackers can phish or reuse credentials from a legitimate contributor/editor.
06 · Verification

Crowdsourced verification payload.

Run this on the WordPress host or on a mounted backup of the web root. Invoke it as bash check-wpforo-cve-2024-3200.sh /var/www/html (replace with your WordPress root). It needs read access to the plugin directory; root is not required unless your web files are permission-restricted.

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/usr/bin/env bash
# check-wpforo-cve-2024-3200.sh
# Detects whether a local WordPress installation has a vulnerable wpForo version.
# Output: VULNERABLE / PATCHED / UNKNOWN
# Exit codes: 0=PATCHED, 1=VULNERABLE, 2=UNKNOWN, 3=USAGE

set -u

if [ "$#" -ne 1 ]; then
  echo "Usage: $0 /path/to/wordpress_root"
  exit 3
fi

WP_ROOT="$1"
PLUGIN_DIR="$WP_ROOT/wp-content/plugins/wpforo"
README_FILE="$PLUGIN_DIR/readme.txt"
MAIN_FILE="$PLUGIN_DIR/wpforo.php"
VERSION=""

if [ ! -d "$PLUGIN_DIR" ]; then
  echo "UNKNOWN - wpForo plugin directory not found at $PLUGIN_DIR"
  exit 2
fi

# Try to read Stable tag from readme.txt first
if [ -f "$README_FILE" ]; then
  VERSION=$(grep -iE '^Stable tag:' "$README_FILE" 2>/dev/null | head -n1 | sed -E 's/^Stable tag:[[:space:]]*//I' | tr -d '\r')
fi

# Fallback to Version header in main plugin file
if [ -z "$VERSION" ] && [ -f "$MAIN_FILE" ]; then
  VERSION=$(grep -iE '^[[:space:]]*Version:' "$MAIN_FILE" 2>/dev/null | head -n1 | sed -E 's/^[[:space:]]*Version:[[:space:]]*//I' | tr -d '\r')
fi

if [ -z "$VERSION" ]; then
  echo "UNKNOWN - could not determine wpForo version from $README_FILE or $MAIN_FILE"
  exit 2
fi

# Normalize common suffixes, keeping only the leading numeric version for comparison.
NORM_VERSION=$(printf '%s' "$VERSION" | sed -E 's/^([0-9]+(\.[0-9]+){0,3}).*/\1/')

if [ -z "$NORM_VERSION" ]; then
  echo "UNKNOWN - parsed version is empty (raw version: $VERSION)"
  exit 2
fi

verlte() {
  [ "$1" = "$2" ] && return 0
  [ "$(printf '%s\n%s\n' "$1" "$2" | sort -V | head -n1)" = "$1" ]
}

if verlte "$NORM_VERSION" "2.3.3"; then
  echo "VULNERABLE - wpForo version $NORM_VERSION detected (affected: <= 2.3.3, fixed: 2.3.4)"
  exit 1
fi

if [ "$NORM_VERSION" = "2.3.4" ] || ! verlte "$NORM_VERSION" "2.3.3"; then
  echo "PATCHED - wpForo version $NORM_VERSION detected"
  exit 0
fi

echo "UNKNOWN - unable to classify version $NORM_VERSION"
exit 2
07 · Bottom Line

If you remember one thing.

TL;DR
Monday morning: identify every WordPress site running wpForo <= 2.3.3, then sort by whether they expose internet login, allow self-registration, or have non-staff contributor/editor accounts. This is MEDIUM, so there is no noisgate mitigation SLA — go straight to the 365-day remediation window; however, high-exposure sites should still get immediate role hardening and MFA while you patch. Apply the plugin update to 2.3.4+ within the noisgate remediation SLA of <= 365 days, but do not let that long window become an excuse to ignore the handful of externally reachable community sites where contributor access actually exists.

Sources

  1. NVD CVE-2024-3200
  2. Wordfence advisory
  3. Patchstack advisory
  4. WordPress.org wpForo plugin page
  5. CISA Known Exploited Vulnerabilities catalog
  6. OpenCVE record
  7. CVE Details record
Peer Review

What defenders are saying.

Submit a review attribution: handle + country only
0 flags selected · stored anonymously
Validation Results

Crowdsourced verification outputs.

Results submitted by users who ran the verification payload against their environment.