文件上传漏洞分析

某订货系统文件上传漏洞分析
0x01 鉴权分析
在这个系统中,对用户有两层鉴权:

第一层是使用了.NET中的一个 HTTP 模块FormsAuthenticationModule方法,它的主要作用是管理用户的身份验证过程,包括用户登录、身份验证票据管理、重定向到登录页面等。在处理主要逻辑的OnEnter方法中
在这里插入图片描述
首先会通过AuthenticationConfig.AccessingLoginPage检查当前请求是否在访问登录页面,如果正在访问登录页面,则直接跳过授权步骤。如果没有跳过授权检查,则调用 SetSkipAuthorizationNoDemand 方法,根据请求是否为有效的 Web 资源请求来决定是否跳过授权检查。

第二层鉴权方式在AdminPage类中,是该系统自己实现的方法,执行类的时候需要继承该类,首先查看OnInit方法,它在页面初始化阶段被调用,用于执行初始化工作。
在这里插入图片描述
在CheckPageAccess中会检查当前用户是否有访问当前页面的权限。如果不符合条件则被重定向到其他页面,如果都符合则继续后面的流程

检查用户是否是站点管理员。如果不是,将其重定向到登录页面。
如果是站点管理员,检查用户是否是管理员。如果不是,检查当前页面是否需要管理员权限。如果需要,将其重定向到访问被拒绝页面。
检查用户是否具有页面所需的特定权限。如果没有,将其重定向到访问被拒绝页面,并附带权限信息。
在这里插入图片描述
在寻找哪里有授权操作的时候发现登录逻辑处存在一个后门账户SuperMember,密码为MdYdt2017Admin,会直接登录userid为1101的账户,通过数据库查看1101正好为admin管理员账户
在这里插入图片描述
在这里插入图片描述
从上面两个鉴权方式我们还发现Iuser user的获取方式也有两种,一种是通过HiContext.Current.User方式获取当前user对象,另一种是通过Users.GetUser的方式获取user对象,事实上我们查看HiContext.Current.User方法,他也是通过Users.GetUser方法获取的。那么我们就主要来看看Users.GetUser方法

在这里插入图片描述
当鼠标放在Users.GetUser方法上时就会显示该方法有3种重载,
在这里插入图片描述
分别是IUser GetUser(), 会通过GetLoggedOnUsername()方法获取用户名最后返回user对象

在这里插入图片描述
IUser GetUser(int userId)和GetUser(int userId, bool isCacheable),会通过userId获取
在这里插入图片描述
IUser GetUser(int userId, string username, bool isCacheable, bool userIsOnline)通过userId或username获取最后返回user对象
在这里插入图片描述
所以说我们只要可以控制userId或username可控,且流程的后面不验证密码,那么就可以通过鉴权。

比较有意思的是GetUser()中获取username的方法是GetLoggedOnUsername(),而在这个方法中,是直接取了cookie中的Vshop-Member参数作为username的,所以如果其他地方直接调用了GetUser()或者先调用GetLoggedOnUsername()再将获取的值传递给下面重载函数中也可以通过鉴权。
在这里插入图片描述
在这个漏洞中,由于该类继承自AdminPage,所以无法通过GetLoggedOnUsername方法绕过,但是由于系统存在后面账户,所以可以通过后门账户登陆后进行上传操作。

0x02 漏洞分析-文件上传
该系统存在很多文件上传的接口,但是大部分都对上传的文件进行了检查和限制
在这里插入图片描述
发现白名单上传时可以上传zip文件,所以如果可以找到解压zip相关的方法,也许可以上传webshell。

搜索解压的关键字,如zipFIle,ZipEntry等。找到PrepareDataFiles方法中调用了ZipFile.Read并且在下面遍历过程中解压了文件
在这里插入图片描述
而PrepareDataFiles方法正在在上面的btnUpload2_Click方法中调用,并且通过ShowMsg看出应该是个上传模板的地方
在这里插入图片描述
对应的类为ManageThemes首选寻找ManageThemes类对应的aspx文件
在这里插入图片描述
但是直接访问该aspx文件会跳转到登陆页面,看到路径里有admin,所以应该是一个后台的功能。
在这里插入图片描述
首先来看Page_Load方法,她通常用于处理页面加载时的初始化逻辑。在该方法中首先会解析xml文件,然后分别为 rptManageThemes 控件的 ItemCommand 事件和 btnUpload2 控件的 Click 事件添加事件处理程序,分别指定为 this.rptManageThemes_ItemCommand 和 this.btnUpload2_Click 方法。

这里我们需要触发的是btnUpload2_Click方法,但是当我们打开对应页面时,却发现页面中并没有上传相关的地方

在这里插入图片描述
不死心的我在源代码中搜索上传的关键字btnUpload2发现确实存在相关功能,发现只是通过css隐藏起来了

在这里插入图片描述
直接将style中的display: none删除即可看到上传模板的功能
在这里插入图片描述
这里我们可以上传一个带有木马文件的压缩包,除此之外,压缩包里必须还需要有一个以模板文件命名的xml文件,否则会在Page_Load方法中因读不到文件而造成报错。
在这里插入图片描述
在页面选择文件上传后依然会出现问题,提示无法获取对应模板名称
在这里插入图片描述
继续查看代码是怎么回事,发现这里判断是否存在hdtempname的值,并且判断数据包ContentType以及判断hdtempname的值与压缩包文件名是否一样

在这里插入图片描述

通过抓包查看,发现默认上传的时候hdtempname的值为空,将其修改为test发包即可上传成功

在这里插入图片描述
然后访问/Templates/master/pc/test/1.aspx

