任意文件下载到任意文件上传GETSHELL再到任意用户登录

漏洞挖掘

对某系统多次漏洞修复的绕过和利用。

任意文件下载(20250819)

发现一处疑似任意文件下载的点。

1
download.aspx?file=files/temporary/2025/08/18/XXX.docx

image

尝试下载IIS应用的web.config,下载成功,并获取到了相关敏感信息。

image

在对web.config进行分析时,发现此处添加了一个httphandler

image

1
2
3
<httpHandlers>
<add path="download.aspx" verb="*" type="NECCS.Web.Service.DownLoadFileHandler" />
</httpHandlers>

此处泄漏了两个信息,分别是download.aspx是由DownLoadFileHandler来处理的,该应用的名称是NECCS.Web【命名空间(namespace)】

那么就大胆猜测一下备份文件是NECCS.Web.rar

然后就获取到了网站压缩包源码
image

任意文件上传(20250819)

其中有一个handler存在上传漏洞。

image

这里走SaveData()SubmitData()都能上传getshell

因为存在漏洞的方法是OnSave()

image

image

image

在这个过程中,上传的文件后缀没有被额外判断过滤,上传后的文件名为{filename}_年月日时分秒.{ext}

例:111_20250818144444.aspx

构造表单参数进行上传测试。

上传后不回显文件名,因为SaveData()SubmitData()的返回值都已经被固定成了OK

image

此时将响应包里的GMT时间转换成北京时间

image

拼接访问就getshell
image

image

实际上,测试的时候,点点点,发现这个上传是有其他业务进行回显文件路径的。也就不需要去计算GMT时间。

image

任意用户登录(20250819)

简单读了一下代码,发现某处handler有这样一个逻辑。

传入的userName通过LoginByUserName方法去获取用户信息。

查询后的用户信息是由对象UserDetail去存储的。

image

image

存在漏洞的关键点是在这里,此处将会直接将查询到的用户信息赋值给服务器,即服务器会直接返回一个有效的用户cookie

1
2
context.Application[context.Session.SessionID] = _userDetail;
context.Session[context.Session.SessionID] = _userDetail; 

image

再利用判断当前用户信息的接口,判断当前cookie有效

image

最终效果如下
image

修复方案

20251020修复

任意文件下载

先来看任意文件下载漏洞有没有被修复

可以看见这个版本的代码相较于20250819是多了一层对参数fileif判断,判断file的值是否是以/files//files_android//mediaupload/为开始,如果不是,则提示”Error : 只能下载系统上传的附件文件!

image

可以看见直接去从根目录下载web.config是失败的。

image

但是当我们构造payload/files/../web.config即可绕过该if判断

image

任意文件上传

这里新增了一个FileHelper.Instance.IsLlegalExtension(extension),对文件后缀进行了限制,因此这个漏洞也就修复了。

image

image

任意用户登录

修复版本新增了对当前用户是否登录的判断

image

这里的业务流程是

1、当test用户登录后,test用户的session先被清空
2、清空session后,通过userName=admin查询admin的用户信息
3、context.Session[...]=_userDetail;Session 的「动态 SessionID 键」写入 admin 信息。

复测不是我,且当时我以为添加一个用户登录态的判断,且有session清空的逻辑,那么应该也就修复了。

20260126修复

任意文件下载

使用20251020版本的payload去绕过好像是不行了

image

直接看代码层的修复方案

相较于20251020版本,是多了一个../的判断,好像是无法绕过了?

image

实际上这里可以结合Windows的特性去绕过,在linux系统上这个漏洞的确是修复了。

只需要把payload换成/files/..\web.config,即可绕过,并继续下载文件

image

任意用户登录

上个版本复测人员应该是把这个漏洞当成修复了,且我在上个版本也没有进行测试,也以为修复了。实际上这个漏洞没有修,只是变成了session覆盖漏洞。即将test的用户的session覆盖成admin的信息。

image

这里直接测试

首先,没有有效的凭证是无法进行接口访问的

image

当前Cookie: ASP.NET_SessionId=iriqdtb0ck34cbvjr3s0c04u的用户是张某某

image

访问漏洞接口,将张某某的凭证覆盖为程某某

1
/Views/XXX/XXXXForJava.ashx?userName=chengXX&action=list&page=1&rows=10&MediaID=1&TaskName=&MediaType=1

image

再访问查询当前用户信息的接口去验证

image

可以看见之前张某某的凭证已经变成了程某某的。

image

Author: jdr
Link: https://jdr2021.github.io/2026/01/26/任意文件下载到任意文件上传GETSHELL再到任意用户登录/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.