Javaweb中的权限绕过
2023-7-18 08:58:0 Author: xz.aliyun.com(查看原文) 阅读量:14 收藏

案例一:Cookie伪造

1、身份伪造

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

查看filter

首先查看byToken方法
获取参数token,看看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、其他认证类filter对/*请求有专门的响应判断;
2、其他认证类filter对/*请求有专门的cookie判断
3、其他地方有针对这个登录做专门的响应判断

但找了所有过滤器都找不到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白名单

/**(包括/**/*.*)的均可利用,因为/test/**表示/test/后面的所有请求,无论后面是什么都属于/test/下,所以可以利用/白名单/../api?cmd=来达到既能符合匹配又能绕过的目的

3、matcher特性绕过

此类关注点在于在Java中的正则默认情况下.并不包含\r\n字符来进行利用,参考CVE-2022-32532/CVE-2022-22978


文章来源: https://xz.aliyun.com/t/12709
如有侵权请联系:admin#unsafe.sh