审计发现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){caseuploadimage:caseuploadscrawl:caseuploadvideo:caseuploadfile:$resultinclude(action_upload.php);break;caselistimage:caselistfile:$resultinclude(action_list.php);break;casecatchimage:$resultinclude(action_crawler.php);break;}漏洞点没有白名单验证 $action 的值直接包含文件没有检查文件是否存在即用户控制action → 无验证 → 直接include → 可能导致任意文件包含1.3 上传处理 - 配置信任漏洞switch(htmlspecialchars($_GET[action])){caseuploadimage:$configarray(pathFormat$CONFIG[imagePathFormat],maxSize$CONFIG[imageMaxSize],allowFiles$CONFIG[imageAllowFiles]);$fieldName$CONFIG[imageFieldName];break;caseuploadfile:default:$configarray(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路由入口actionuploadfile进入上传分支没有白名单验证直接包含2上传配置从config.json读取fileAllowFiles信任配置可能包含.jpg3上传类-扩展名getFileExt()返回.jpgstrrchr只取最后一个点4上传类-校验in_array(.jpg, $allowFiles)通过检查白名单有.jpg5保存文件保存为shell.php;.jpg未重命名使用原始文件名6Web服务器Apache解析文件分号被忽略当作PHP执行其他上传端点Action功能端点uploadimage图片上传/static/ueditor/php/controller.php?actionuploadimageuploadscrawl涂鸦上传/static/ueditor/php/controller.php?actionuploadscrawluploadvideo视频上传/static/ueditor/php/controller.php?actionuploadvideouploadfile文件上传/static/ueditor/php/controller.php?actionuploadfilecatchimage远程图片抓取/static/ueditor/php/controller.php?actioncatchimage一句话总结路由入口无条件信任用户输入配置文件提供可被操纵的白名单上传类仅做简单的扩展名检查且提取逻辑存在缺陷文件未重命名保存这四个缺陷串联形成了完整的文件上传漏洞链可上传伪装成图片的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经过几番周折也是理清楚了最后也就简单两步上传打了个xss