标签 FastCMS 下的文章

环境搭建 windows 10 jdk 17 mysql 5.7.26 fastcms 0.1.6 下载地址:https://github.com/my-fastcms/fastcms 登录:http://127.0.0.1:8080/fastcms-master.html 账号/密码:admin/1 1 数据库配置 数据库配置文件:fastcms-master/web/src/main/resources/application.yml

SQL配置.png

数据库文件:fastcms-master/doc/sql/fastcms-master.sql

mysql -uroot -p
source D:\java\fastcms-master\doc\sql\fastcms.sql

2 开发环境 搭建环境会遇到Java 9+ 模块系统(JPMS)兼容性问题,在运行配置中添加虚拟机选项(VM options),输入下列参数即可

--add-opens java.base/java.lang.reflect=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED

1-开发环境添加虚拟机.png

3 生产环境 存在漏洞的功能在开发环境无法使用,但在生产环境又无法 debug,此节侧重于在 idea debug 打包,找到 fastcms-master/build.bat 文件(windows 环境用 bat,linux 环境用 sh),双击进行打包,打包完成会出现.dist目录

2-打包文件.png

.dist目录中,启动 startup.cmd 文件即可运行程序,但这样无法 debug,记住fastcms-master-server.jar的绝对路径,这是用 idea debug 的关键

3-jar包.png

在 idea 的运行配置中添加 jar 应用程序

4-运行配置.png

需要设置下列四个参数,jar 路径是fastcms-master-server.jar的绝对路径,工作目录则是fastcms-master-server.jar的所在目录,虚拟机选项和程序实参,则贴在图片下面。名称无所谓

4-jar应用程序配置.png

虚拟机选项

程序实参

启动成功会显示 8080 端口,以及启动时间

5-启动成功.png

代码审计 入口文件:fastcms-master/web/src/main/java/com/fastcms/web/controller/admin/PluginController.java 第一个 if 检查是否为开发环境,如果是开发环境则报错,因此必须是生产环境,生产环境 debug 前面有配置步骤,这里不在叙述,后面两个 if 判断是否有后缀,是否是 jar、zip 文件,最后进入安装环境

审计过程1.png

installPlugin 方法先安装再激活

审计过程2-installPlugin.png

loadPlugin 方法中,loadPluginFromPath 加载插件,resolvePlugins 解决依赖

审计过程3-loadPlugin.png

loadPluginFromPath 是 pf4j 的原生方法,简单看一下,pluginId 不存在代表新插件,新插件载入需要获取插件元数据(pluginDescriptor),获取插件所有类(pluginClassLoader),创建插件实例(pluginWrapper)最后通过 addPlugin 方法载入

审计过程4-加载过程.png

这里就已经实例化并载入了插件,后面需要激活插件,跟进 startPlugin 方法,根据 pluginId 获取插件,再根据插件获取实例化对象,执行 start 方法激活,中间只是判断插件的状态,是激活还是禁止

审计过程5-启动.png

start 方法如下,这是官方 HelloPlugin 插件,是否可以在这里加点代码?

审计过程6-执行start方法.png

漏洞复现 这里为了方便演示,修改官方插件,插件编写方法附在最后 找到fastcms-master/plugins/hello-world-plugin/src/main/java/com/fastcms/hello/HelloPlugin.java文件,添加下列代码

构造1.png

fastcms-master/plugins/hello-world-plugin/目录下打包成 jar 文件

fastcms-master/plugins/hello-world-plugin/target/hello-world-plugin-0.1.6-SNAPSHOT.jar

jar文件路径.png

http://127.0.0.1:8080/fastcms-master.html 登录,账号密码:admin/1

安装插件.png

此时插件管理显示暂无数据,选择打包好的 jar 文件

选择上传.png

上传成功显示插件信息,弹出计算器

上传成功.png

上面是第一次验证的步骤,如果想要重复验证,这时有三种方法 停止项目,找到astcms-master.distplugins,删除 jar,重新启动,再次上传 点击卸载,修改 jar 包名,点击上传 修改 pom.xml 中的artifactIdplugin.id标签,重新打包 jar 演示第二种:点击卸载,会弹出 405 不必理会,刷新一下会移除插件信息,但 jar 包会被保留(在自己编写插件中,若全限定类名不一致,会存在插件信息未移除的情况)

卸载.png

这时上传文件名完全一致的 jar 包会报错,修改 jar 包名后可以上传

重复上传.png

必须的插件结构(推荐在fastcms-master/plugins目录下,完成插件写好后在fastcms-master/plugins/xxx-plugin目录下用mvn clean package打包) xxx-plugin/src/main/java/com/fastcms/xxx/XxxPlugin.java xxx-plugin/plugin.properties xxx-plugin/pom.xml XxxPlugin.java

plugin.properties

