前言
正文
.net反序列化漏洞整理
目前在网上能找到的.net反序列化学习资料较全的是360 天眼云影实验室2019年发布的一系列文章,整理如下:
LosFormatter(很火的ViewState反序列化本质)
BinaryFormatter
SoapFormatter
XmlSerializer
json.net
JavaScriptSerializer
DataContractSerializer
在目前国内的安全研究中发现七成net反序列化都是LosFormatter,本系列第一篇文章就以自己挖掘到的某通用系统0day为例,学习一下该漏洞。
对于闭源代码获取有多种方式,最简单的就是扫描备份文件,这里笔者通过自写poc 扫描资产收集到源码
ViewState 是使用LosFormatter进行序列化与反序列化的,市面上常见的LosFormatter反序列化是由于配置错误禁用 了MAC 签名或者获得到machineKey从而导致的,这次是由于开发者自己重写LosFormatter中的方法,未进行过滤,从而导致了反序列化漏洞。
sink(触发点)
在源码里面搜索LosFormatter关键字
两个类new了LosFormatter对象(由名字可以看到一个为英文版本分析其中一个即可)
可以看到该类继承了Page类并且重写了SavePageStateToPersistenceMedium
方法
该方法用于序列化传入的state
对象并且通过ScriptManager.RegisterHiddenField注册隐藏字段
该类还重写了LoadPageStateFromPersistenceMedium
方法
从请求的表单数据中获取隐藏字段 _MyViewState
的值,这个值包含了之前保存的页面状态,然后对其反序列化(反序列化内容可控,_source_),最终返回反序列化后的状态对象,以供页面恢复其状态
输入源
四个页面继承VsZipPage类
Page
类继承了 IHttpHandler
接口,负责处理 HTTP 请求。当页面首次被请求时,会执行 ProcessRequestMain
方法。此方法的主要功能是处理整个 HTTP 请求的生命周期。在处理请求的过程中,ProcessRequestMain
方法会调用 LoadAllState()
方法来加载页面的所有状态信息。
LoadAllState()方法调用了LoadPageStateToPersistenceMedium方法处理状态信息
而LoadPageStateToPersistenceMedium方法被重写,会反序列化我们输入的_MyViewState
的值,未进行任何的过滤,从而导致了任意代码执行。
由于是在post请求时就调用了该方法,所以和权限验证等代码逻辑不相关(后台也可以调用到漏洞点)
exp生成
https://github.com/pwntester/ysoserial.net
使用ActivitySurrogateSelectorFromFile攻击向量
ysoserial.exe -g ActivitySurrogateSelectorFromFile -f losformatter -c exp.cs;System.Web.dll;System.dll >o.dat
exp.cs为自己想要执行的代码 如下
构造请求包,成功rce!
文末
本文分析了LosFormatter反序列化漏洞,该漏洞限制条件较少,并且有ViewState这种.net技术栈常用的功能也使用了LosFormatter进行序列化与反序列化,所以爆出的漏洞相较于其他种类的反序列化 较多包括万户ezEIP爆出来的反序列化漏洞也是LosFormatter,有兴趣的师傅可以自行去分析,下篇分析.net技术栈漏洞之王BinaryFormatter相关的问题。
原文始发于微信公众号(梅苑安全):.NET反序列化漏洞类型以及案例分析(1)-LosFormatter
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论