Apache HugeGraph-Server JWT 权限绕过
看到p神的vulhub环境更新了,正好是个权限绕过,对这块不太熟复现一手
影响版本及编号
Affected versions:>= 1.0.0, < 1.5.0
CVE-2024-43441
漏洞分析
既然是权限绕过,那么就得分析鉴权,直接找login,在hugegraph-server下的hugegraph-api找到登录接口src/main/java/org/apache/hugegraph/api/auth/LoginAPI.java
但是奇怪的是无法走进这里生成token的逻辑,直接就进入了AuthenticationFilter#filter
中进行token的校验了,那么就可以先看一下校验,进入authenticate
方法,当设置好jwt格式的请求头后就会走到下面的jwt校验
1 | Authorization: Bearer ... |
继续跟进来到下面的代码
1 | public HugeAuthenticator.User authenticate(Map<String, String> credentials) |
继续跟进
可以看到在这里进行了token的校验,由于我此时设置的是错误的jwt,所以就会校验失败
然后寻找jwt的构造,来到LoginAPI下,这里我设置了一个正确的jwt,不然没法断在这里,前面就会报错不正确的用户密码啥的
跟进来到下面
1 | public String loginUser(String username, String password) { |
继续跟进
然后发现jwt的构造,一个payload,一个过期时间,jwt默认过期时间参数为exp
而payload分别是*TOKEN_USER_NAME
* 和*TOKEN_USER_ID*
看看这两个常量的定义
所以构造payload的时候需要加入这两个,然后跟进create
函数看看,发现还需要一个key
1 | public String create(Map<String, ?> payload, long expire) { |
而这个key有默认的,这也是能伪造jwt的一个关键
1 | public static final ConfigOption<String> AUTH_TOKEN_SECRET = |
先生成一个时间戳
然后构造jwt
1 | { |
利用这个token访问需要权限校验的接口
1 | GET /graphs HTTP/1.1 |
没有正确的token时
期间叫学弟也复现了一下,挺牛比我厉害哈哈哈
参考
https://github.com/apache/incubator-hugegraph/commit/03b40a52446218c83e98cb43020e0593a744a246
vulhub/hugegraph/CVE-2024-43441/README.zh-cn.md at master · vulhub/vulhub