某.net程序文件写入漏洞分析
字数 1962 2025-08-18 17:33:44

.NET程序文件写入漏洞分析与利用指南

1. 漏洞概述

本漏洞存在于某.NET编写的OA系统中,涉及文件上传功能的安全缺陷。攻击者可以利用该漏洞实现:

  1. 任意文件写入(包括WebShell上传)
  2. 任意文件读取
  3. 通过路径穿越实现目录跳转

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 文件写入过程

  1. fs参数通过JsonConvert.DeserializeObject<byte[]>反序列化为字节数组
  2. 通过SingleBase<fileServices>.Instance.UploadFile写入文件
  3. 使用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

  • 额外参数:startPointdataSize
  • 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. 漏洞修复建议

  1. 认证机制

    • 移除硬编码令牌
    • 实现完善的认证和授权机制
  2. 输入验证

    • 对文件名进行严格过滤,禁止路径穿越符
    • 限制文件扩展名
  3. 路径安全

    • 使用Path.GetFullPath规范化路径
    • 限制文件操作在指定目录内
  4. 文件操作

    • 对上传内容进行安全检查
    • 设置文件权限限制
  5. 日志监控

    • 记录所有文件操作
    • 监控异常文件访问模式

6. 总结

该漏洞展示了.NET应用程序中常见的几类安全问题:

  1. 硬编码凭据
  2. 缺乏输入验证导致的路径穿越
  3. 不安全的文件操作
  4. 功能相似的多个端点存在相同漏洞

通过此案例,安全研究人员可以学习到.NET应用程序审计的基本方法和常见漏洞模式。

.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 漏洞端点 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 4.1.7 WebShell生成 使用Python生成WebShell字节数组: 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 漏洞端点 4.3.2 请求参数 | 参数名 | 类型 | 描述 | |--------|------|------| | token | string | 认证令牌(硬编码 zxh ) | | requestFileName | string | 要读取的文件路径 | | pathType | int | 路径类型标识 | 4.3.3 利用POC 5. 漏洞修复建议 认证机制 : 移除硬编码令牌 实现完善的认证和授权机制 输入验证 : 对文件名进行严格过滤,禁止路径穿越符 限制文件扩展名 路径安全 : 使用 Path.GetFullPath 规范化路径 限制文件操作在指定目录内 文件操作 : 对上传内容进行安全检查 设置文件权限限制 日志监控 : 记录所有文件操作 监控异常文件访问模式 6. 总结 该漏洞展示了.NET应用程序中常见的几类安全问题: 硬编码凭据 缺乏输入验证导致的路径穿越 不安全的文件操作 功能相似的多个端点存在相同漏洞 通过此案例,安全研究人员可以学习到.NET应用程序审计的基本方法和常见漏洞模式。