UEditor编辑器任意文件上传漏洞分析
字数 1024 2025-08-20 18:18:24
UEditor编辑器任意文件上传漏洞分析教学文档
漏洞概述
本漏洞存在于UEditor编辑器的文件上传功能中,攻击者可以通过构造特殊的请求绕过安全限制,实现任意文件上传,可能导致服务器被入侵。
漏洞环境
- 受影响组件:UEditor编辑器
- 环境类型:.NET Web应用程序
- 关键目录:
/bin- 包含引用的JSON DLL/App_Code- 包含核心CS文件
漏洞原理分析
1. 上传流程
- 请求首先进入
controller.ashx,调用catchimage动作 - 实例化
UploadHandler类 - 从JSON获取配置信息并传递给类属性
- 执行上传方法
- 对上传文件进行安全检查
2. 漏洞关键点
漏洞主要存在于CrawlerHandler类中:
-
Content-Type绕过:
- 系统仅检查返回文件的
Content-Type头 - 攻击者可伪造
Content-Type: image/png绕过检查
- 系统仅检查返回文件的
-
文件名解析缺陷:
- 使用
System.IO获取文件名 - 解析逻辑存在缺陷:
1.gif?.aspx会被系统视为1.gif,但实际保存时扩展名为.aspx - 攻击者可上传ASPX等脚本文件
- 使用
-
DNS解析检查绕过:
- 系统通过
IsExternalIPAddress方法检查是否为可解析域名 - 此检查可被绕过
- 系统通过
漏洞利用方法
利用POC
<form action="http://target.com/controller.ashx?action=catchimage"
enctype="application/x-www-form-urlencoded" method="POST">
<p>shell addr: <input type="text" name="source[]" /></p>
<input type="submit" value="Submit" />
</form>
利用步骤
- 构造POST请求到
controller.ashx?action=catchimage - 在
source[]参数中提供恶意文件URL - 确保远程服务器返回
Content-Type: image/png头 - 使用特殊文件名格式如
shell.aspx?.jpg绕过扩展名检查
防御措施
-
严格文件类型检查:
- 不仅检查Content-Type,还应检查文件实际内容
- 使用文件头签名验证
-
文件名处理:
- 过滤文件名中的特殊字符(?/#等)
- 重命名上传文件,不使用原始文件名
-
扩展名白名单:
- 只允许特定安全的扩展名
- 禁止执行权限的目录上传脚本文件
-
权限控制:
- 上传目录禁用执行权限
- 对上传功能进行身份验证
-
输入验证:
- 验证URL是否指向允许的域名/IP
- 限制文件来源
参考实现修复
// 改进的文件名处理
string safeFileName = Path.GetFileName(fileName)
.Replace("?", "")
.Replace("#", "")
.Replace("&", "");
// 扩展名检查
string[] allowedExtensions = { ".jpg", ".png", ".gif" };
string ext = Path.GetExtension(safeFileName).ToLower();
if(!allowedExtensions.Contains(ext))
{
throw new Exception("Invalid file extension");
}
// 内容类型验证
if(!IsValidImage(stream))
{
throw new Exception("Invalid image file");
}
总结
该漏洞利用了两个关键缺陷:Content-Type验证不足和文件名解析缺陷。开发人员应实施多层防御策略,包括严格的输入验证、内容检查和安全的文件处理实践,以防止此类漏洞被利用。