从一次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)。

二、漏洞发现与确认

  1. 识别组件:通过源码分析确认使用了Telerik UI组件
  2. 版本确认:检查组件版本是否在受影响范围内
  3. 漏洞路由:尝试访问Telerik.Web.UI.WebResource.axd?type=rau路径

三、漏洞原理分析

JavaScriptSerializer反序列化机制

常规JavaScriptSerializer反序列化漏洞利用需要满足以下条件:

  • 必须实例化SimpleTypeResolver
  • 使用类型解析器解析JSON中的_type

但本漏洞的特殊之处在于:

  • 未实例化SimpleTypeResolver,而是从外部传入type参数
  • 通过Context.Request()函数获取rauPostData
  • 将值以&分割:前部分作为obj,后部分解密后作为Type传入Dserialize函数

漏洞触发流程

  1. 请求进入EnsureSetup函数
  2. 通过Context.Request()获取rauPostData
  3. 传入GetConfiguration函数处理
  4. 分割并解密数据
  5. 将obj和Type传入Dserialize函数
  6. 通过反射调用JavaScriptSerializer进行反序列化

四、攻击利用链条

由于未实例化SimpleTypeResolver,不能使用以下常见链:

  • ObjectDataProvider
  • System.Windows.Forms.BindingSource

有效利用链System.Configuration.Install.AssemblyInstaller

利用链核心机制

  1. 设置path属性时会加载指定路径的程序集dll
  2. 结合上传功能将恶意dll上传到服务器
  3. 通过Assembly.LoadFrom加载时执行DllMain()
  4. 加载mixed assemblies(混合程序集)实现RCE

混合程序集技术

混合程序集是将.NET程序集注入Windows进程执行的技术,参考:

利用步骤

  1. 编译混合程序集
  2. 上传恶意dll到服务器
  3. 构造payload触发dll加载

五、WAF绕过技术

WAF检测规则分析

  1. 检测rauPostDate参数中&后有jyggli开头的字符

    • 因为System加密后正好是jyggli256...
  2. 拦截漏洞利用路由:

    • Telerik.Web.UI.WebResource.axd?type=rau
  3. 拦截未加密的json值中的特定符号

  4. 拦截上传dll中的特征内容

绕过方法

  1. 参数位置绕过

    • rauPostDate参数从cookie中传入
    • 绕过Context.Request()的常规检测
  2. 加密绕过

    • System前加空格,改变加密结果
    • 不影响服务端解析
  3. 数据加密绕过

    • 将未加密的json值加密后通过raupostdata参数发送
    • 服务端会先解密再反序列化
  4. DLL特征绕过

    • 使用winhex修改dll头部特征

最终绕过方案

原exp发送两个包,改进后:

  1. 发送三个包
  2. 全部使用加密数据
  3. 规避WAF的特征检测

六、内存马注入技术

参考dust-life的exp,使用HostingCLR技术注入内存马:

  1. 利用CLR托管接口
  2. 在内存中加载和执行.NET程序集
  3. 实现持久化后门

七、防御建议

  1. 升级Telerik UI到最新版本
  2. 禁用不必要的序列化功能
  3. 实施严格的输入验证
  4. 使用Web应用防火墙(WAF)并定期更新规则
  5. 限制文件上传类型和位置
  6. 监控异常反序列化操作

八、参考资源

  1. CVE-2019-18935 PoC
  2. 混合程序集技术
  3. HostingCLR技术
.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进程执行的技术,参考: Introducing Donut 利用步骤 编译混合程序集 上传恶意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 参数发送 服务端会先解密再反序列化 DLL特征绕过 : 使用winhex修改dll头部特征 最终绕过方案 原exp发送两个包,改进后: 发送三个包 全部使用加密数据 规避WAF的特征检测 六、内存马注入技术 参考dust-life的exp,使用 HostingCLR 技术注入内存马: 利用CLR托管接口 在内存中加载和执行.NET程序集 实现持久化后门 七、防御建议 升级Telerik UI到最新版本 禁用不必要的序列化功能 实施严格的输入验证 使用Web应用防火墙(WAF)并定期更新规则 限制文件上传类型和位置 监控异常反序列化操作 八、参考资源 CVE-2019-18935 PoC 混合程序集技术 HostingCLR技术