在这里插入图片描述
在这个漏洞中,由于对应的类ManageThemes在admin路径下,且ManageThemes这个类继承自AdminPage,所以需要管理员的才可以执行。由于在adminPage中并没有直接调用GetLoggedOnUsername方法,所以我们只能使用后门账户进行登陆后操作。

0x03 漏洞分析-远程文件下载
上传文件除了可以通过本地上传,有时候也可以通过下载远程文件保存到服务器上。

在C#中远程下载文件保存到本地有两种方法:使用WebClient类或HttpClient类。

分别搜索这两个关键字,最后锁定这样一处,webClient.DownloadFile的第一个参数是下载的url,第二个参数是保存的路径
在这里插入图片描述
这里的下载url也是可控的,通过表单的ImageUrls传参

在这里插入图片描述
再向上追溯该方法ProcessTaobaoProductDown的调用,发现在ProcessRequest里,该方法是 IHttpHandler 接口的一部分,定义了一个方法来处理传入的 HTTP 请求。

在这里插入图片描述
同时该方法属于TaobaoProductHandler,我们在文件中寻找是否有该字样,发现对应的ashx文件。由于该ashx文件时位于API目录下,并且没有继承于Adminpage所以该方法不需要鉴权。
在这里插入图片描述
然后我们使用vps启动一个服务并上传一个木马文件,然后构造payload访问
在这里插入图片描述
虽然报错了,但实际上是成功下载了的,报错是因为下载之后的步骤,我们也无需理会了。这样木马文件就下载到了服务器,但这里还有一个问题,那就是保存文件的文件名是通过Guid.NewGuid().ToString(“N”, CultureInfo.InvariantCulture)方法随机生成32位字符的文件名取代,路径为/Storage/master/product/images/,所以我们还需要想办法获取下载的文件名。

问了一下chatgpt,可以读文件目录的方法也有很多。
在这里插入图片描述
在FillTableForPath方法中调用了Directory.GetFiles,在函数的下方对获取到的files进行遍历,并将相关信息放入hashtable中,然后将hashtable添加到list中,而list又被赋值给table[“file_list”],这里的table也是一个传过来的Hashtable
在这里插入图片描述
在这里插入图片描述
然后向上追溯FillTableForPath方法,查看第一个参数text2是否可控,从上面可以看出text2是从通过路径拼接text得来的,而text是通过cid参数赋值,参数可控,可以通过路径穿越获取指定目录的所有文件信息。
在这里插入图片描述
但是这个方法是有鉴权的,前面的鉴权分析,User.GetUser的前两个参数要是有一个可控就可以通过鉴权,这里的第二个参数是Users.GetLoggedOnUsername(),该方法可以直接通过cookie中的Vshop-member参数获取用户名,所以只需要在发包的时候在cookie中添加Vshop-Member=admin即可。
在这里插入图片描述
发送payload 成功获取到该目录下的所有文件信息

在这里插入图片描述
访问目标文件也可以正常解析。
在这里插入图片描述
在这个漏洞中,首先通过远程下载木马文件,但由于保存的是随机文件名,所以我们需要获取到文件名。在获取文件名的方法和类中,由于该类没有继承AdminPage,但在方法中有鉴权,所以通过GetLoggedOnUsername方法进行绕过鉴权,从而获取到文件名成功getshell。

本项目构建于RASA开源架构之上,旨在实现一个具备多模态交互能力的智能对话系统。该系统的核心模块涵盖自然语言理解、语音转文本处理以及动态对话流程控制三个主要方面。 在自然语言理解层面,研究重点集中于增强连续对话中的用户目标判定效能,并运用深度神经网络技术提升关键信息提取的精确度。目标判定旨在解析用户话语背后的真实需求,从而生成恰当的反馈;信息提取则专注于从语音输入中析出具有特定意义的要素,例如个体名称、空间位置或时间节点等具体参数。深度神经网络的应用显著优化了这些功能的实现效果,相比经典算法,其能够解析更为复杂的语言结构,展现出更优的识别精度与更强的适应性。通过分层特征学习机制,这类模型可深入捕捉语言数据中隐含的语义关联。 语音转文本处理模块承担将音频信号转化为结构化文本的关键任务。该技术的持续演进大幅提高了人机语音交互的自然度与流畅性,使语音界面日益成为高效便捷的沟通渠道。 动态对话流程控制系统负责维持交互过程的连贯性与逻辑性,包括话轮转换、上下文关联维护以及基于情境的决策生成。该系统需具备处理各类非常规输入的能力,例如用户使用非规范表达或对系统指引产生歧义的情况。 本系统适用于多种实际应用场景,如客户服务支持、个性化事务协助及智能教学辅导等。通过准确识别用户需求并提供对应信息或操作响应,系统能够创造连贯顺畅的交互体验。借助深度学习的自适应特性,系统还可持续优化语言模式理解能力,逐步完善对新兴表达方式与用户偏好的适应机制。 在技术实施方面,RASA框架为系统开发提供了基础支撑。该框架专为构建对话式人工智能应用而设计,支持多语言环境并拥有活跃的技术社区。利用其内置工具集,开发者可高效实现复杂的对话逻辑设计与部署流程。 配套资料可能包含补充学习文档、实例分析报告或实践指导手册,有助于使用者深入掌握系统原理与应用方法。技术文档则详细说明了系统的安装步骤、参数配置及操作流程,确保用户能够顺利完成系统集成工作。项目主体代码及说明文件均存放于指定目录中,构成完整的解决方案体系。 总体而言,本项目整合了自然语言理解、语音信号处理与深度学习技术,致力于打造能够进行复杂对话管理、精准需求解析与高效信息提取的智能语音交互平台。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值