审计发现
1. UEditor编辑器上传(核心风险点)
首先给大家奉上泄露的文件目录结构,主要就是以下几个文件
1.1 文件结构
public/static/ueditor/php/ ├── controller.php # 路由入口 ├── action_upload.php # 上传处理 ├── action_crawler.php # 远程图片抓取 ├── action_list.php # 文件列表 ├── Uploader.class.php # 核心上传类 └── config.json # 配置文件1.2 路由入口 - 无条件包含漏洞
$action=$_GET['action'];switch($action){case'uploadimage':case'uploadscrawl':case'uploadvideo':case'uploadfile':$result=include("action_upload.php");break;case'listimage':case'listfile':$result=include("action_list.php");break;case'catchimage':$result=include("action_crawler.php");break;}
漏洞点:
没有白名单验证 $action 的值,直接包含文件,没有检查文件是否存在
即用户控制action → 无验证 → 直接include → 可能导致任意文件包含
1.3 上传处理 - 配置信任漏洞
switch(htmlspecialchars($_GET['action'])){case'uploadimage':$config=array("pathFormat"=>$CONFIG['imagePathFormat'],"maxSize"=>$CONFIG['imageMaxSize'],"allowFiles"=>$CONFIG['imageAllowFiles']);$fieldName=$CONFIG['imageFieldName'];break;case'uploadfile':default:$config=array("pathFormat"=>$CONFIG['filePathFormat'],"maxSize"=>$CONFIG['fileMaxSize'],"allowFiles"=>$CONFIG['fileAllowFiles']);$fieldName=$CONFIG['fileFieldName'];break;}
漏洞点:
1.无条件信任配置文件,不验证配置值是否合法
2.默认分支缺陷:任何未知action都走uploadfile逻辑
即配置文件被篡改 → 白名单包含危险扩展名 → 上传类允许上传危险文件
1.4 核心上传类 - 扩展名校验漏洞
privatefunctioncheckType(){returnin_array($this->getFileExt(),$this->config["allowFiles"]);}privatefunctiongetFileExt(){returnstrtolower(strrchr($this->oriName,'.'));}
漏洞点:仅检查扩展名(strrchr($name, '.'))
- 无 MIME 类型校验
- 无 magic bytes 校验
- 无文件内容检查
- 客户端 JS 校验可完全绕过
即仅检查扩展名 → 可伪造扩展名 → 上传伪装文件 → Web服务器解析执行
整体攻击链分析:
| 步骤 | 代码环节 | 具体行为 | 为什么成功 |
|---|---|---|---|
| 1 | 路由入口 | action=uploadfile进入上传分支 | 没有白名单验证,直接包含 |
| 2 | 上传配置 | 从config.json读取fileAllowFiles | 信任配置,可能包含.jpg |
| 3 | 上传类-扩展名 | getFileExt()返回.jpg | strrchr只取最后一个点 |
| 4 | 上传类-校验 | in_array('.jpg', $allowFiles) | 通过检查(白名单有.jpg) |
| 5 | 保存文件 | 保存为shell.php;.jpg | 未重命名,使用原始文件名 |
| 6 | Web服务器 | Apache解析文件 | 分号被忽略,当作PHP执行 |
其他上传端点
| Action | 功能 | 端点 |
|---|---|---|
uploadimage | 图片上传 | /static/ueditor/php/controller.php?action=uploadimage |
uploadscrawl | 涂鸦上传 | /static/ueditor/php/controller.php?action=uploadscrawl |
uploadvideo | 视频上传 | /static/ueditor/php/controller.php?action=uploadvideo |
uploadfile | 文件上传 | /static/ueditor/php/controller.php?action=uploadfile |
catchimage | 远程图片抓取 | /static/ueditor/php/controller.php?action=catchimage |
一句话总结:
路由入口无条件信任用户输入,配置文件提供可被操纵的白名单,上传类仅做简单的扩展名检查(且提取逻辑存在缺陷),文件未重命名保存,这四个缺陷串联形成了完整的文件上传漏洞链,可上传伪装成图片的Webshell并执行任意代码。
1.5 配置文件
文件类型白名单:
| 类型 | 允许扩展名 |
|---|---|
| 图片 | .png, .jpg, .jpeg, .gif, .bmp |
| 视频 | .flv, .swf, .mkv, .avi, .rm, .rmvb, .mpeg, .mpg, .ogg, .ogv, .mov, .wmv, .mp4, .webm, .mp3, .wav, .mid |
| 文件 | .png, .jpg, .jpeg, .gif, .bmp, .flv, .swf, .mkv, .avi, .rm, .rmvb, .mpeg, .mpg, .ogg, .ogv, .mov, .wmv, .mp4, .webm, .mp3, .wav, .mid, .rar, .zip, .tar, .gz, .7z, .bz2, .cab, .iso, .doc, .docx, .xls, .xlsx, .ppt, .pptx, .pdf, .txt, .md, .xml |