Skip to main content

GeoDirectory CVE-2026-93897

| EUVDEUVD-2026-86533 MEDIUM
Cross-site Scripting (XSS) (CWE-79)
2026-09-25 Wordfence GHSA-hg79-3mhg-pxqx
6.4
CVSS 3.1 · Vendor: Wordfence
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Register subscriber-level account
  2. Delivery
    Submit listing via geodir_save_post AJAX
  3. Exploit
    Store entity-encoded payload in text custom field
  4. Execution
    Bypass strpos() tag-strip on save
  5. Persist
    Victim views injected listing page
  6. Impact
    Script executes in victim browser

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization Output encoding, context-aware escaping
MITRE ATT&CK

2 techniques across 2 tactics: Initial Access, Execution

The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up.

Exploitation Conditions

Requires an authenticated account of at least subscriber level on a site running GeoDirectory <=2.8.181, plus the ability to save a listing carrying a text-type custom field (e.g., 'phone') through the AJAX geodir_save_post endpoint. The specific technique is submitting entity-encoded angle brackets (&lt;img src=x onerror=alert(1)&gt;) so the payload evades the plugin's strpos()-gated tag-stripping and is stored, then executes when any user renders the affected page. Limiting factors: an account is needed (PR:L), and the payload only fires when a victim views the injected listing (execution deferred to page render). Practical risk rises sharply on the common configuration where the site permits open user/lister self-registration, making the required subscriber account trivial to obtain.

Impact

This is a genuine but moderate-severity issue, not a top-tier emergency. The provided CVSS 3.1 vector (AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:L/A:N = 6.4) accurately reflects a stored XSS: network-reachable and low-complexity, but gated by authentication (PR:L requires at least subscriber-level access) with a scope change (S:C) because injected script executes in the browsers of other users/visitors who view the page. Impact is limited to C:L/I:L with no availability impact, consistent with typical XSS. No EPSS score, no CISA KEV listing, and no public POC were supplied in the intelligence, so exploitation status is 'no public exploit identified at time of analysis.' The technical writeup is unusually detailed (naming the geodir_save_post AJAX endpoint and the entity-encoded-angle-bracket bypass of the strpos()-gated tag-strip), which lowers the bar for a researcher to reproduce, but that is not the same as active exploitation. There is a mild real-world amplifier: many GeoDirectory deployments allow open user registration so listers can submit business entries, meaning the required subscriber account is often trivially self-obtainable - this raises practical risk closer to unauthenticated than the PR:L metric alone implies. No signals conflict; the main gap is the absence of EPSS/KEV/POC data to gauge exploitation likelihood. Net: patch in the normal cycle, prioritize on sites with open registration.

Exploit ScenarioDerived

An attacker registers a subscriber (or contributor/lister) account on a GeoDirectory-powered site, then submits or edits a listing, placing an entity-encoded payload such as &lt;img src=x onerror=alert(1)&gt; into a text custom field like 'phone' via the geodir_save_post AJAX endpoint; the encoding slips past the plugin's strpos()-based tag-stripping check and is stored. When any visitor or administrator later views that listing page, the script executes in their browser, enabling session/cookie theft or admin-context actions. No public POC is referenced, but the advisory documents the exact bypass technique.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
No patch listed yet 0.2% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Sep 25, 2026

Stored cross-site scripting in the GeoDirectory WordPress business-directory and classified-listings plugin (all versions up to and including 2.8.181) lets an attacker with only a subscriber-level account plant arbitrary JavaScript that runs in the browser of any user who later views the injected listing. The payload is submitted through the AJAX geodir_save_post endpoint into a text-type custom field such as 'phone', using entity-encoded angle brackets to defeat the plugin's strpos()-gated tag-stripping check, and the assessed CVSS 3.1 vector (AV:N/AC:L/PR:L/UI:N/S:C, 6.4) reflects a scope change with limited confidentiality and integrity impact and no availability impact. There is no confirmed active exploitation (the issue is not in CISA KEV) and no public exploit code identified at time of analysis; practical risk rises sharply on sites that permit open user or lister self-registration, because obtaining the required subscriber account then becomes trivial, and impact is deferred until a victim renders the poisoned page.

RemediationAI

