wordpress评论插件wpDiscuz任意文件上传漏洞分析
字数 1217 2025-08-20 18:17:31
WordPress评论插件wpDiscuz任意文件上传漏洞分析
漏洞概述
wpDiscuz是WordPress平台上一款流行的评论插件,在7.0.5版本之前存在一个严重的任意文件上传漏洞(CVE-2020-24148)。该漏洞允许攻击者绕过文件类型检查,上传恶意PHP文件到服务器,导致远程代码执行(RCE)。
漏洞影响版本
- wpDiscuz 7.0.0至7.0.4版本
- WordPress 5.4.1及以下版本(与插件配合使用时)
漏洞原理分析
漏洞触发点
漏洞位于插件的文件上传功能中,具体路径为:
/wp-admin/admin-ajax.php?action=wmuUploadFiles
关键问题
-
文件类型验证缺陷:
- 插件使用
getMimeType()方法根据文件内容获取MIME类型,而不是通过文件扩展名判断 - 仅检查MIME类型是否在允许列表中(
$this->options->content["wmuMimeTypes"]) - 允许的MIME类型仅限于几种常见图片格式:
image/jpeg,image/png等
- 插件使用
-
验证绕过:
- 攻击者可以构造一个包含有效图片头的PHP文件
- 文件头部添加图片标识(如
GIF89a)后,getMimeType()会返回图片MIME类型 - 通过验证后,插件会保存原始文件内容,包括后续的PHP代码
-
缺乏扩展名检查:
- 保存文件时未验证文件扩展名
- 攻击者可上传
.php文件或之后修改扩展名
漏洞复现步骤
环境准备
- PHP 5.6.40
- MySQL 5.7.26
- WordPress 5.4.1
- wpDiscuz 7.0.3
攻击过程
-
构造恶意文件:
GIF89a <?php phpinfo(); ?> -
通过评论区的图片上传功能上传该文件
-
上传请求发送到:
/wp-admin/admin-ajax.php?action=wmuUploadFiles -
服务器返回上传文件的路径
-
访问上传的PHP文件执行代码
检测方法
手动检测
-
检查网页源代码中是否包含wpDiscuz标识:
wpdiscuz/themes/default/style.css?ver=[版本号] -
检查版本号:
- 7.0.4及以下版本存在漏洞
- 版本号格式:
X.X.X,如7.0.3
自动化检测脚本
import requests
import re
def check_wpdiscuz_vuln(url):
try:
res = requests.get(url, headers={"User-Agent": "Mozilla/5.0"})
# 检查wpDiscuz标识
version_match = re.search(r"wpdiscuz/themes/default/style\.css\?ver=(.*?)'", res.text)
if not version_match:
return False, "未检测到wpDiscuz插件"
version = version_match.group(1)
vers = version.split('.')
# 检查版本是否在受影响范围内
if len(vers) == 3:
if int(vers[0]) == 7 and int(vers[2]) <= 4:
return True, f"存在漏洞,wpDiscuz版本为 {version}"
return False, f"未检测到漏洞,wpDiscuz版本为 {version}"
except Exception as e:
return False, f"检测过程中出错: {str(e)}"
修复方案
-
官方修复:
- 升级到wpDiscuz 7.0.5或更高版本
-
临时缓解措施:
- 禁用wpDiscuz插件的文件上传功能
- 在服务器端限制上传目录的PHP执行权限
- 添加文件扩展名白名单验证
深入技术细节
漏洞代码分析
-
入口点:
add_action('wp_ajax_wmuUploadFiles', array(&$this, 'uploadFiles')); add_action('wp_ajax_nopriv_wmuUploadFiles', array(&$this, 'uploadFiles')); -
文件类型检查:
$mimeType = $this->getMimeType($file['tmp_name']); if (!$this->isAllowedFileType($mimeType)) { wp_send_json_error('wrong_file_type'); } -
允许的MIME类型:
$defaultOptions[self::TAB_CONTENT]["wmuMimeTypes"] = array( "image/jpeg", "image/png", "image/gif", "image/bmp", "image/tiff", "image/x-icon" ); -
文件保存:
move_uploaded_file($file['tmp_name'], $dirPath . $fileName);
防御建议
-
输入验证:
- 同时验证文件内容和扩展名
- 使用严格的白名单机制
-
文件处理:
- 对上传文件进行重命名
- 存储上传文件时去除可能执行的权限
-
服务器配置:
- 限制上传目录的PHP执行权限
- 定期审计上传目录内容
-
安全开发:
- 遵循最小权限原则
- 实施深度防御策略
总结
wpDiscuz文件上传漏洞是一个典型的文件类型验证不严导致的安全问题,强调了在文件上传功能中实施多层防御的重要性。开发者应始终验证文件内容和扩展名,并对上传文件进行适当的安全处理。