CVE-2025-14627
Executive Summary
CVE-2025-14627 is a Server-Side Request Forgery (SSRF) vulnerability in the WP Import – Ultimate CSV XML Importer for WordPress plugin, affecting all versions up to and including 7.35. The flaw resides in the upload_function() method, where the plugin fails to re-validate the final destination URL after following Bitly shortlink redirects. While the initial URL is validated using wp_http_validate_url(), the unshorten_bitly_url() function follows redirects to arbitrary internal endpoints without re-validation. This allows authenticated attackers with Contributor-level access or higher to force the server to make HTTP requests to internal systems, including localhost, private IP ranges, and cloud metadata services (e.g., 169.254.169.254), potentially exposing sensitive internal data.
This vulnerability is specific to the WordPress ecosystem and does not involve Apache or Nginx misconfigurations. The EPSS score is 0.0%, indicating low exploitation likelihood in the wild, but the risk to internal infrastructure is significant.
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 in a WordPress plugin distributed via the official WordPress plugin repository. No NPM, PyPI, Go, or Ruby packages are involved. The plugin is not open-source on GitHub, and no OSV patch data is available. Users should monitor the plugin’s update channel for a patched version.
CVSS Breakdown & Threat Level
- CVSS Score: 6.4 (Medium)
- Vector: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:N/A:N
- Attack Vector: Network
- Attack Complexity: Low
- Privileges Required: Low (Contributor-level or higher)
- User Interaction: None
- Scope: Changed (impact on internal resources)
- Confidentiality: Low (limited to internal network reconnaissance)
- Integrity: None
- Availability: None
Threat Level: Medium. While the CVSS score is moderate, the SSRF can be chained with other vulnerabilities (e.g., accessing cloud metadata to steal credentials) to escalate impact.
Deep Dive & Mechanics
The vulnerability is in the upload_function() method of the WP Import plugin. The plugin allows users to import CSV/XML files from remote URLs. When a Bitly shortlink is provided, the unshorten_bitly_url() function follows HTTP redirects to resolve the final URL. The critical flaw is that after the redirect chain, the final URL is not validated against the same security checks as the initial URL.
Key Code Flow:
- User provides a URL (e.g.,
https://bit.ly/abc123). wp_http_validate_url()validates the initial URL (passes because it’s a valid external URL).unshorten_bitly_url()follows redirects to the final destination (e.g.,http://169.254.169.254/latest/meta-data/).- The final URL is used directly without re-validation, allowing SSRF.
Impact:
- Access to internal services (e.g., Redis, MySQL, internal APIs).
- Cloud metadata endpoints (AWS, GCP, Azure) to retrieve IAM credentials.
- Port scanning of internal network.
Vulnerable vs. Patched Code
Since no patch is available, the vulnerable code is described conceptually:
Vulnerable Code (wp-import-ultimate-csv-importer.php, lines ~1200-1250):
function upload_function($url) {
if (wp_http_validate_url($url)) {
if (strpos($url, 'bit.ly') !== false) {
$final_url = $this->unshorten_bitly_url($url);
// No re-validation of $final_url
$response = wp_remote_get($final_url);
}
}
}
Patched Code (hypothetical):
function upload_function($url) {
if (wp_http_validate_url($url)) {
if (strpos($url, 'bit.ly') !== false) {
$final_url = $this->unshorten_bitly_url($url);
// Re-validate the final URL
if (!wp_http_validate_url($final_url)) {
return new WP_Error('ssrf_blocked', 'Invalid final URL');
}
$response = wp_remote_get($final_url);
}
}
}
Exploitation & Lab Setup
Red Team
Prerequisites:
- WordPress site with WP Import plugin <= 7.35.
- Contributor-level account or higher.
- A Bitly shortlink that redirects to an internal endpoint.
Exploitation Steps:
- Create a Bitly shortlink that redirects to an internal IP (e.g.,
http://169.254.169.254/latest/meta-data/). - Log in to WordPress as a Contributor.
- Navigate to WP Import → Import from URL.
- Enter the Bitly shortlink.
- The plugin will follow the redirect and fetch the internal resource.
- The response (e.g., cloud metadata) will be displayed or stored in the import log.
Example Payload:
- Bitly shortlink:
https://bit.ly/3xample→ redirects tohttp://169.254.169.254/latest/meta-data/iam/security-credentials/admin
Lab Setup:
- Use a local WordPress instance with Docker.
- Set up a simple HTTP server on
127.0.0.1:8080to simulate internal service. - Create a Bitly shortlink pointing to
http://127.0.0.1:8080/secret.
Blue Team
Detection:
- Monitor outbound HTTP requests from the WordPress server to internal IPs (e.g., 10.x.x.x, 172.16.x.x, 192.168.x.x, 169.254.x.x).
- Look for requests to cloud metadata endpoints (169.254.169.254).
- Check WordPress access logs for
POSTrequests to/wp-admin/admin-ajax.phpwith parameters containingbit.ly.
Hunting Queries:
- Search for
bit.lyin WordPress options or post meta. - Monitor for unusual DNS lookups to internal IPs.
Indicators of Compromise (IOCs)
- Network IOCs:
- Outbound HTTP requests to internal IPs (e.g., 10.0.0.1, 192.168.1.1, 169.254.169.254).
- DNS queries for
bit.lyfollowed by connections to internal IPs.
- File IOCs:
- Log entries in
/var/log/apache2/access.logor/var/log/nginx/access.logshowing requests towp-import-ultimate-csv-importerwithbit.lyURLs.
- Log entries in
- Process IOCs:
wp_remote_get()calls to internal IPs in PHP error logs.
Detection Engineering
YARA Rule
rule CVE_2025_14627_SSRF {
meta:
description = "Detects SSRF exploitation attempts via Bitly shortlinks in WP Import plugin"
author = "Valters IT"
date = "2025-04-10"
reference = "CVE-2025-14627"
strings:
$bitly = "bit.ly" nocase
$internal_ip = /(127\.0\.0\.1|10\.\d{1,3}\.\d{1,3}\.\d{1,3}|172\.(1[6-9]|2\d|3[01])\.\d{1,3}\.\d{1,3}|192\.168\.\d{1,3}\.\d{1,3}|169\.254\.\d{1,3}\.\d{1,3})/
$wp_import = "wp-import-ultimate-csv-importer" nocase
condition:
$bitly and $internal_ip and $wp_import
}
Sigma Rule
title: CVE-2025-14627 SSRF via Bitly Shortlinks in WP Import
id: 8a4b3c2d-1e5f-4a7b-9c8d-0e1f2a3b4c5d
status: experimental
description: Detects SSRF attempts using Bitly shortlinks in WP Import plugin
author: Valters IT
date: 2025-04-10
logsource:
category: webserver
product: apache
detection:
selection:
cs-method: 'POST'
cs-uri-query|contains: 'wp-import-ultimate-csv-importer'
cs-uri-query|contains: 'bit.ly'
condition: selection
falsepositives:
- Legitimate use of Bitly shortlinks for importing public files
level: high
Suricata Rule
alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"CVE-2025-14627 WP Import SSRF via Bitly"; flow:to_server,established; content:"POST"; http_method; content:"wp-import-ultimate-csv-importer"; http_uri; content:"bit.ly"; http_uri; classtype:attempted-recon; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Disable the WP Import plugin until a patch is released.
- If the plugin must remain active, restrict Contributor-level access to trusted users only.
- Implement a web application firewall (WAF) rule to block requests containing
bit.lyin the import URL parameter.
Long-term Fix:
- Apply the vendor patch when available (monitor WordPress plugin updates).
- Modify the plugin code to re-validate the final URL after redirects (see patched code example).
Network Mitigations:
- Use network segmentation to prevent the WordPress server from accessing internal IP ranges.
- Block outbound traffic to cloud metadata endpoints (169.254.169.254) at the firewall level.
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.