javaweb中的权限绕过
场景一:身份信息绕过
案例一:Cookie伪造
1、身份伪造
此类绕过主要关注user信息是否可以构造
查看filter
首先查看byToken方法
获取参数token
在getDataFromToken方法中对token进行解析,得到第一个.前面的base64编码参数并进行解码
跟进cleanToken得出参数格式为base64编码的xxxx:xxxx(可能是多位),替换后变成xxx.xxxx
在解析完token后就将其封装到LoginUserHolder对象,流程可以看到这里是直接绑定身份信息,没有其他认证,那么只要往下看参数的格式,想办法构造即可绕过
为了查看token的格式,跟进set方法
LoginUser对象类型的参数,跟进LoginUser即可得到参数并构造
id=1&dlh=2&name=3&orgid=4&org=5
将其base64编码即可作为token参数传递:
token: aWQ9MSZkbGg9MiZuYW1lPTMmb3JnaWQ9NCZvcmc9NQ==:xxxxxxx
再看bySession方法
在decode方法中会先对参数做aes解密然后再使用json解析,由此得出参数是json格式,Aes密钥硬编码
这里比较简单,由于密钥硬编码,且知道了格式是json,直接用CipherUtil的加密方法对参数进行加密就行了,这个属于硬编码利用绕过
KEY_USERHOLDER_INFO: aWQ9MSZkbGg9MiZuYW1lPTMmb3JnaWQ9NCZvcmc9NQ==
2、密钥硬编码
此类绕过关注点在于认证时使用了jwt之类的加密token认证,然后加密密钥硬编码在了代码或配置文件里,利用的前提需要跟进认证实现查看,如果只判断了解密后不为空token就可以使用那就是存在漏洞可以利用,经典案例:https://forum.butian.net/share/973 SpringBlade框架JWT认证缺陷漏洞、nacos硬编码漏洞
案例二:Map的利用
此类绕过关注点在于put与get的条件判断。可以把attribute当成一个map集合,集合有k跟v两个参数,v是k的值。首先要了解假如是单纯的put,则属性是存在request域,request属性是一次性的。如果带上@SessionAttribute注解或者使用了getSession方法,就同时存在session域,session属性只有销毁或者重启才会失效,以下是attribute方法的利用
首先看例子中(/index1)的判断,获取session域里user的属性是否为空,不为空就放行请求
这时候就可以查找user被set且可以未授权访问的地方,如图所示
当访问/index2时session域里就会写入一个user对象,访问请求会响应一个包含user信息的cookie
把cookie替换到请求,再访问一次index1,此时获取到的user不为空就会通过判断,放行请求
案例三:异常绕过
此类绕过是利用默认的布尔值以及catch模块的位置进行绕过
查看过滤器的实现,当buff返回true时就放行请求
查看buff方法的实现,permi初始化是true
注意此处try catch的位置
在try里,请求传入Req2Json.parse做json解析,当解析异常时就会直接走到catch位置,然后返回布尔值,因为初始化是true,所以返回的也是true。所以这个时候再找一个文件上传的的请求,json解析异常时返回true即可进行绕过。
案例四:前端认证绕过
此类关注点在于前端解析后端的响应包,利用响应状态来进行绕过
查看登录实现,在loginAction方法中,只是对验证账号密码后做出响应内容的处理,没有进一步的操作实现,相当于点击登录只会提示成功或失败,没有其他动作
但是实际登录却的确有跳转的动作,在代码中无法看到登录后跳转的处理代码
1 |
|
但找了所有过滤器都找不到1和2的实现,从第三点入手,在登录口查看源代码找登录相关的流程,发现原来是在前端做了响应判断
解析后端返回的响应,当login字段的值是true时就会将账号密码设置成cookie的值然后跳转到后台管理页面,所以此处只需要抓包改响应包里的login值为true即可绕过
场景二:配置绕过
案例一:springboot yml配置
application.yml配置文件,有时候像图中有关拦截器的属性配置也可以利用,具体还是要看拦截器的实现。
在拦截器中会获取URI进行判断,当符合条件就放行请求
所以请求结尾加上;.jpg
等即可绕过,低版本的springboot还可以利用/admin/../绕过(要注意的是假如是低版本的springboot(小于等于2.3.0.RELEASE),则/**
可以利用,否则springboot无法匹配到路由)
案例二:排除绕过
1、白名单利用
此类绕过主要关注当配置了某些请求是校验白名单时,可以从处理这些请求的Action中查找漏洞。
查看处理所有.do
接口的过滤器
doFilter判断登录状态
isPermitAdmin方法:
这些接口中都存在注入,找到对应的类即可看到详情
2、filter绕过
此类绕过是按照web.xml中filter的定义来进行利用,当配置了映射时,处理了该映射的filter以及servlet没有对请求做校验就可以直接访问,与白名单利用的手法大同小异
案例三:权限管理
1、第三方组件、框架
此类关注是类似shiro、低版本框架等绕过。
需要注意的是在shiro中,@RequiresPermissions是用来分配用户角色权限的,接口会按照注解的值来决定哪个角色能访问当前请求,如图
当包含有该注解时,即使利用了..;
也会无法绕过,因为..;
时shiro获取到的attribute是anon,与注解的属性不匹配
所以要找没有RequiresPermissions之类的角色分配注解的接口才可以进行利用。
2、自定义注解
有时候开发会自己写权限注解接口@interface,但此类注解实现还是会依赖WebMvcConfigurer添加拦截器,拦截实现一般在Interceptor的preHandle方法,所以此类关注点可以看有没有加特别注解的controller(如果有低权限的账号可以查看注解相关属性,进行越权利用,也可以具体看注解的实现,看是否存在可利用的组合漏洞),或者看preHandle里有无可利用的点,如图
对应的是开发自实现的一个接口,注意required是true
现在找项目的拦截器,全局搜Interceptor,在preHandle方法中可以看到对请求的处理
可以看到preHandle方法里用到了刚刚的接口做权限判断,当处理当前请求的业务逻辑中存在@PassTokenAnno就会跳过登录认证,进行未授权访问
其他:
利用类似hop by hop逐跳之类特性跟系统里其他部分组合起来进行绕过,参考 BIG-IP认证绕过漏洞
场景三:过滤绕过
案例一:条件判断
1、以xx结尾判断
此类绕过主要关注条件中以xx为结尾的利用
查看Filter条件判断,在获取到URI后进入条件
当url以静态资源为结尾时就放行请求,所以URL后面加上;.jpg即可绕过登录
2、以包含xx判断
该类绕过关注点在于判断参数是否包含xxxx,或者是xxxx来进行绕过
查看认证过滤器UserAuthenticationFilter类
在过滤器中,初始化变量,将刚刚的白名单添加到fileTypeList
在dofilter中使用了request.getRequestURI();来做校验,当请求url里包含有白名单字符就会放行请求
所以只要在URL结尾加上;.xx即可绕过
案例二:正则匹配判断
1、匹配返回true
此类绕过关注点是match的用法,当匹配到目标时就返回true的利用
查看filter
antMatchs方法中,只要访问的url中出现白名单的值就能符合条件
excludesAntMatch白名单
/**
(包括/**/*.*
)的均可利用
3、matcher特性绕过
此类关注点在于在Java中的正则默认情况下.
并不包含\r
和\n
字符来进行利用,参考CVE-2022-32532/CVE-2022-22978
声明:
本文章用于学习交流,严禁用于非法操作,出现后果一切自行承担,阅读此文章表示你已同意本声明。
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.