从一次waf绕过来学习.Net javascriptserializer反序列化漏洞
字数 1722 2025-08-30 06:50:27
.NET JavaScriptSerializer 反序列化漏洞分析与WAF绕过实战
一、漏洞概述
CVE-2019-18935是一个.NET框架中JavaScriptSerializer组件的反序列化漏洞,主要影响Telerik UI for ASP.NET AJAX组件。该漏洞允许攻击者通过精心构造的恶意序列化数据实现远程代码执行(RCE)。
二、漏洞发现与确认
- 识别组件:通过源码分析确认使用了Telerik UI组件
- 版本确认:检查组件版本是否在受影响范围内
- 漏洞路由:尝试访问
Telerik.Web.UI.WebResource.axd?type=rau路径
三、漏洞原理分析
JavaScriptSerializer反序列化机制
常规JavaScriptSerializer反序列化漏洞利用需要满足以下条件:
- 必须实例化
SimpleTypeResolver - 使用类型解析器解析JSON中的
_type值
但本漏洞的特殊之处在于:
- 未实例化SimpleTypeResolver,而是从外部传入type参数
- 通过
Context.Request()函数获取rauPostData值 - 将值以
&分割:前部分作为obj,后部分解密后作为Type传入Dserialize函数
漏洞触发流程
- 请求进入
EnsureSetup函数 - 通过
Context.Request()获取rauPostData - 传入
GetConfiguration函数处理 - 分割并解密数据
- 将obj和Type传入
Dserialize函数 - 通过反射调用JavaScriptSerializer进行反序列化
四、攻击利用链条
由于未实例化SimpleTypeResolver,不能使用以下常见链:
ObjectDataProvider链System.Windows.Forms.BindingSource链
有效利用链:System.Configuration.Install.AssemblyInstaller
利用链核心机制
- 设置
path属性时会加载指定路径的程序集dll - 结合上传功能将恶意dll上传到服务器
- 通过
Assembly.LoadFrom加载时执行DllMain() - 加载mixed assemblies(混合程序集)实现RCE
混合程序集技术
混合程序集是将.NET程序集注入Windows进程执行的技术,参考:
利用步骤
- 编译混合程序集
- 上传恶意dll到服务器
- 构造payload触发dll加载
五、WAF绕过技术
WAF检测规则分析
-
检测
rauPostDate参数中&后有jyggli开头的字符- 因为
System加密后正好是jyggli256...
- 因为
-
拦截漏洞利用路由:
Telerik.Web.UI.WebResource.axd?type=rau
-
拦截未加密的json值中的特定符号
-
拦截上传dll中的特征内容
绕过方法
-
参数位置绕过:
- 将
rauPostDate参数从cookie中传入 - 绕过
Context.Request()的常规检测
- 将
-
加密绕过:
- 在
System前加空格,改变加密结果 - 不影响服务端解析
- 在
-
数据加密绕过:
- 将未加密的json值加密后通过
raupostdata参数发送 - 服务端会先解密再反序列化
- 将未加密的json值加密后通过
-
DLL特征绕过:
- 使用winhex修改dll头部特征
最终绕过方案
原exp发送两个包,改进后:
- 发送三个包
- 全部使用加密数据
- 规避WAF的特征检测
六、内存马注入技术
参考dust-life的exp,使用HostingCLR技术注入内存马:
- 利用CLR托管接口
- 在内存中加载和执行.NET程序集
- 实现持久化后门
七、防御建议
- 升级Telerik UI到最新版本
- 禁用不必要的序列化功能
- 实施严格的输入验证
- 使用Web应用防火墙(WAF)并定期更新规则
- 限制文件上传类型和位置
- 监控异常反序列化操作