JeePlus某版本JDBC反序列化
首先在依赖中发现目标使用了shiro 1.4
已知下列请求不用鉴权
WEB-INF/classes/spring/spring-context-shiro.xml
在过滤器中,<url-pattern>/**</url-pattern>
配置会匹配所有url(匹配当前文件夹下文件和子文件夹下文件),比如/api/aaa
、/api/aaa/aaaa
、/api/aaa/aaaa/aaaa.jsp
等等。众所周知,../
可以跨目录,所以这种情况下可以使用/api/../admin
来跨一级访问admin页面,因为/api/../admin
也属于/api/**
的范围。
当../
被过滤或者有waf拦截时,URL中有一个保留字符分号(;)
,主要作为参数分隔符进行使用,对于request.getRequestURL()
和request.getRequestURI()
来说,使用&
连接的参数键值,对其来说是获取不到的,但是参数分隔符(;)
及内容是可以获取到的,所以也可以使用..;/
、..;a/
等等来绕过。
对于..;/
的更多用法,可以看
回到配置文件中,有关/**
的配置可以用作权限绕过
在shiro中,@RequiresPermissions
是用来分配用户角色权限的,接口会按照注解的值来决定哪个角色能访问当前请求
当包含有该注解配置了属性值时,即使利用了..;
也会无法绕过,因为..;
时shiro获取到的attribute是anon,与注解的属性不匹配:
所以要找没有RequiresPermissions注解的接口
经过查找,发现executeSql
方法没有RequiresPermissions注解
在executeSql
方法中,sql语句会传进数据库进行执行
但是在传进执行前,sysDataSource
对象会先被传进MultiDBUtils
类的init
方法进行初始化,以便后面的sql语句能够有引擎执行,init
方法:
初始化完成后就将dataSource设置为jdbc引擎以供后方的sql执行使用
因为在executeSql方法中,SysDataSource对象是被当作参数来传进使用的
所以根据SysDataSource的各参数构造数据源即可利用
自带的mysql驱动刚好版本存在漏洞
利用链同样自带:
CbNOC、cc9、10、11
搭配权限绕过利用:
1 |
|
打内存马思路
内存马打包成jar,放在开启web服务的服务器上,使用payload
1 |
|
声明:
本文章用于学习交流,严禁用于非法操作,出现后果一切自行承担,阅读此文章表示你已同意本声明。
Disclaimer:
This article is for study and communication. It is strictly forbidden to use it for illegal operations. All consequences shall be borne by yourself. Reading this article means that you have agreed to this statement.