JFinal代码审计小记

项目简介

jfinal cms是一个java开发的功能强大的信息咨询网站,采用了简洁强大的JFinal作为web框架,模板引擎用的是beetl,数据库用mysql,前端bootstrap框架。

项目地址:https://github.com/jflyfox/jfinal_cms/releases/tag/v5.1.0

环境搭建

下载源码,用idea打开

小皮启动数据库,将相关sql文件jfinal_cms_v4.sql导入数据库中

在sql文件中前面加入

1
create database jfinal_cms; / use jfinal_cms;

选用tomcat启动image-20251027160311648

源码分析

白盒+黑盒进行测试

看到这种论坛类的,我直接就是想到xss

先测测xss

XSS1

登录处注册邮箱抓包修改邮箱可造成xss

image-20251027161948226

修改

image-20251027162010427

然后就会得到

image-20251027162142009

分析一下代码是怎么处理的

RegistController类会进行处理相应的html文件

image-20251027162836279

相应的html文件中调用oper_save方法image-20251027163223828

image-20251027163314575

同类save方法中写了对email的处理

image-20251027172353054

通过审计发现他后端只会检验邮箱是否为空和带不带@,也就是说我们抓包后绕前端,在邮箱处插入xss payload后加一个@就可以绕过

image-20251027172513722

登录后再个人信息处可查看,触发xss

image-20251027172531709

XSS2

相应的,备注处也存在xss

image-20251027173451079

去追踪一下源代码

image-20251027173636904

image-20251027173828734

相应的save方法和update方法均没有响应的过滤

XSS3

前端评论区发布xss会被转义

image-20251027174122165

尝试发包改也会被转义

image-20251027174142155

定位到相关代码中去查看一下

image-20251027174429077

找到com.jflyfox.modules.admin.comment下的saveComment方法

image-20251027174646676

发现转义

跟踪一下确实是的

image-20251027174722677

SSTI

相关cms使用了beetl

管理员用户下存在模版管理功能

出问题修改一下tomcat配置

重新修改工件名称为jfinal_cms

image-20251027174941826

image-20251028151448440

image-20251028154618092

添加

1
2
3
${@java.lang.Class.forName("java.lang.Runtime").getMethod("exec",
@java.lang.Class.forName("java.lang.String")).invoke(
@java.lang.Class.forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null),"calc")}

image-20251028154628228

跟踪到源码中去看看

修改模版保存,会先到src\main\java\com\jflyfox\modules\filemanager\FileManagerController.java

如果是POST请求会跳转到saveFile

image-20251028155234389

之后会调用fm的savefile()

相应的fm是FileManager的实例方法

image-20251028155325452

来到FileManager中的saveFile方法

image-20251028155420529

保存的时候没有任何过滤

直接修改html即可配合ssti漏洞

文件上传

刚刚看保存模版的时候看了一下上传的处理

文件上传有个大小个type验证

image-20251028160200514

上传文件尝试

绕过后无法解析,但是无法解析,当然解析xss

sql

image-20251028164355248

form.orderColumn参数在多个网页接口均存在sql注入漏洞

去找到代码看看

找到相关参数

image-20251028165451611

在getOrderBy出调用响应参数

找getOrderBy

许多处都调用了这个,这只是其中一个,写法大差不差

image-20251028165618150

可以看到接受的参数没有任何过滤