记一次权限绕过案例

科技   2024-07-15 15:43   江苏  

0x01 前言


在几天前,我在圈子里让黑总放了一个demo,是我最近遇到的一个地方,我尽量将其还原大致的逻辑(有些地方写的有些问题,请各位师傅多多包涵)。如果有看过代码的师傅相信都已经能大致的知道问题出在哪了。下面一起来看看。

0x02 分析

在这份demo里面我只放了两个api接口,一个login,一个result。
Demo没有写数据库,那么在login接口我就直接写死了。

Result接口想必如果看过了之前的代码注入的文章一定会很熟悉,这里再把文章贴一下出来,方便大家温故。

https://mp.weixin.qq.com/s/DBcnyIguwsl6EKEGUQ__Jg

那么我们就直接先从这个接口看看如何造成代码注入,我们从28行-30行开始。
if (formula != null && orderNum != null){    formula = URLDecoder.decode(formula, "UTF-8");    if (formula.contains("add") || formula.contains("insert"))

首先判断传入的值是否为空,接着对入参做了一次url解码,最后判断入参当中是否包含”add”或者“insert”。

再到代码的31-34行,可以看到在上篇文章出现过的括号(、)、[、]过滤。

formula.replace("(",">=")        .replace(")","<=")        .replace("[",">")        .replace("]","<");
并将入参传入到typeVo这个bean类里面,最终会进入到39行当中formulas.FormulaJs()的方法当中。

那么也就是说我们传入的值有以下的要求:

1、包含“add”或“insert”
2、不能含有(、)、[、]

那么在看了 
记一次某系统代码注入绕过 过后对于要求2 不能含有(、)、[、]想必都已经so eazy了。

这里我们就用P牛给出的poc。

a = new java.beans.Customizer {setObject: eval},a.object="java.lang.Runtime.getRuntime\50\51.exec\50'calc.exe'\51"

在这条poc的基础之上,我们要满足1条件,那么如何让这条poc能够包含add或insert呢,可以看到在poc里面有一个我们自己设置的变量a,那么只需要将a改成add或者insert即可。

add = new java.beans.Customizer {setObject: eval},add.object="java.lang.Runtime.getRuntime\50\51.exec\50'calc.exe'\51"

我在访问接口的时候发现代码在还原的时候写的有点问题,Type.getList()并没有初始化值,传入transFormula的时候抛null异常了。

这里我们做一下修改。

接下来就该进入正题了,正如题目所说这是一次权限绕过的一次记录。

在看代码整体结构的时候我们是可以看到有2个filter,以及一个Filter的配置。

过滤器filter的执行顺序JwtTokenFilter-> RoleFilter。
那我们首先来看看JwtTokenFilter做了什么事情。
首先从请求头中获取了两个请求字段Jwt-Token-For-one、Jwt-Token,可以看到如果Jwt-Token-For-one为空,而Jwt-Token不为空即可直接doFilter,进入到下一个过滤器中。

否则就需要经过doAuth方法的校验,为一个Jwt的校验。

当请求走到RoleFilter时,会做一个判断isManager。

我们看到isManager方法中又获取了一个请求头Jwt-token-for-admin。

如果不为空就需要调用Decode方法对adminToken进行解密并走到checkPayload方法当中,先来看看Decode方法。

判断token是否包含3个. 如果没有抛出Jwt格式化失败,对jwtPart当中第2个元素进行base64解密并将结果转换成map,从代码看来这是一个没有经过 密钥校验 的jwt解密方法。

在来到checkPayload方法。

获取payload当中的userName,以及isAdmin字段,并将isAdmin字段进行base64解密判断其值是否为Yes。

总结一下这两个filter,我们要绕过doAuth的有密钥的Jwt校验:
1、 Jwt-Token-For-one为空,而Jwt-Token不为空。
2、 随便构造一个jwtToken,其中的payload要包含userName、isAdmin。
3、 isAdmin的值要为base64加密后的Yes。
那么最后我们的请求头就可以是下面这样的。

再将我们的Poc写入,成功拿下。

信 安 考 证



需要考以下各类安全证书的可以联系我,价格优惠、组团更便宜

CISP、PTE、PTS、DSG、IRE、IRS、NISP、PMP、CCSK、CISSP、ISO27001...




内推|长亭科技2024届秋招开启,附内推码~


你能拿她学校的shell,但永远拿不了她的shell


渗透实战|记一次简单的Docker逃逸+反编译jar接管云主机


渗透实战|NPS反制之绕过登陆验证


渗透实战|记一次曲折的EDU通杀漏洞挖掘


渗透实战|记一次RCE+heapdump信息泄露引发的血案


免责声明
由于传播、利用本公众号藏剑安全所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号藏剑安全及作者不为承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!
好文分享收藏赞一下最美点在看哦

藏剑安全
知识面决定攻击面
 最新文章