Skip to content

安全加固: 为 UEditor 上传增加 MIME 校验、内容扫描和 .htaccess 防护#60

Closed
nilm61 wants to merge 1 commit into
pbootcmspro:masterfrom
nilm61:fix/ueditor-upload
Closed

安全加固: 为 UEditor 上传增加 MIME 校验、内容扫描和 .htaccess 防护#60
nilm61 wants to merge 1 commit into
pbootcmspro:masterfrom
nilm61:fix/ueditor-upload

Conversation

@nilm61

@nilm61 nilm61 commented Jun 28, 2026

Copy link
Copy Markdown

说明:

## 问题描述
UEditor 编辑器的上传功能存在多个安全隐患:
- 仅检查文件扩展名,未验证文件真实内容
- 未校验 MIME 类型(存在扩展名伪造风险)
- 未扫描上传文件是否包含 PHP 代码(图片马攻击)
- 未对上传目录进行 PHP 执行防护
- 未校验最终上传路径是否合法

攻击者在获取后台权限后,可利用编辑器上传 webshell。

## 修复内容

### Uploader.class.php
- 新增 `checkMimeType()`:使用 `exif_imagetype()``finfo_file()` 验证文件真实 MIME 类型
- 新增 `checkFileContent()`:扫描上传文件内容,检测 PHP 标签(`<?php``<?=` 等)和危险函数调用
- 新增 `createHtaccess()`:上传成功后自动创建 `.htaccess`,禁止该目录执行 PHP
-`upFile()``upBase64()``saveRemote()` 三个上传入口均应用安全检查

### action_upload.php
- 上传后二次验证扩展名白名单(防止大小写绕过、双扩展名攻击)
- 验证保存路径必须在允许的 upload 目录下(防止路径遍历)
- 发现恶意文件立即删除

## 测试验证
| 攻击类型 | 修复前 | 修复后 |
|---------|-------|-------|
| 图片马(含 PHP 代码的图片) | 上传成功,可执行 PHP | 内容扫描拦截,删除文件 |
| MIME 类型伪造 | 仅扩展名检查 | exif_imagetype + finfo_file 双重验证 |
| 双扩展名攻击 | 可能通过 | 白名单二次验证拦截 |
| 路径遍历上传 | 可能覆盖任意文件 | 路径白名单校验拦截 |
| 上传目录 PHP 执行 | 取决于服务器配置 | .htaccess 自动阻止 |

Uploader.class.php:
- 新增 checkMimeType() 使用 exif_imagetype() 和 finfo_file() 验证文件真实 MIME 类型
- 新增 checkFileContent() 扫描上传文件中的 PHP 标签和 webshell 模式
- 新增 createHtaccess() 生成 .htaccess 禁止上传目录执行 PHP
- 对 upFile()、upBase64()、saveRemote() 三个入口均应用安全检查

action_upload.php:
- 上传后二次验证扩展名白名单
- 验证保存路径必须在允许的 upload 目录下
- 发现恶意文件立即删除

修复 CWE-434(任意文件上传)和 CWE-22(路径遍历)漏洞
基于 PbootCMS 3.2.15 安全性评估报告
@github-actions github-actions Bot added bug Something isn't working needs review Pull request is ready for maintainer review labels Jun 28, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working needs review Pull request is ready for maintainer review

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants