CVE-2025-28092
Executive Summary
CVE-2025-28092 identifies a Server-Side Request Forgery (SSRF) vulnerability in ShopXO v6.4.0, specifically within the image upload function. This flaw allows an unauthenticated attacker to induce the server to make arbitrary HTTP requests to internal or external resources, potentially leading to internal network reconnaissance, data exfiltration, or further exploitation of internal services. The vulnerability is currently unpatched, and no public proof-of-concept (PoC) or exploit code has been released. The EPSS score is 0.0%, indicating low exploitation activity in the wild at the time of analysis.
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
While a CVSS vector is not provided, based on the nature of SSRF vulnerabilities in web applications, a reasonable assessment is:
- Attack Vector (AV): Network (N) – Exploitable remotely.
- Attack Complexity (AC): Low (L) – No special conditions required.
- Privileges Required (PR): None (N) – No authentication needed.
- User Interaction (UI): None (N) – No user action required.
- Scope (S): Changed (C) – The vulnerable component impacts resources beyond its original scope (e.g., internal network).
- Confidentiality (C): High (H) – Can read internal files or service responses.
- Integrity (I): Low (L) – May allow limited modification of internal state.
- Availability (A): Low (L) – Could cause denial of service to internal services.
Estimated CVSS v3.1 Score: 9.1 (Critical)
Threat Level: Critical – SSRF vulnerabilities can lead to full internal network compromise, especially in cloud environments where metadata services are accessible.
Deep Dive & Mechanics
The vulnerability resides in the image upload functionality of ShopXO v6.4.0. When a user uploads an image, the application processes the file URL or path. Due to insufficient validation, an attacker can supply a malicious URL (e.g., http://169.254.169.254/latest/meta-data/) instead of a legitimate image. The server then fetches this URL, allowing the attacker to:
- Access internal services: Reach services on the internal network (e.g., databases, admin panels).
- Read cloud metadata: In cloud environments (AWS, GCP, Azure), access instance metadata endpoints.
- Port scan internal hosts: Use the server as a proxy to scan internal IP ranges.
- Bypass firewalls: Exploit the trust relationship between the server and internal resources.
The attack flow:
- Attacker identifies the image upload endpoint (e.g.,
/index.php?s=admin/upload/index). - Attacker crafts a request with a URL parameter pointing to an internal resource.
- Server fetches the URL and returns the response (or error messages) to the attacker.
- Attacker iterates through internal IPs and ports to map the network.
Vulnerable vs. Patched Code
Since no patch is available, the vulnerable code is presumed to be in the image upload handler. A typical vulnerable pattern:
Vulnerable Code (PHP):
$url = $_POST['image_url'];
$imageContent = file_get_contents($url);
// Save image...
Patched Code (Hypothetical):
$url = $_POST['image_url'];
$parsedUrl = parse_url($url);
$host = $parsedUrl['host'];
// Validate host against whitelist
$allowedHosts = ['img.example.com', 'cdn.example.com'];
if (!in_array($host, $allowedHosts)) {
die('Invalid image source');
}
// Additionally, validate that the response is an image
$imageContent = file_get_contents($url);
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mimeType = finfo_buffer($finfo, $imageContent);
if (strpos($mimeType, 'image/') !== 0) {
die('Not an image');
}
Exploitation & Lab Setup
Red Team
Lab Setup:
- Target: ShopXO v6.4.0 running on a local server (e.g.,
http://target.local). - Attacker machine: Kali Linux with Burp Suite or curl.
- Internal service: A simple HTTP server on
192.168.1.100:8080to simulate an internal resource.
Exploitation Steps:
- Identify the upload endpoint. Use Burp Suite to intercept a normal image upload.
- Modify the request to point to an internal resource:
POST /index.php?s=admin/upload/index HTTP/1.1 Host: target.local Content-Type: application/x-www-form-urlencoded image_url=http://192.168.1.100:8080/internal-data - Observe the response. If the server returns the content of
internal-data, SSRF is confirmed. - For cloud metadata:
image_url=http://169.254.169.254/latest/meta-data/ - Use a tool like
ssrfmapto automate scanning:python3 ssrfmap.py -r request.txt -p image_url -m readfiles,portscan
Blue Team
Detection:
- Monitor outbound HTTP requests from the web server to unexpected IPs (especially private ranges: 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 169.254.0.0/16).
- Alert on requests to cloud metadata IPs (169.254.169.254, 100.100.100.200 for Alibaba).
- Log all image upload requests and validate the
image_urlparameter.
Mitigation:
- Implement a whitelist of allowed image sources (e.g., only trusted CDNs).
- Disable the
allow_url_fopenPHP directive if not needed. - Use a proxy that blocks requests to private IP ranges.
- Apply input validation to ensure the URL points to an image (check MIME type).
Indicators of Compromise (IOCs)
- Network:
- Outbound HTTP requests from the web server to private IP ranges (10.x.x.x, 172.16-31.x.x, 192.168.x.x).
- Requests to cloud metadata endpoints (169.254.169.254, 100.100.100.200).
- Unusual User-Agent strings in outbound requests (e.g., empty or generic).
- Logs:
- Web server logs showing
image_urlparameter with internal IPs. - Error logs containing
file_get_contentsfailures for internal hosts.
- Web server logs showing
- File System:
- Unexpected files in the upload directory that are not images (e.g., HTML, JSON).
Detection Engineering
YARA Rule
rule CVE_2025_28092_SSRF_ShopXO {
meta:
description = "Detects SSRF attempts targeting internal IPs in ShopXO image upload"
author = "Valters IT"
date = "2025-04-10"
reference = "CVE-2025-28092"
strings:
$url_pattern = /image_url=http:\/\/(10\.\d{1,3}\.\d{1,3}\.\d{1,3}|172\.(1[6-9]|2[0-9]|3[01])\.\d{1,3}\.\d{1,3}|192\.168\.\d{1,3}\.\d{1,3}|169\.254\.\d{1,3}\.\d{1,3})/
$metadata = "169.254.169.254"
$internal_ip = /(10\.\d{1,3}\.\d{1,3}\.\d{1,3}|172\.(1[6-9]|2[0-9]|3[01])\.\d{1,3}\.\d{1,3}|192\.168\.\d{1,3}\.\d{1,3})/
condition:
$url_pattern or ($metadata and $internal_ip)
}
Sigma Rule
title: CVE-2025-28092 SSRF Attempt via ShopXO Image Upload
id: 7a8b9c0d-1e2f-3a4b-5c6d-7e8f9a0b1c2d
status: experimental
description: Detects HTTP requests to private IP ranges from ShopXO web server
author: Valters IT
date: 2025-04-10
logsource:
category: webserver
product: apache
service: accesslog
detection:
selection:
cs-uri-query|contains: "image_url=http://"
private_ip:
cs-uri-query|contains:
- "10."
- "172.16."
- "172.17."
- "172.18."
- "172.19."
- "172.20."
- "172.21."
- "172.22."
- "172.23."
- "172.24."
- "172.25."
- "172.26."
- "172.27."
- "172.28."
- "172.29."
- "172.30."
- "172.31."
- "192.168."
- "169.254."
condition: selection and private_ip
falsepositives:
- Legitimate internal image sources (if any)
level: high
Suricata Rule
alert http $HOME_NET any -> $EXTERNAL_NET any (
msg:"CVE-2025-28092 SSRF Attempt - ShopXO Image Upload to Private IP";
flow:to_server,established;
content:"image_url=http://"; http_client_body;
pcre:"/image_url=http:\/\/(10\.\d{1,3}\.\d{1,3}\.\d{1,3}|172\.(1[6-9]|2[0-9]|3[01])\.\d{1,3}\.\d{1,3}|192\.168\.\d{1,3}\.\d{1,3}|169\.254\.\d{1,3}\.\d{1,3})/Ri";
classtype:attempted-recon;
sid:10000001;
rev:1;
)
Remediation & Mitigation
Immediate Actions:
- Disable image URL upload if not critical. Modify the application to only accept local file uploads.
- Apply input validation: Ensure the
image_urlparameter only allows whitelisted domains (e.g.,img.example.com). - Restrict outbound traffic: Use a firewall or web application firewall (WAF) to block outbound requests to private IP ranges from the web server.
- Monitor logs: Actively monitor for SSRF patterns as described in IOCs.
Long-term Fix:
- Wait for an official patch from ShopXO. If none is forthcoming, consider forking the code and applying the hypothetical patch described above.
- Upgrade to a newer version if available.
- Implement a Content Security Policy (CSP) that restricts image sources.
Workaround:
- Modify the PHP configuration to disable
allow_url_fopen:allow_url_fopen = Off - If the application requires fetching remote images, use a dedicated proxy that validates URLs.
Valters IT
Securing Digital Frontiers