pom.xml


环境搭建

windows 10

jdk 17

mysql 5.7.26

fastcms 0.1.6



下载地址:https://github.com/my-fastcms/fastcms

登录:http://127.0.0.1:8080/fastcms-master.html

账号/密码:admin/1

1 数据库配置

数据库配置文件:fastcms-master/web/src/main/resources/application.yml

SQL配置.png

数据库文件:fastcms-master/doc/sql/fastcms-master.sql

mysql -uroot -p
source D:\java\fastcms-master\doc\sql\fastcms.sql

2 开发环境

搭建环境会遇到Java 9+ 模块系统(JPMS)兼容性问题,在运行配置中添加虚拟机选项(VM options),输入下列参数即可

--add-opens java.base/java.lang.reflect=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED

1-开发环境添加虚拟机.png



3 生产环境

存在漏洞的功能在开发环境无法使用,但在生产环境又无法 debug,此节侧重于在 idea debug

打包,找到 fastcms-master/build.bat 文件(windows 环境用 bat,linux 环境用 sh),双击进行打包,打包完成会出现.dist目录

2-打包文件.png

.dist目录中,启动 startup.cmd 文件即可运行程序,但这样无法 debug,记住fastcms-master-server.jar的绝对路径,这是用 idea debug 的关键

3-jar包.png

在 idea 的运行配置中添加 jar 应用程序

4-运行配置.png

需要设置下列四个参数,jar 路径是fastcms-master-server.jar的绝对路径,工作目录则是fastcms-master-server.jar的所在目录,虚拟机选项和程序实参,则贴在图片下面。名称无所谓

4-jar应用程序配置.png

虚拟机选项

程序实参

启动成功会显示 8080 端口,以及启动时间

5-启动成功.png



代码审计

入口文件:fastcms-master/web/src/main/java/com/fastcms/web/controller/admin/PluginController.java

第一个 if 检查是否为开发环境,如果是开发环境则报错,因此必须是生产环境,生产环境 debug 前面有配置步骤,这里不在叙述,后面两个 if 判断是否有后缀,是否是 jar、zip 文件,最后进入安装环境

审计过程1.png

installPlugin 方法先安装再激活

审计过程2-installPlugin.png

loadPlugin 方法中,loadPluginFromPath 加载插件,resolvePlugins 解决依赖

审计过程3-loadPlugin.png

loadPluginFromPath 是 pf4j 的原生方法,简单看一下,pluginId 不存在代表新插件,新插件载入需要获取插件元数据(pluginDescriptor),获取插件所有类(pluginClassLoader),创建插件实例(pluginWrapper)最后通过 addPlugin 方法载入

审计过程4-加载过程.png

这里就已经实例化并载入了插件,后面需要激活插件,跟进 startPlugin 方法,根据 pluginId 获取插件,再根据插件获取实例化对象,执行 start 方法激活,中间只是判断插件的状态,是激活还是禁止

审计过程5-启动.png

start 方法如下,这是官方 HelloPlugin 插件,是否可以在这里加点代码?

审计过程6-执行start方法.png



漏洞复现

这里为了方便演示,修改官方插件,插件编写方法附在最后

找到fastcms-master/plugins/hello-world-plugin/src/main/java/com/fastcms/hello/HelloPlugin.java文件,添加下列代码

构造1.png



fastcms-master/plugins/hello-world-plugin/目录下打包成 jar 文件

fastcms-master/plugins/hello-world-plugin/target/hello-world-plugin-0.1.6-SNAPSHOT.jar

jar文件路径.png

http://127.0.0.1:8080/fastcms-master.html 登录,账号密码:admin/1

安装插件.png

此时插件管理显示暂无数据,选择打包好的 jar 文件

选择上传.png

上传成功显示插件信息,弹出计算器

上传成功.png



上面是第一次验证的步骤,如果想要重复验证,这时有三种方法

停止项目,找到astcms-master.distplugins,删除 jar,重新启动,再次上传

点击卸载,修改 jar 包名,点击上传

修改 pom.xml 中的artifactIdplugin.id标签,重新打包 jar

演示第二种:点击卸载,会弹出 405 不必理会,刷新一下会移除插件信息,但 jar 包会被保留(在自己编写插件中,若全限定类名不一致,会存在插件信息未移除的情况)

卸载.png

这时上传文件名完全一致的 jar 包会报错,修改 jar 包名后可以上传

重复上传.png

必须的插件结构(推荐在fastcms-master/plugins目录下,完成插件写好后在fastcms-master/plugins/xxx-plugin目录下用mvn clean package打包)

xxx-plugin/src/main/java/com/fastcms/xxx/XxxPlugin.java

xxx-plugin/plugin.properties

xxx-plugin/pom.xml

XxxPlugin.java

plugin.properties

pom.xml