文章为交流群师傅木雨投稿,参考文章:
- https://segmentfault.com/a/1190000045379572
- https://xz.aliyun.com/t/13259
0、感谢
1、项目介绍
软件框架
项目地址
用户名和密码
2、环境搭建
所需环境
数据库导入并设置
3、漏洞挖掘
后台SQL注入-/admin/content/data
后台SQL注入-/admin/div_data/save
后台存储XSS-/admin/admin/add
前台存储XSS-/guestbook
后台任意文件上传-网站信息
前台任意文件下载
后台任意文件读取
后台任意文件删除
SSTI注入-freemarker
文件上传+SSTI注入RCE
4、最后
0、感谢感谢菜狗师傅的文章和无私奉献的教学视频,让我收获颇多。
1、项目介绍
SpringBootCMS,极速开发,动态添加字段,自定义标签,动态创建数据库表并crud数据,数据库备份、还原,动态添加站点(多站点功能),一键生成模板代码,让您轻松打造自己的独立网站,同时也方便二次开发,让您快速搭建个性化独立网站,为您节约更多时间,去陪恋人、家人和朋友
软件架构
- MVC:SpringBoot Spring MVC
- 页面:Freemarker
- 缓存:Ehcache
- 数据库:Mysql
项目地址
有两个版本
- SpringBootCMS:https://gitee.com/heyewei/SpringBootCMS
- JFinalCMS:https://gitee.com/heyewei/JFinalcms
用户名和密码
密码我忘记了,可以在数据库里边查找,密码是通过md5加密的可以使用这个网站来进行解密:https:// www.somd5.com/
2、环境搭建
所需环境
jdk版本:1.8-17
数据库导入并设置
- 创建数据一个数据库名:springbootcms
- 并修改ip
- 修改用户名和密码
- 执行sql文件
3、漏洞挖掘
后台SQL注入-/admin/content/data
先查看pom依赖使用的是什么,来执行sql,查看依赖可以发现使用的是 mybatis-pulus
如果使用的是 mybatis-pulus 框架,就需要使用查找数据库相关的关键字,比如
select
update
insert
DELETE
like
先通过全局搜索 select
拼接了sql语句:
select * from cms_content where 1=1 "+filterSql+orderBySql
查看代码这里主要需要找到 filterSql 这个变量的参数的传参来自哪里,是否可控
继续分析可以看到,全程只是检查了 title 这个参数去空,然后在进行拼接,这样就会导致sql注入
继续回调,来到 /data 路由
访问路由 /admin/content/data ,这是一个后台的路径,自行登录即可。可以发现这里有一个标题行
在标题随便输入一个内容,然后点击查询,再进行抓包
直接把这个数据包放在sqlmap中即可
python .sqlmap.py -r .1.txt --level 5 ---is-dba
后台SQL注入-/admin/div_data/save
关键字搜索 insert ,可以看到这里有一个插入的sql语句,columnValues 其中的这个参数是可控的,这个参数是由
String value = WebUtils.*getRequest* ().getParameter(divField.getName());
传递过来的
这里有一个前提条件,这个路由必须是管理用户才能进行访问 /admin/div_data/save
输入内容,然后进行抓包
将这个数据包放在sqlmap中
python .sqlmap.py -r .1.txt --level 5 –current-db
后台存储XSS-/admin/admin/add
个人理解XSS审计是需要找到输入点和输出点,一般中输出和输入点都是基于黑盒来进行查找
- 黑加白,一般都是简单看一下系统,然后再插入一些语句,看有无渲染,有就有可能存在XSS
- 这里直接登录之后,来到 /admin/admin/,根据这个路由来到后端查看源码
来到后端代码,modelMap添加之后进行渲染,当然也可以通过搜索关键字 modelMap ,当然这个代码只是进行展示,没有数据添加的操作,所需需要查看一下该文件中其他路由有没有添加数据的操作
查看 getView("admin/index"); 的源码
查看 ADMIN_PATH 的源码
CommonConstant.VIEW_EXTENSION 的源码
最后路径拼接
/admin/view/admin/index.html
查看根据路径查看前端源代码,获取admin表的值并打印到前端
继续回到后端,来到/save ,进行添加
直接添加一个用户信息
返回的结果
前台存储XSS-/guestbook
前台有一个留言板块
查看一下源码, guestbookService.save(guestbook); 就会把输入的内容添加到数据库中,现在就需要找到哪里把数据库的内容显示在界面
添加数据之后,不会直接展示再前台,需要管理员审核才会显示再前台
登录管理员端,就可以审核了,并且就可以看到前台插入的XSS
看一下后端代码 /admin/guestbook ,使用 modelMap 来添加用户数据并进行渲染
getView("guestbook/index"); 这个和上边的一样,通过上边的方法来找到对应的 径,获取 guestbook 中对应的值然后打印到前端
/admin/view/guestbook/index.html
后台任意文件上传-网站信息
先搭建完成系统,查看系统,哪里有上传点,一般上传点都是基于,后台
先登录管理员端,找到了一个可以上传点,就是网站信息站点logo那里进行上传
点上传时进行抓包,这样就可以获取到路由
通过这个 /admin/file/upload 这个路由查找后端代码,查看到后端代码没有一点拦截,直接上传 文件即可
由于这里没有jsp解析,所以就只能进行任意文件上传,返回包中的路径直接拼接即可访问
访问结果如下
前台任意文件下载
这个任意文件下载,可以不用登录危害还是挺大的
直接关键字搜索FileInputStream,可以发现这里有一个文件读取的相关操作
源代码如下,现在就直接 传递路由,并设置fileKey的值就可以实现任意文件下载
现在直接拼接路径并传递上 fileKey 的值,想要查看什么文件进行路径返回即可
后台任意文件读取
继续关键字查找,.read,在这个代码中,传入的templatePath参数,并使用readFileToString,进行读取
传入参数并进行读取,然后将读取的内容添加到模板中,进行渲染显示
先访问一下系统看看在什么功能点,这个路由需要登录后台才行,点击编辑即可来到上边的功能代码
进行放包测试
后台任意文件删除
扩散一下思维,可以看到这个功能点还有一个删除功能,看一下源码看看有没有任意文件删除
路由代码,这个代码逻辑其实和任意文件读取是一样的,只是这里使用的是删除功能
深入delete() 这个方法,也是很任意文件读取一样,参数可控
利用手法和任意文件读取是一样的
这个地方的漏洞点很多,这里还会进行模板渲染,这个漏洞后边会介绍
SSTI注入-freemarker
查看pom依赖,通过pom依赖可以发现使用的是 freemarker 模板来进行渲染
由于这套系统是SpringBoot框架的系统,所以直接搜索配置文件的关键字即可
spring.freemarker.template-loader-path=
通过配置文件可以发现, freemarker 模板会渲染所有内容
现在审计思路就简单了,只要哪里可以写入文件内容,哪里就会存在渲染
目前有两个功能点,一个文件上传,一个模块管理
在模块管理,在 search.html 里边添加内容poc
poc:
<
抓包,内容在 content 中
现在写入进去了,就要找到哪里进行渲染,最后在 search 这个路由里边进行渲染
访问即可实现命令执行
文件上传+SSTI注入RCE
文件上传就是上边分析的后台任意文件上传
这里先上传一个任意文件类型的SSTI文件
文件内容如下 rce.jpg
<html lang="zh">
<head>
</head>
<body>
<!-- footer end -->
<#assign value="freemarker.template.utility.Execute"?new()>${value("calc")}
</body>
</html>
上传文件,这里我上传的是一个jpg文件
现在就需要找到能渲染的地方,直接关键字搜索 html ,找到一个好地方,直接渲染参数 html 的 值,并且这个html的参数是我们可控的,简直就是完美
直接进行路径拼接
4、最后
文章最后感谢交流群木雨师傅的投稿,文章中有部分内容写的不是非常详细,但是整体还是非常不错的,部分思路也值得学习。
原文始发于微信公众号(菜狗安全):JAVA代审-JreCms(SpringBoot版)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论