CVE-2025-13383
Executive Summary
CVE-2025-13383 is a Stored Cross-Site Scripting (XSS) vulnerability in the Job Board by BestWebSoft plugin for WordPress, affecting all versions up to and including 1.2.1. The vulnerability arises from the plugin storing the entire unsanitized $_GET superglobal array into the database via update_user_meta() when users save search results. This stored data is later output without proper escaping, allowing unauthenticated attackers to inject arbitrary web scripts. The attack requires user interaction (tricking a user into performing a search and saving the results), but once stored, the malicious script executes whenever the victim accesses the saved search or views their profile. The CVSS score is 6.1 (Medium), and no official patch has been released as of the latest analysis.
This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.
No signup required
Supply Chain & Package Security
This vulnerability affects a WordPress plugin distributed through the official WordPress plugin repository and third-party marketplaces. Since the plugin is part of the WordPress ecosystem, any site running the vulnerable version is at risk. The lack of a patch means site administrators must rely on manual mitigation or removal of the plugin. The plugin’s update mechanism does not currently provide a fix, making this a supply chain risk for all users of the Job Board plugin.
CVSS Breakdown & Threat Level
- CVSS Score: 6.1 (Medium)
- Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N
- Attack Vector (AV): Network – The vulnerability can be exploited remotely.
- Attack Complexity (AC): Low – No special conditions are required.
- Privileges Required (PR): None – Unauthenticated attackers can trigger the vulnerability.
- User Interaction (UI): Required – The victim must perform a search and save the results.
- Scope (S): Changed – The injected script can affect other components (e.g., user profiles).
- Confidentiality (C): Low – Limited data exposure possible.
- Integrity (I): Low – Script injection can modify content.
- Availability (A): None – No direct impact on availability.
Threat Level: Medium. The need for user interaction reduces the immediate risk, but the stored nature of the XSS means a single successful trick can lead to persistent compromise of user sessions and data.
Deep Dive & Mechanics
The vulnerability is rooted in the plugin’s handling of search result saving. When a user performs a job search and saves the results, the plugin uses update_user_meta() to store the entire $_GET superglobal array into the user’s metadata. This array contains all query parameters from the URL, including any malicious JavaScript payloads an attacker may have injected. Later, when the user views their saved search or profile, the plugin outputs this stored data without proper escaping (e.g., without using esc_html() or wp_kses()), allowing the injected script to execute in the browser.
Key Points:
- The
$_GETarray is stored as-is, without sanitization. - The output occurs on pages like the user’s profile or saved search results.
- The attack is unauthenticated, but requires the victim to be tricked into clicking a crafted link and then saving the search results.
- The stored XSS persists until the user deletes the saved search or the metadata is cleared.
Vulnerable vs. Patched Code
Vulnerable Code (version <= 1.2.1):
// In the plugin's save search function
update_user_meta( $user_id, 'saved_search', $_GET );
// In the output function
$saved_search = get_user_meta( $user_id, 'saved_search', true );
echo $saved_search['search_term']; // No escaping
Patched Code (hypothetical fix):
// Sanitize input before storing
$sanitized_get = array_map( 'sanitize_text_field', $_GET );
update_user_meta( $user_id, 'saved_search', $sanitized_get );
// Escape output
$saved_search = get_user_meta( $user_id, 'saved_search', true );
echo esc_html( $saved_search['search_term'] );
The fix involves sanitizing the $_GET array with sanitize_text_field() before storage and escaping all output with esc_html().
Exploitation & Lab Setup
Red Team (Attack Simulation)
Prerequisites:
- A WordPress site with the Job Board plugin (version <= 1.2.1) installed and active.
- A victim user who is logged in and willing to click a crafted link.
Exploit Steps:
- Craft a malicious URL containing a JavaScript payload in a query parameter, e.g.:
http://target-site.com/job-board/?search_term=<script>alert('XSS')</script> - Trick the victim into clicking this link (e.g., via phishing email or social engineering).
- The victim performs the search and saves the results (e.g., by clicking a "Save Search" button).
- The plugin stores the entire
$_GETarray, including the payload, into the user’s metadata. - When the victim later views their saved search or profile, the script executes.
Example Payload:
http://target-site.com/job-board/?search_term=<img src=x onerror=alert(document.cookie)>
Blue Team (Defense & Detection)
Detection:
- Monitor for unusual query parameters containing
<script>,<img>, or other HTML tags in the Job Board plugin’s search functionality. - Look for
update_user_meta()calls with unsanitized$_GETdata in the plugin’s code. - Use web application firewalls (WAF) to block common XSS payloads in query strings.
Mitigation:
- Disable or remove the Job Board plugin until a patch is available.
- Implement a custom filter to sanitize
$_GETdata before it reaches the plugin. - Educate users about phishing links and the risks of saving search results from untrusted URLs.
Indicators of Compromise (IOCs)
- URL Patterns: Requests to
/job-board/with query parameters containing<script>,<img>,onerror,onload, or other event handlers. - Database Entries: User meta entries with key
saved_searchcontaining HTML or JavaScript in any field. - Logs: Access logs showing unusual query strings with encoded or raw XSS payloads.
- Network Traffic: Outbound connections from the victim’s browser to attacker-controlled domains (if the payload exfiltrates data).
Detection Engineering
YARA Rule
rule CVE_2025_13383_Stored_XSS {
meta:
description = "Detects stored XSS payloads in WordPress user meta for Job Board plugin"
author = "Valters IT"
date = "2025-04-10"
reference = "CVE-2025-13383"
strings:
$meta_key = "saved_search"
$xss_payload = /<[^>]*script[^>]*>/
$xss_event = /on\w+\s*=\s*['\"][^'\"]*['\"]/
condition:
$meta_key and ($xss_payload or $xss_event)
}
Sigma Rule
title: CVE-2025-13383 Stored XSS in Job Board Plugin
id: 8a3f7c2e-1b4d-4f9a-8c6e-5d2f1a3b7c9e
status: experimental
description: Detects potential XSS attempts targeting the Job Board plugin by BestWebSoft
author: Valters IT
date: 2025-04-10
logsource:
category: webserver
product: apache
detection:
selection:
cs-method: 'GET'
cs-uri-query|contains:
- '<script'
- '<img'
- 'onerror'
- 'onload'
- 'onmouseover'
condition: selection
falsepositives:
- Legitimate use of HTML in search terms (unlikely)
level: high
Suricata Rule
alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"CVE-2025-13383 Stored XSS Attempt"; flow:to_server,established; content:"/job-board/"; http_uri; pcre:"/(<script|<img|onerror|onload|onmouseover)/i"; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Disable the plugin: Deactivate and remove the Job Board plugin from all WordPress installations until a patch is released.
- Sanitize existing data: If the plugin must remain active, manually sanitize all existing
saved_searchuser meta entries using a database query:UPDATE wp_usermeta SET meta_value = REPLACE(meta_value, '<script>', '') WHERE meta_key = 'saved_search'; - Implement WAF rules: Block query parameters containing common XSS patterns.
Long-Term Fix:
- The vendor (BestWebSoft) must release a patched version that sanitizes
$_GETinput and escapes output. Until then, consider using an alternative job board plugin with active security maintenance.
Workaround:
- Add a custom filter to the theme’s
functions.phpto sanitize$_GETbefore the plugin processes it:add_filter( 'query_vars', function( $vars ) { foreach ( $vars as $key => $value ) { $vars[$key] = sanitize_text_field( $value ); } return $vars; });
Valters IT
Securing Digital Frontiers
What is this? Security researchers use these exact search queries on Shodan.io (a search engine for internet-connected devices) to find vulnerable systems globally. You can copy these dorks to see if your organization's IP space is exposed.
💣 PoC CODE AVAILABLE
Exploit code for this CVE is tracked in our database.
Access poc_code via API Pro.