C#反序列化漏洞

CVE-2020-0688反序列化漏洞

漏洞成因

漏洞产生的主要原因就是在Exchange ECP组件中发现,邮件服务在安装的过程中不会随机生成秘钥,也就是说所有默认安装的Exchange服务器中的validationKey和decryptionKey的值都是相同的,攻击者可以利用静态秘钥伪造__VIEWSTATE参数从而触发反序列化漏洞。

环境、工具

WinServer2016、Exchange Server2016、win10、dnspy

分析

default.aspx被解析,继承Page类(Page类位于命名空间 System.Web.UI)派生出新的类,然后,动态生成的类会被编译为程序集,该程序集之后会被缓存到ASP.Net专用的临时目录下。

(1)逆分析

寻找__VIEWSTATE参数。

因为最终继承Page,所以在Page类中寻找参数__VIEWSTATE。

在这里插入图片描述

发现在RequestViewStateString方法中,745行,获取了该值。

使用dnspy分析方法RequestViewStateString,发现有四处被使用的地方。

在这里插入图片描述

其中前俩处未找到关于反序列化的点。

在HiddenFieldPageStatePersister类中的Load方法找到反序列化触发点27行

在这里插入图片描述

往回寻找实现类HiddenFieldPageStatePersister的地方,在LoadPageSateFromPersistenceMedium方法1689行调用了Load方法。LoadPageSateFromPersistenceMedium方法中此语句

PageStatePersister pageStatePersister = this.PageStatePersister;

最终实现的都是HiddenFieldPageStatePersister类。

在这里插入图片描述

再往回分析LoadAllState方法中1649行调用了LoadPageSateFromPersistenceMedium方法。而LoadAllState方法在ProcessRequestMain方法中4403行被实现,而default.aspx处理请求时最终都会调用ProcessRequestMain方法。

在这里插入图片描述

(2)顺序分析

触发反序列化的路径已经很清晰了如下图。

在这里插入图片描述

紧接着分析进入到最后触发反序列化点的条件。

首先在ProcessRequestMain方法中,满足条件this.IsPostBack,即可进入LoadAllState()方法,而进入LoadAllState方法以后就很顺利的可以到达漏洞触发点。

在这里插入图片描述

(3)序列化漏洞分析

在上文提到在HiddenFieldPageStatePersister类中27行找到了序列化漏洞点。

在这里插入图片描述

紧接着对序列化函数进行分析,经过分析ObjectStateFormatter类中实现了IFormatter接口中

Deserialize(string serializedState)方法,而ObjectStateFormatter类也属于命名空间中System.Web.UI类。

紧接着查看反序列化实现的过程。

找到序列化函数,其中inputString就是我们输入进去的__VIEWSTATE参数。(以下步骤决定了我们构造反序列化能否成功的被解密)

在这里插入图片描述

首先inputString从Base64转成byte数据,最终根据条选择使用MachineKeySection.EncryptOrDecryptData()解密还是 MachineKeySection.GetDecodedData()解密

在这里插入图片描述

而加密解密使用的密钥在this.acKeyModifier()方法中获得。使用到viewStateUserKey,__VIEWSTATEGENERATOR,validationKey。其中viewStateUserKey可在cookie中找到,后面两者是定值(漏洞触发的关键)。
viewstate加密解密可参考

在这里插入图片描述

解决了加密的问题就反序列化就可以被顺利的触发了。

(4)工具ysoserial.net

使用ysoserial.net工具可以自动生成payload.

ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "cmd /c calc.exe" --validationalg="SHA1" --validationkey="CB2721ABDAF8E9DC516D621D8B8BF13A2C9E8689A25303BF" --generator="B97B4E27" --viewstateuserkey=""

生成的结果再进行url编码,访问以下url
/ecp/default.aspx?__VIEWSTATEGENERATOR=&__VIEWSTATE=
https://github.com/pwntester/ysoserial.net

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值