0x01 前言
0x02 分析
Demo没有写数据库,那么在login接口我就直接写死了。
Result接口想必如果看过了之前的代码注入的文章一定会很熟悉,这里再把文章贴一下出来,方便大家温故。
https://mp.weixin.qq.com/s/DBcnyIguwsl6EKEGUQ__Jg
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("]","<");
那么也就是说我们传入的值有以下的要求:
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。
再将我们的Poc写入,成功拿下。
信 安 考 证
CISP、PTE、PTS、DSG、IRE、IRS、NISP、PMP、CCSK、CISSP、ISO27001... |
推荐阅读
渗透实战|记一次简单的Docker逃逸+反编译jar接管云主机