此类绕过主要关注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==
此类绕过关注点在于认证时使用了jwt之类的加密token认证,然后加密密钥硬编码在了代码或配置文件里,利用的前提需要跟进认证实现查看,如果只判断了解密后不为空token就可以使用那就是存在漏洞可以利用,经典案例:https://forum.butian.net/share/973 SpringBlade框架JWT认证缺陷漏洞、nacos硬编码漏洞
此类绕过关注点在于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即可绕过
application.yml配置文件,有时候像图中有关拦截器的属性配置也可以利用,具体还是要看拦截器的实现。
在拦截器中会获取URI进行判断,当符合条件就放行请求
所以请求结尾加上;.jpg
等即可绕过,低版本的springboot还可以利用/admin/../绕过(要注意的是假如是低版本的springboot(小于等于2.3.0.RELEASE),则/**
可以利用,否则springboot无法匹配到路由)
此类绕过主要关注当配置了某些请求是校验白名单时,可以从处理这些请求的Action中查找漏洞。
查看处理所有.do
接口的过滤器
doFilter判断登录状态
isPermitAdmin方法:
这些接口中都存在注入,找到对应的类即可看到详情
此类绕过是按照web.xml中filter的定义来进行利用,当配置了映射时,处理了该映射的filter以及servlet没有对请求做校验就可以直接访问,与白名单利用的手法大同小异
此类关注是类似shiro、低版本框架等绕过。
需要注意的是在shiro中,@RequiresPermissions是用来分配用户角色权限的,接口会按照注解的值来决定哪个角色能访问当前请求,如图
当包含有该注解时,即使利用了..;
也会无法绕过,因为..;
时shiro获取到的attribute是anon,与注解的属性不匹配
所以要找没有RequiresPermissions之类的角色分配注解的接口才可以进行利用。
有时候开发会自己写权限注解接口@interface,但此类注解实现还是会依赖WebMvcConfigurer添加拦截器,拦截实现一般在Interceptor的preHandle方法,所以此类关注点可以看有没有加特别注解的controller(如果有低权限的账号可以查看注解相关属性,进行越权利用,也可以具体看注解的实现,看是否存在可利用的组合漏洞),或者看preHandle里有无可利用的点,如图
对应的是开发自实现的一个接口,注意required是true
现在找项目的拦截器,全局搜Interceptor,在preHandle方法中可以看到对请求的处理
可以看到preHandle方法里用到了刚刚的接口做权限判断,当处理当前请求的业务逻辑中存在@PassTokenAnno就会跳过登录认证,进行未授权访问
利用类似hop by hop逐跳之类特性跟系统里其他部分组合起来进行绕过,参考 BIG-IP认证绕过漏洞
此类绕过主要关注条件中以xx为结尾的利用
查看Filter条件判断,在获取到URI后进入条件
当url以静态资源为结尾时就放行请求,所以URL后面加上;.jpg即可绕过登录
该类绕过关注点在于判断参数是否包含xxxx,或者是xxxx来进行绕过
查看认证过滤器UserAuthenticationFilter类
在过滤器中,初始化变量,将刚刚的白名单添加到fileTypeList
在dofilter中使用了request.getRequestURI();来做校验,当请求url里包含有白名单字符就会放行请求
所以只要在URL结尾加上;.xx即可绕过
此类绕过关注点是match的用法,当匹配到目标时就返回true的利用
查看filter
antMatchs方法中,只要访问的url中出现白名单的值就能符合条件
excludesAntMatch白名单
/**
(包括/**/*.*
)的均可利用
此类关注点在于在Java中的正则默认情况下.
并不包含\r
和\n
字符来进行利用,参考CVE-2022-32532/CVE-2022-22978