某.net程序文件写入漏洞分析
字数 1962 2025-08-18 17:33:44
.NET程序文件写入漏洞分析与利用指南
1. 漏洞概述
本漏洞存在于某.NET编写的OA系统中,涉及文件上传功能的安全缺陷。攻击者可以利用该漏洞实现:
- 任意文件写入(包括WebShell上传)
- 任意文件读取
- 通过路径穿越实现目录跳转
2. 环境准备与分析工具
2.1 反编译工具
.NET程序分析推荐使用以下工具:
- ILSpy:持续维护更新的.NET反编译工具
- dnSpy:虽然官方在2020年归档,但仍有爱好者维护的非官方版本(GitHub搜索"dnSpy fork:only")
2.2 .NET程序结构特点
- 预编译的ASP.NET Web应用程序通常将程序集(DLL)放在
bin目录下 - 类似于Java的
WEB-INF/lib存放JAR文件 - .NET的DLL与Java的JAR都是代码打包分发格式
3. 路由分析
3.1 全局应用程序类
分析起点为Global.asax文件,关键点:
Inherits属性定义了供页继承的代码隐藏类Application_Start方法包含应用程序启动时运行的代码
3.2 Web API路由配置
通过WebApiConfig.Register方法定义API路由:
- 控制器是处理HTTP请求的类
- 控制器的公共方法称为操作方法(action)
- 框架收到请求后路由到对应action
4. 漏洞详细分析
4.1 文件上传漏洞(UploadFile)
4.1.1 漏洞端点
POST /api/files/UploadFile
4.1.2 请求参数
| 参数名 | 类型 | 描述 |
|---|---|---|
| token | string | 认证令牌 |
| FileName | string | 目标文件名(含路径) |
| pathType | int | 路径类型标识 |
| fs | byte[] | 文件内容(JSON格式的字节数组) |
4.1.3 认证绕过
- 使用硬编码令牌
zxh即可通过认证 - 认证检查代码:
return new UserInfo();
4.1.4 文件写入过程
fs参数通过JsonConvert.DeserializeObject<byte[]>反序列化为字节数组- 通过
SingleBase<fileServices>.Instance.UploadFile写入文件 - 使用
memoryStream.WriteTo(fileStream)实现文件写入
4.1.5 路径控制
- 通过
pathType参数决定基础路径 FileName参数可包含路径穿越符(如/../../)- 可跳转到web目录(如
/../../manager/a.aspx)
4.1.6 利用POC
POST /api/files/UploadFile HTTP/1.1
Host: your-ip
Content-Type: application/x-www-form-urlencoded
Content-Length: 1926
token=zxh&FileName=/../../manager/a.aspx&pathType=1&fs=[60,37,64,...]
4.1.7 WebShell生成
使用Python生成WebShell字节数组:
webshell = '<%now()%>'
print(str([ord(x) for x in webshell]).replace(' ', ''))
4.2 其他文件上传变种
4.2.1 UploadFile2
- 额外参数:
startPoint和dataSize - 当
startPoint=0时直接写入文件 - 当
startPoint≠0时要求:- 目标文件已存在
startPoint值必须等于文件当前长度dataSize必须等于写入内容的字符数
- 使用
append模式追加写入
4.2.2 UploadBillFile2
- 原理与UploadFile2相同
- 仅上传路径不同
- 仍可通过文件名进行目录穿越
4.2.3 临时目录上传
- 使用
Path.GetTempPath()获取路径 - 只能上传到
%TMP%目录 - 仍可尝试路径穿越到启动目录
4.3 任意文件读取漏洞
4.3.1 漏洞端点
POST /api/files/DownloadFile
4.3.2 请求参数
| 参数名 | 类型 | 描述 |
|---|---|---|
| token | string | 认证令牌(硬编码zxh) |
| requestFileName | string | 要读取的文件路径 |
| pathType | int | 路径类型标识 |
4.3.3 利用POC
POST /api/files/DownloadFile HTTP/1.1
Host: your-ip
Content-Type: application/x-www-form-urlencoded
token=zxh&requestFileName=../../manager/web.config&pathType=1
5. 漏洞修复建议
-
认证机制:
- 移除硬编码令牌
- 实现完善的认证和授权机制
-
输入验证:
- 对文件名进行严格过滤,禁止路径穿越符
- 限制文件扩展名
-
路径安全:
- 使用
Path.GetFullPath规范化路径 - 限制文件操作在指定目录内
- 使用
-
文件操作:
- 对上传内容进行安全检查
- 设置文件权限限制
-
日志监控:
- 记录所有文件操作
- 监控异常文件访问模式
6. 总结
该漏洞展示了.NET应用程序中常见的几类安全问题:
- 硬编码凭据
- 缺乏输入验证导致的路径穿越
- 不安全的文件操作
- 功能相似的多个端点存在相同漏洞
通过此案例,安全研究人员可以学习到.NET应用程序审计的基本方法和常见漏洞模式。