0x01 目标熟悉

JPress 是一个使用 Java 开发的、开源免费的建站神器,灵感来源于 WordPress,目前已经有超过 10w+ 的网站使用 JPress 搭建,其中包括多个政府机构,200+上市公司,中科院、红十字会等。

JPress基于JBoot而不是SpringBoot

0x02 环境搭建

依照官方文档:http://doc.jpress.cn/manual/start.html

下载项目并解压到指定目录下

配置好java环境,可参考:http://doc.jpress.cn/manual/jdk_config.html

配置好maven环境,可参考:http://doc.jpress.cn/manual/maven_config.html

这里有一个小问题,maven切换到阿里云的源后,执行mvn help:system会报错,暂时使用官方源

配置好IDEA开发环境,可参考:http://doc.jpress.cn/manual/idea_environment_config.html

maven不了解的,可参考:https://www.cnblogs.com/lenve/p/12047793.html

可通过如下命令启动

1
2
3
4
cd jpress
mvn clean package
cd starter/target/starter-4.0
./jpress.sh start

也可通过IDEA启动,配置好IDEA开发环境后,依照文档定位到文件starter/src/main/java/io.jpress/Starter,点击启动方法main,如下图

image-20221226153949475

成功启动,如下图

image-20221226154120204

image-20221220104411543

访问127.0.0.1:8080进入安装界面,如下图

image-20221220104649641

一路下一步,依照提示操作即可,成功搭建后,使用内网ip访问,前台界面如下

image-20221226154312930

后台界面如下

image-20221226154626800

在 starter/src/main/resources/undertow.txt 中可以修改端口

0x03 代码审计

01 通杀最新版的后台插件上传getshell

登录后台后,查看后台功能,在插件->安装可以看到能安装插件,想到将恶意代码放入插件中,然后上传插件getshell,如下图

image-20221227141058166

开始动手,首先查看项目目录,能大概猜到,插件目录是jpress-addons,如下图

image-20221227154325574

展开项目,我们修改jpress-addon-helloworld子项目,可以看到HelloWorldAddon这个文件负责:安装、卸载、启动、停止时触发的动作,如下图

image-20221227154904932

HelloWorldAddonController这个文件负责访问某些路径时触发的动作,我们选择在方法adminmenutest()中添加如下恶意代码

1
2
3
4
5
try {
Runtime.getRuntime().exec("calc");
} catch (IOException e) {
e.printStackTrace();
}

添加后如下图

image-20221227155336903

然后我们将项目jpress-addon-helloworld打包成jar包,我这边进入jpress-addon-helloworld子目录后执行mvn clean package会打包失败,需要进入根目录执行mvn clean package,执行后如下图

image-20221227155830016

然后在jpress-addon-helloworld的target目录下找到jpress-addon-helloworld-4.0.jar,登录后台,在插件处上传jpress-addon-helloworld-4.0.jar,然后点击插件测试,如下图

image-20221227160221062

可以看到成功弹出计算器

image-20221227160017106

同样的方式,我们测试下,在最新版(截止到2022/12/27,最新版为5.0.5)中,此方法是否可以getshell,同样的过程搭建一下jpress最新版,搭建好后进入后台,如下图

image-20221227170402762

上传刚才打包好的jar包,点击插件测试,看到可成功执行命令,弹出计算器

image-20221227170736878