As a WordPress security specialist at WP-Firewall, I want to walk you through the recent vulnerability discovered in the "Sell BTC – Cryptocurrency Selling Calculator" plugin (≤ 1.5). This vulnerability allows unauthenticated attackers to store JavaScript payloads via an AJAX action called orderform_data, which can later execute in the context of users visiting pages where that data is rendered — a classic stored XSS scenario.
This post covers the technical details, risk assessment, immediate mitigations (including a ready-to-deploy WAF rule), recovery steps if you suspect compromise, and long-term hardening. I’ll also explain how WP-Firewall’s free plan can protect your site right away while you apply the plugin update.
TL;DR (If you only do one thing)
Update the Sell BTC plugin to version 1.6 immediately (this is the definitive fix).
If you cannot update right away, block or mitigate the vulnerable AJAX action (orderform_data) at the firewall level — a sample rule is provided below.
Hunt your database and logs for injected scripts or suspicious HTML fragments and clean or restore from a clean backup.
Enable runtime protection (WAF), scanning, and hardening — WP-Firewall’s free plan can provide those protections while you update.
What happened (quick technical summary)
The plugin exposed an AJAX endpoint handling the orderform_data action without sufficient input validation, sanitization, or authorization checks.
An unauthenticated attacker could send malicious payloads (e.g., <script></script>, or more practical payloads) as field values in requests to the orderform_data AJAX action.
The plugin persisted this payload to the database (stored XSS). When that stored value is later output onto a page without proper escaping, the browser executes the injected JavaScript in the context of the site.
The vulnerability was assigned CVE-2025-14554 and is fixed in version 1.6.
Why this matters — real-world impact
Stored XSS can be used to:
Steal authentication cookies or session tokens (leading to account takeover).
Perform actions on behalf of an administrative user (if the payload triggers when an admin views the page).
Inject cryptojacking, phishing forms, or content defacement that harms visitors and site reputation.
Plant persistent backdoors — e.g., uploading additional malicious JavaScript that persists and evades simple cleanup.
Pivot to other parts of the site (e.g., call internal AJAX endpoints that require logged-in context).
Even though the initial attack is unauthenticated, the real danger is the payload being executed in another user’s browser — possibly an administrator.
Who is at risk
Sites running the vulnerable plugin (versions ≤ 1.5).
Sites where plugin output is displayed to administrators or visitors without escaping.
If you host multiple WordPress sites, treat this as a high-priority remediation.
Reproduction (high level)
An attacker sends an HTTP POST to admin-ajax.php like:
POST /wp-admin/admin-ajax.php
Content-Type: application/x-www-form-urlencoded
action=orderform_data&field_name=<script></script>&other=...
If the plugin stores field_name and later outputs it in an HTML page as-is or with insufficient escaping, the script runs in the visitor’s browser.
Note: I won’t provide a copy-paste exploit payload for ethical and safety reasons, but the above illustrates the vector.
Immediate actions (step-by-step)
Update the plugin to version 1.6 right now. This releases a permanent fix in the plugin code.
If your site is managed by someone else, contact them and insist on the update.
If you cannot update immediately:
Block requests to the vulnerable AJAX action at the edge (WAF) — see sample rules below.
Restrict access to admin-ajax.php so that only known origins can use it for that specific action.
Disable the plugin temporarily until you can update.
Scan for injected content:
Search the database for suspicious tokens: <script, onerror=, javascript:, document.cookie, common obfuscated patterns.
Search in wp_posts, wp_postmeta, wp_options, and any plugin-specific tables that may store form submissions.
Review access logs for unusual POSTs to admin-ajax.php and any requests containing suspicious characters.
Rotate admin credentials if you find evidence of admin-side interaction after the vulnerability was introduced.
Monitor and quarantine suspicious accounts.
WP-Firewall mitigation rule (sample)
Below is a generic WAF rule concept you can apply if your firewall supports custom rules (most modern WAFs do). This rule blocks POST requests to admin-ajax.php where action=orderform_data and the request body contains script-like payloads.
Note: Adapt the syntax to your firewall engine — examples are illustrative and intentionally conservative.