javaweb中的权限绕过

场景一:身份信息绕过

案例一:Cookie伪造

1、身份伪造

此类绕过主要关注user信息是否可以构造

查看filter

image

首先查看byToken方法

获取参数token

image

在getDataFromToken方法中对token进行解析,得到第一个.前面的base64编码参数并进行解码

image

跟进cleanToken得出参数格式为base64编码的xxxx:xxxx(可能是多位),替换后变成xxx.xxxx

image

在解析完token后就将其封装到LoginUserHolder对象,流程可以看到这里是直接绑定身份信息,没有其他认证,那么只要往下看参数的格式,想办法构造即可绕过

image

为了查看token的格式,跟进set方法

image

LoginUser对象类型的参数,跟进LoginUser即可得到参数并构造

image

id=1&dlh=2&name=3&orgid=4&org=5

将其base64编码即可作为token参数传递:

token: aWQ9MSZkbGg9MiZuYW1lPTMmb3JnaWQ9NCZvcmc9NQ==:xxxxxxx

再看bySession方法

image

在decode方法中会先对参数做aes解密然后再使用json解析,由此得出参数是json格式,Aes密钥硬编码

image

这里比较简单,由于密钥硬编码,且知道了格式是json,直接用CipherUtil的加密方法对参数进行加密就行了,这个属于硬编码利用绕过

image

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的属性是否为空,不为空就放行请求

image

这时候就可以查找user被set且可以未授权访问的地方,如图所示

image

当访问/index2时session域里就会写入一个user对象,访问请求会响应一个包含user信息的cookie

image

把cookie替换到请求,再访问一次index1,此时获取到的user不为空就会通过判断,放行请求

image

案例三:异常绕过

此类绕过是利用默认的布尔值以及catch模块的位置进行绕过

查看过滤器的实现,当buff返回true时就放行请求

image

查看buff方法的实现,permi初始化是true

image

注意此处try catch的位置

image

在try里,请求传入Req2Json.parse做json解析,当解析异常时就会直接走到catch位置,然后返回布尔值,因为初始化是true,所以返回的也是true。所以这个时候再找一个文件上传的的请求,json解析异常时返回true即可进行绕过。

案例四:前端认证绕过

此类关注点在于前端解析后端的响应包,利用响应状态来进行绕过

 

查看登录实现,在loginAction方法中,只是对验证账号密码后做出响应内容的处理,没有进一步的操作实现,相当于点击登录只会提示成功或失败,没有其他动作

image

但是实际登录却的确有跳转的动作,在代码中无法看到登录后跳转的处理代码

1
2
3
4
针对这个问题有三个思路:
1、其他认证类filter对/*请求有专门的响应判断;
2、其他认证类filter对/*请求有专门的cookie判断
3、其他地方有针对这个登录做专门的响应判断

但找了所有过滤器都找不到1和2的实现,从第三点入手,在登录口查看源代码找登录相关的流程,发现原来是在前端做了响应判断

image

解析后端返回的响应,当login字段的值是true时就会将账号密码设置成cookie的值然后跳转到后台管理页面,所以此处只需要抓包改响应包里的login值为true即可绕过  

场景二:配置绕过

案例一:springboot yml配置

application.yml配置文件,有时候像图中有关拦截器的属性配置也可以利用,具体还是要看拦截器的实现。

image

在拦截器中会获取URI进行判断,当符合条件就放行请求

image

所以请求结尾加上;.jpg等即可绕过,低版本的springboot还可以利用/admin/../绕过(要注意的是假如是低版本的springboot(小于等于2.3.0.RELEASE),则/**可以利用,否则springboot无法匹配到路由)

案例二:排除绕过

1、白名单利用

此类绕过主要关注当配置了某些请求是校验白名单时,可以从处理这些请求的Action中查找漏洞。

查看处理所有.do接口的过滤器

image

doFilter判断登录状态

image

isPermitAdmin方法:

image

这些接口中都存在注入,找到对应的类即可看到详情

2、filter绕过

此类绕过是按照web.xml中filter的定义来进行利用,当配置了映射时,处理了该映射的filter以及servlet没有对请求做校验就可以直接访问,与白名单利用的手法大同小异

案例三:权限管理

1、第三方组件、框架

此类关注是类似shiro、低版本框架等绕过。

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

image

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

image

所以要找没有RequiresPermissions之类的角色分配注解的接口才可以进行利用。

2、自定义注解

有时候开发会自己写权限注解接口@interface,但此类注解实现还是会依赖WebMvcConfigurer添加拦截器,拦截实现一般在Interceptor的preHandle方法,所以此类关注点可以看有没有加特别注解的controller(如果有低权限的账号可以查看注解相关属性,进行越权利用,也可以具体看注解的实现,看是否存在可利用的组合漏洞),或者看preHandle里有无可利用的点,如图

image

对应的是开发自实现的一个接口,注意required是true

image

现在找项目的拦截器,全局搜Interceptor,在preHandle方法中可以看到对请求的处理

image

可以看到preHandle方法里用到了刚刚的接口做权限判断,当处理当前请求的业务逻辑中存在@PassTokenAnno就会跳过登录认证,进行未授权访问

image

其他:

利用类似hop by hop逐跳之类特性跟系统里其他部分组合起来进行绕过,参考 BIG-IP认证绕过漏洞

场景三:过滤绕过

案例一:条件判断

1、以xx结尾判断

此类绕过主要关注条件中以xx为结尾的利用

查看Filter条件判断,在获取到URI后进入条件

image

当url以静态资源为结尾时就放行请求,所以URL后面加上;.jpg即可绕过登录

2、以包含xx判断

该类绕过关注点在于判断参数是否包含xxxx,或者是xxxx来进行绕过

 

查看认证过滤器UserAuthenticationFilter类

image

在过滤器中,初始化变量,将刚刚的白名单添加到fileTypeList

image

在dofilter中使用了request.getRequestURI();来做校验,当请求url里包含有白名单字符就会放行请求

image

所以只要在URL结尾加上;.xx即可绕过

案例二:正则匹配判断

1、匹配返回true

此类绕过关注点是match的用法,当匹配到目标时就返回true的利用

查看filter

image

antMatchs方法中,只要访问的url中出现白名单的值就能符合条件

image

excludesAntMatch白名单

image

/**(包括/**/*.*)的均可利用

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.