CVE-2025-15703 is a Stored Cross-Site Scripting vulnerability in WP Job Openings before version 4.0.0. The plugin, a job-listing and recruitment tool installed on more than 30,000 sites (it is now distributed on WordPress.org as HireZoot – Job Listings, Career Page & Recruitment Tool), does not sanitize and escape one of its job specification settings — the Icon field — before printing it back on its own settings page. A user with the plugin’s management capability, which is Administrator by default, can store a payload that runs in the browser of any administrator who later opens that page. It matters on WordPress Multisite and on sites with DISALLOW_UNFILTERED_HTML, where administrators are not allowed to post raw HTML. The issue is fixed in 4.0.0.

CVECVE-2025-15703
Plugin VersionWP Job Openings < 4.0.0, fixed in 4.0.0
All Time725 012
Active installations30 000+
Publicly PublishedOctober 10, 2026
Last UpdatedOctober 10, 2026
ResearcherKrugov Artyom
CWECWE-79 Cross-Site Scripting
PoCYes
ExploitNo
Referencehttps://www.cve.org/CVERecord?id=CVE-2025-15703
https://wpscan.com/vulnerability/d973da56-ab33-4a8d-bace-4a5f11442cf1/
Plugin Security Certification by CleanTalkNot safe
Logo of the pluginWP Job Openings plugin logo

Join the community of developers who prioritize security. Highlight your plugin in the WordPress catalog.

PSC by Cleantalk

Timeline

June 27, 2025Plugin testing and vulnerability detection in WP Job Openings were completed.
June 27, 2025The vulnerability report was sent with the PoC, technical description, and recommendations for remediation.
May 6, 2026The vendor released version 4.0.0, the version listed as containing the fix.
October 10, 2026WPScan publicly published the advisory for CVE-2025-15703.

Discovery of the Vulnerability

While auditing the settings of the WP Job Openings plugin, I found that the Job Specifications screen (Job Openings → Settings → Job Specifications) lets a specification carry an Icon value, submitted as the awsm_jobs_filter[0][icon] parameter. The value is saved as typed and later written into an HTML attribute of the icon selector on the same settings page without sanitizing on input or escaping on output. A value that closes the attribute with a quote can therefore add new attributes of its own, including event handlers, and it is stored in the database so it fires every time the page is opened — a persistent (Stored) XSS.

Understanding of Stored Cross-Site Scripting attacks

Stored (persistent) Cross-Site Scripting keeps the attacker’s payload on the server so it is served automatically to whoever opens the affected page. This case needs a high-privilege account, which is why the issue is rated Low (CVSS 3.5): on a standard single site an administrator already holds the unfiltered_html capability and can post raw HTML anyway. The risk becomes real on WordPress Multisite and on sites that set DISALLOW_UNFILTERED_HTML, where administrators do not hold it: missing output escaping lets them bypass that restriction and run JavaScript in the session of other administrators.

The plugin also creates an HR-style role for recruiters. Any user holding the plugin’s management capability, not only full administrators, can reach the vulnerable settings, so the audience able to plant the payload is wider than the word “Admin” suggests.

Exploiting the Stored Cross-Site Scripting Vulnerability

To reproduce the vulnerability on an affected version (below 4.0.0):

  • Use a site where administrators cannot post raw HTML: WordPress Multisite, or a single site with DISALLOW_UNFILTERED_HTML set to true.
  • Log in as an Administrator (or any user with the plugin’s job management capability) and open the Job Openings plugin tab.
  • Go to Settings, then Job Specifications.
  • Insert the XSS payload into the Icon field (the awsm_jobs_filter[0][icon] parameter) and save the settings.
  • Reopen Job Specifications and move the mouse over the rendered element — the payload executes.

PoC:

POC:
Account - Administrator, or any user with the plugin's job management capability, on a site where
administrators cannot post raw HTML (WordPress Multisite, or DISALLOW_UNFILTERED_HTML set to true)

1) Go to the Job Openings plugin tab and open Settings.
2) Go to Job Specifications.
3) Insert the payload below into the Icon field (parameter awsm_jobs_filter[0][icon]) and save the settings:
   123" tabindex=0 onmouseover=alert(888) style=display:block;width:100px;height:100px;background:red; x="
4) Reopen Job Specifications. The payload renders a red box in the icon selector.
5) Move the mouse over the red box: the onmouseover handler executes alert(888).

The payload closes the attribute the stored value is printed into and adds tabindex, onmouseover and style attributes. The style makes the element a 100×100 red box, so there is something to hover over, and alert(888) runs in the context of the admin page. In a real attack the harmless alert() would be replaced with code that creates a rogue administrator or steals the session, and it fires for every administrator who opens the settings page afterwards.

Recommendations for Improved Security

To mitigate CVE-2025-15703:

  • Update the plugin to version 4.0.0 or later; the current release is newer still and is now published as HireZoot.
  • Sanitize specification fields on input and escape them on output with esc_attr() — an icon identifier should be validated against a list of allowed values, not accepted as free text.
  • Do not treat the administrator or HR role as a trust boundary for HTML, especially on Multisite and with DISALLOW_UNFILTERED_HTML.
  • Review who holds the plugin’s management capability and remove it from accounts that do not need it; protect those accounts with 2FA.
  • Implement a strong Content Security Policy (CSP) to block inline JavaScript execution.
  • Deploy a Web Application Firewall to filter XSS payloads before they reach the application.

To prevent this type of attack, follow our methods of XSS prevention.

By addressing Stored XSS vulnerabilities like CVE-2025-15703 early, WordPress site owners and plugin developers can protect administrators and entire networks from account takeover. Stay vigilant, stay secure.

#WordPressSecurity #StoredXSS #WPJobOpenings #WebsiteSafety #StayProtected

Use CleanTalk solutions to improve the security of your website

Krugov Artyom
CVE-2025-15703 – WP Job Openings – Admin+ Stored XSS – POC

Artyom Krugov

Cybersecurity Specialist with 4 years of hands-on experience in web application and WordPress security. Holder of the OSCP+ certification and author of 80+ publicly disclosed CVEs affecting WordPress plugins and themes. Specialized in vulnerability research, penetration testing, website incident response, malware removal, and security hardening of production environments. Experienced in identifying and validating high-impact vulnerabilities in WordPress plugins, themes, and custom web applications, as well as providing practical remediation guidance to improve overall security posture. Strong background in web application security, source code review, vulnerability assessment, exploit validation, and post-compromise recovery of infected websites.

Visit Author's Website

See all posts by krugov-artyom

Leave a Reply

Your email address will not be published. Required fields are marked *