使用git clone +项目地址
下载使用idea打开即可,之后修改resources 目录下面的application.properties中的数据库配置文件,为自己的数据库配置即可,之后运行sql文件(springbootcms.sql),在启动App即可
查看pom.xml 文件发现应用了如下组件
Fastjson > 1.2.78 mybatis > 3.5.1 ehcache > 2.0.4
Fastjson没有找到可控触发点,实在是太菜了
存在三个filter其作用域分别为
pageCacheFilter > /* permissionFilter > /admin/* urlFilter > /*
其中pageCacheFilter 主要是页面缓存,而PermissionFilter 主要是权限相关的filter,一些排除文件
获取相关请求URL后进入for循环判断,但是这里是采用startsWith来判断开头是否为adminExcludes中的内容,如果是则直接放行,我们这里可以使用admin/login/../../admin/xxx来绕过fiter达到功能的访问
断点调试查看
成功绕过,但是功能点404
带session访问也是
菜鸡迷茫,是因为springboot的资源匹配问题吗。
路由:/common/file/download
接收了一个fileKey参数,并未做任何过滤,直接拼接导致任意文件读取
直接进行读取文件
验证:读取pom.xml文件
路由:/guestbook/save
获取用户输入后并未做任何过滤,直接写入数据库,导致xss
跟踪save方法发现直接进行了写入操作
验证:弹窗
管理员登录后台时,触发
由于系统并未做csrf攻击的防范,于是我们可以利用xss来神不知鬼不觉的添加个账户
POC
<script>var xhr=new XMLHttpRequest();xhr.open('POST', '/admin/admin/save');var f=new FormData();f.append('username', 'test');f.append('password', '123');f.append('rePassword', '123');f.append('name', '');f.append('roleIds', '1');xhr.send(f);</script>
用户只有两个,分别为read 和admin,而上面的poc的作用是添加一个test账户
留言有长度限制,尽量精简一点,否则会报404
之后管理员访问留言面板
成功添加管理账户
通过审计发现,该系统压根没有做任何权限校验,permissionFilter 只是判断了是否是演示账户权限,比如这个获取id之后重置密码
验证:id为1 的是admin账户
成功登录
路由:/admin/template
用户可控参数 directory,发现调用了TemplateUtils.getTemplateFiles
方法跟进查看
未做任何过滤直接拼接,然后在判断该文件夹是否存在,不存在则创建文件,剩下的代码就是遍历文件夹里面的文件了
验证:/admin/template?directory=default/../../../java/com/cms/config
依然是未做任何过滤
验证:结合之前的目录遍历获取文件名后在拼接目录即可
修改也是可以的
我们可以通过通过修改程序代码,来获取服务器权限,写入自定义代码,记得导包
成功写入了文件
我们后面只需要等待服务器重启即可,自行演示重启
路由:/admin/template/delete
同样是可控两个参数fileName、directory 并非做任何限制过滤,导致我们可以删除服务器中的任意文件
验证:删除桌面上的2.txt
成功删除
路由:/admin/database/delete
跟进一下delete,发现是直接进行的拼接,然后直接进入删除文件的逻辑了
验证:依然是桌面的2.txt(老演员了),成功删除
依然还是有很多隐藏问题未被发现,对于这个项目用于来练手还是可以的,如有问题,感谢师傅指正。