JreCms代码审计
0x00 前言 JreCms是开源免费的JAVA企业网站开发建设管理系统。这次审计中我使用了几种常见的审计方法。1.通过功能点测试找到相应业务代码、2.直接从控制器开始翻看代码、3.通过javaweb开发的特点直接从entity目录翻看有没有SQL注入。 源码下载: https://gitee.com/heyewei/JFinalcms 软件架构 MVC:JFinal 页面:enjoy 缓存:eh
0x00 前言
JreCms是开源免费的JAVA企业网站开发建设管理系统。这次审计中我使用了几种常见的审计方法。1.通过功能点测试找到相应业务代码、2.直接从控制器开始翻看代码、3.通过javaweb开发的特点直接从entity目录翻看有没有SQL注入。
源码下载:
https://gitee.com/heyewei/JFinalcms
软件架构
MVC:JFinal
页面:enjoy
缓存:ehcache
数据库:Mysql
0x01 反射型XSS
在com/cms/controller/admin/LoginController.java#index()里,用JFinal的getPara获取的数据被交给render渲染前端页面。

看一下前端页面,数据被插入到了<input>标签里,这样子是存在反射型XSS的。

测试触发反射型XSS。

0x02 存储型XSS
在前台有留言功能。

找到留言功能的控制器com/cms/controller/front/GuestbookController.java#save(),这里使用了JFinal框架的getModel将接收的表单传递给Guestbook对象,且没有做任何过滤。

跟进到com/jfinal/plugin/activerecord/Model.java#save(),可以看到表单的内容被写入数据库了。

留言是需要管理员审核的,到后台测试触发XSS。

0x03 任意文件读取
通过翻看controller目录的控制器类文件,看到一个简单的用于下载文件的控制器,在com/cms/controller/common/DownController.java#file()里可以看到,对传入的下载文件路径未作过滤。



测试触发任意文件读取。

0x04 SSTI
在后台有模板管理功能,模板管理功能通常会存在SSTI或者文件写入漏洞。

以下是存放模板文件的目录,网站搭建好后默认会使用default目录下的模板文件。

在com/cms/controller/admin/TemplateController.java找到更新模板文件的方法,可以看到方法里使用了JFinal的getPara来从请求中获取参数。

通过编辑模板文件之后抓的包,可以看到模板文件内容通过content参数传递。

回到com/cms/controller/admin/TemplateController.java#update(),content参数没做任何处理就传递给了com/cms/util/TemplateUtils.java#write()。跟进到该方法,可以看到没有对content进行任何处理就写入到文件了,那么模板管理功能是存在SSTI的。

尝试对模板文件注入恶意Payload。JFinal框架的模板引擎是Enjoy,可以直接使用y4tacker师傅研究的Payload。
#set((java.beans.Beans::instantiate(null,"javax.script.ScriptEngineManager")).getEngineByExtension("js").eval("function test(){ return java.lang.Runtime};r=test();r.getRuntime().exec(\"calc.exe\")"))

访问注入了恶意Payload的页面,可以看到成功执行了恶意代码。

0x05 文件上传配合任意文件渲染RCE
在com/cms/controller/front/AjaxController.java#html()里,既没有鉴权也没有过滤,就直接将传入的文件路径拼接之后,使用JFinal框架的render渲染了。

在后台找一个能回显上传文件路径的文件上传点,文件的内容为SSTI的Payload即可。

测试触发RCE,这里也存在任意文件读取的。

0x06 文件写入
模板管理功能除了有SSTI,一般还会存在文件写入漏洞。添加模板文件调试一下。

在com/cms/controller/admin/TemplateController.java#save()下断点,可以看到文件路径做了简单的拼接然后跟文件内容一起被传递给JFinal框架的FileUtils.write()写入新文件了。


JFinal框架较新的版本默认不能对.jsp文件直接进行访问。

在Tomcat环境下可以通过对jsp字符进行URL编码绕过。

0x07 SQL注入
这个漏洞我是从entity目录开始找的,这个目录存放了数据库增删改查相关的类文件。在com/cms/entity/Admin.java#findPage()里,传入的name、username参数被拼接到filterSql变量,然后传递给了JFinal框架的paginate,在JFinal框架li这种写法是存在SQL注入的。使用IDEA找到使用findPage()的地方。

找到了在com/cms/controller/admin/AdminController.java#index()里,传入的name、username参数未做任何处理就被传递给findPage(),那么这里是存在SQL注入的。

表里有3条数据,测试触发SQL延时注入。

参考
https://forum.butian.net/share/1899
https://jfinal.com/doc
https://y4tacker.github.io/2022/04/14/year/2022/4/Enjoy%E6%A8%A1%E6%9D%BF%E5%BC%95%E6%93%8E%E5%88%86%E6%9E%90/
为什么我的SSTI注入不成功