Upstream fix available (changeset 3705730 in the WordPress.org plugin Trac, referenced at https://plugins.trac.wordpress.org/changeset?reponame=&old=3705730%40geodirectory&new=3705730%40geodirectory); a specific released patched version was not independently confirmed from the supplied data, so administrators should update the plugin to the newest version published after 2.8.181 and verify the change is present rather than assuming the current install is fixed. Because patching may lag on managed hosts, compensating controls are worthwhile: the single most effective measure is to close the account prerequisite by disabling open self-registration and front-end listing submission for untrusted roles (Administrators > Settings > General 'Anyone can register' off, and restricting GeoDirectory submission to vetted roles), accepting the loss of community-submitted listings as the trade-off; next, remove or restrict access to text-type custom fields such as 'phone' for non-privileged roles, which reduces attack surface but degrades the listing form for legitimate users; require moderation/approval of every new or edited listing, which does not stop storage of the payload but prevents it from being rendered to the public until reviewed; and add a web application firewall or reverse-proxy rule that rejects or re-encodes requests to the geodir_save_post AJAX endpoint containing entity-encoded markup (&lt;, &#60;, or URL-encoded equivalents) in custom-field parameters, noting such rules can produce false positives on benign text and need tuning. Finally, since the payload executes only on render, deploying a restrictive Content-Security-Policy on listing pages can neutralize execution of injected inline scripts as a stopgap, though CSP rollout may break legitimate themes and third-party scripts. No vendor-released patch version is asserted here; consult the Wordfence advisory link above for the vendor's current fix guidance.

Affected VersionsENISA

GeoDirectory – WP Business Directory Plugin and Classified Listings Directory 0 ≤2.8.181

Affected Packages

euvd geodirectory_wp_business_directory_plugin_and_classified_listings_directory no fix

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in euvd

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

This is a classic CWE-79 improper-neutralization issue in a WordPress plugin rather than in WordPress core. GeoDirectory registers custom post types for business listings and lets site owners define custom fields, including free-text fields such as a phone number; values for those fields are written by the front-end AJAX action geodir_save_post and persisted as post meta, then echoed back when a listing page or directory view is rendered. The vulnerability chain spans several plugin files: input handling and the tag-stripping guard around includes/post-functions.php lines 1347 and 1803, normalization/formatting in includes/formatting-functions.php line 56, and the AJAX save path in includes/class-geodir-ajax.php line 821. The sanitization check is gated on a strpos() search for literal angle brackets, so a payload submitted in entity-encoded form such as &lt;img src=x onerror=alert(1)&gt; contains no literal '<' character, passes the strip check, is stored verbatim, and is reconstituted into executable markup when the stored value is output without adequate escaping. The affected component is the plugin distributed under the CPE cpe:2.3:a:paoltaia:geodirectory_-_wp_business_directory_plugin_and_classified_listings_directory, and the vulnerable code paths were published by Wordfence with direct links to the 2.8.181 tagged source, which is what makes the evasion technique reproducible for defenders writing detection rules.

Know when Wordpress Plugin gets its next vulnerability

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

Vendor (Wordfence) PRIMARY 6.4 MEDIUM
AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:L/A:N
vuln.today AI 6.4 MEDIUM

Network-reachable stored XSS needing a low-privilege (subscriber) account, so PR:L; scope changes (S:C) as script runs in other users' browsers with limited C/I and no availability impact.

3.1 AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:L/A:N
4.0 AV:N/AC:L/AT:N/PR:L/UI:N/VC:N/VI:N/VA:N/SC:L/SI:L/SA:N

Primary rating from Vendor (Wordfence).

CVSS VectorVendor: Wordfence

Attack Vector
Network
Attack Complexity
Low
Privileges Required
Low
User Interaction
None
Scope
Changed
Confidentiality
Low
Integrity
Low
Availability
None

DescriptionCVE.org

The GeoDirectory - WP Business Directory Plugin and Classified Listings Directory plugin for WordPress is vulnerable to Stored Cross-Site Scripting via Text-type Custom Field (e.g., 'phone') in all versions up to, and including, 2.8.181 due to insufficient input sanitization and output escaping. This makes it possible for authenticated attackers, with subscriber-level access and above, to inject arbitrary web scripts in pages that will execute whenever a user accesses an injected page. The payload must be stored in a text-type custom field (such as a phone field) via the AJAX geodir_save_post endpoint, using entity-encoded angle brackets (e.g., &lt;img src=x onerror=alert(1)&gt;) to bypass the strpos()-gated tag-stripping check.

Threat Intelligence Overview

EPSS Score
0.2%
Top 89% exploitable
Prevalence
Medium
popular WordPress business-directory plugin, tens of thousands of installs
Data Quality
3 sources
Confidence: Low

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity MEDIUM
CISA KEV No
Public POC No
EPSS 0.2%
Patch available No
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation
None
System Exposure· derived
Open
Automatable
No
Human Impact· derived
Medium
Technical Impact
Partial

Priority Score

32
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +32
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Cross-Site Scripting occurs when an application accepts untrusted data and sends it to a web browser without proper validation or encoding.

CVE-2023-6553 CRITICAL POC
9.8 Dec 15

The Backup Migration plugin for WordPress is vulnerable to Remote Code Execution in all versions up to, and including, 1

CVE-2024-5084 CRITICAL POC
9.8 May 23

The Hash Form - Drag & Drop Form Builder plugin for WordPress is vulnerable to arbitrary file uploads due to missing fil

CVE-2024-44000 CRITICAL POC
9.8 Oct 20

Authentication bypass in the LiteSpeed Cache WordPress plugin (versions prior to 6.5.0.1) allows unauthenticated remote

CVE-2020-36847 CRITICAL POC
9.8 Jul 12

The Simple File List plugin for WordPress through version 4.2.2 contains an unauthenticated remote code execution vulner

CVE-2025-27007 CRITICAL POC
9.8 May 01

The SureTriggers WordPress plugin through version 1.0.82 contains a privilege escalation vulnerability that allows unaut

CVE-2016-1209 CRITICAL POC
9.8 May 14

The Ninja Forms plugin before 2.9.42.1 for WordPress allows remote attackers to conduct PHP object injection attacks via

CVE-2024-4443 CRITICAL POC
9.8 May 22

The Business Directory Plugin - Easy Listing Directories for WordPress plugin for WordPress is vulnerable to time-based

CVE-2024-1698 CRITICAL POC
9.8 Feb 27

SQL injection in the NotificationX WordPress plugin (versions up to and including 2.8.2) allows unauthenticated remote a

CVE-2023-6875 CRITICAL POC
9.8 Jan 11

The POST SMTP Mailer - Email log, Delivery Failure Notifications and Best Mail SMTP for WordPress plugin for WordPress i

CVE-2024-1512 CRITICAL POC
9.8 Feb 17

The MasterStudy LMS WordPress Plugin - for Online Courses and Education plugin for WordPress is vulnerable to union base

CVE-2024-4295 CRITICAL POC
9.8 Jun 05

The Email Subscribers by Icegram Express plugin for WordPress is vulnerable to SQL Injection via the ‘hash’ parameter in

CVE-2024-50498 CRITICAL POC
10.0 Oct 28

Remote code execution in the WP Query Console WordPress plugin (versions up to and including 1.0) by Ajit Bohra allows u

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy