【vulhub漏洞复现】Auth Bypass -- Apache HugeGraph JWT Token硬编码导致权限绕过(CVE-2024-43441)
本文最后更新于 2026年1月19日 上午
1.漏洞原理
Apache HugeGraph 是一款快速、高度可扩展的图数据库。它提供了完整的图数据库功能,具有出色的性能和企业级的可靠性。
Apache HugeGraph 存在一个 JWT token 密钥硬编码漏洞。当启用了认证但未配置 auth.token_secret 时,HugeGraph 将使用一个硬编码的默认 JWT 密钥,其值为 FXQXbJtbCLxODc6tGci732pkH1cyf8Qg。攻击者可以使用这个默认密钥生成有效的 JWT token,从而绕过认证执行未经授权的操作。
在一般软件中,JWT Token 的生成遵循标准化流程,核心是构造数据、编码、签名三个步骤,确保 Token 可验证且防篡改。下面我用清晰的步骤和场景拆解这个过程:
🔑 一、JWT Token 的基本结构
JWT 由三部分组成,用 . 连接:
1 | |
- Header(头部):描述 Token 的类型和签名算法。
- Payload(负载):存放用户身份、权限、过期时间等业务数据(默认不加密,仅编码)。
- Signature(签名):用密钥对前两部分的编码结果进行加密,用于验证 Token 完整性。
🛠️ 二、标准生成流程
1. 构造 Header
Header 是一个 JSON 对象,通常包含两个字段:
alg:签名算法(如HS256对称加密、RS256非对称加密)。typ:Token 类型,固定为JWT。
示例:
1 | |
之后将这个 JSON 进行 Base64Url 编码(和 Base64 类似,但替换了 +// 为 -/_,去掉末尾 =)。
2. 构造 Payload
Payload 存放业务声明(Claims),分为三类:
- 标准声明(可选):
iss(签发者)、exp(过期时间)、sub(主题)、aud(受众)等。 - 自定义声明:业务需要的字段,如
user_id、role、permissions。 - 私有声明:服务端和客户端约定的字段。
⚠️ 注意:Payload 仅做 Base64Url 编码,不加密,因此不能存放密码、银行卡等敏感信息。
示例:
1 | |
同样对这个 JSON 进行 Base64Url 编码。
3. 生成 Signature
签名是确保 Token 未被篡改的核心,生成方式分两种:
(1)对称加密算法(如 HS256)
服务端持有一个共享密钥(Secret Key)。
签名公式:
1
2
3
4HMACSHA256(
base64UrlEncode(Header) + "." + base64UrlEncode(Payload),
Secret Key
)优点:计算快,适合性能要求高的场景。
风险:密钥需在服务端安全存储,一旦泄露,攻击者可伪造 Token(如你之前看到的 CVE-2024-43441 就是硬编码密钥导致的漏洞)。
(2)非对称加密算法(如 RS256)
- 服务端生成**公钥(Public Key)**和**私钥(Private Key)**。
- 用私钥对
Header.Payload进行签名,公钥用于验证签名。 - 优点:私钥仅服务端持有,公钥可公开,安全性更高。
- 适合跨服务、多系统认证场景(如 OAuth2.0)。
4. 拼接最终 Token
将编码后的 Header、Payload 和生成的 Signature 用 . 连接,得到完整的 JWT Token:
1 | |
🌐 三、软件中的实际生成场景
认证服务器生成
用户登录成功后,认证服务(如 OAuth2.0 服务、单点登录系统)会生成 JWT Token,返回给客户端。
后端框架集成
开发中通常用成熟库生成 Token,避免手动编码:
- Python:
PyJWT(你之前看到的漏洞示例就是用它) - Java:
JJWT - Node.js:
jsonwebtoken - Go:
jwt-go
- Python:
密钥管理
- 对称密钥:通过配置文件、环境变量或密钥管理系统(KMS)存储,禁止硬编码(如漏洞中的硬编码密钥就是高危错误)。
- 非对称密钥:定期轮换私钥,公钥可通过接口或配置中心下发。
📌 四、关键安全注意事项
- 设置合理过期时间:
exp字段建议设为 15~60 分钟,结合刷新 Token(Refresh Token)实现无感续期。 - 避免敏感数据入 Payload:Payload 仅编码不加密,敏感信息需加密后再存入。
- 密钥安全存储:禁止硬编码密钥,避免提交到代码仓库;非对称加密的私钥需严格权限控制。
- 使用 HTTPS 传输:防止 Token 在网络传输中被窃取。
2.漏洞利用
用
docker compose up -d启动服务后,你可以通过http://your-ip:8080访问 HugeGraph 的 API。为了安全,这个 API 默认是需要身份验证的,有两种方式:
- HTTP 基础认证:用用户名和密码(默认用户名是
admin,密码来自启动容器时的PASSWORD环境变量)。 - JWT 认证:用一个加密的 Token 来证明身份。
- HTTP 基础认证:用用户名和密码(默认用户名是
如果你不提供任何认证信息就直接访问 API,就会收到
Authentication credentials are required的错误,意思是 “需要提供身份凭证”。1
2
3
4
5{
"exception": "class jakarta.ws.rs.NotAuthorizedException",
"message": "Authentication credentials are required",
"cause": ""
}
HugeGraph 使用了一个公开的默认 JWT 密钥。JWT Token 是用密钥签名生成的,正常情况下,只有服务端知道这个密钥,才能生成有效的 Token。但如果这个密钥是默认且公开的,攻击者就可以用它生成一个有效的 JWT Token,直接绕过身份验证,不需要知道 admin 的密码。
利用默认公开密钥生成JWT Token
1 | |



使用bp发送请求
查看其官网可以知道其受保护节点为
1 | |
访问这个节点
可以看到这个接口文档此时处于上锁状态,并且有两种解锁方式
- HTTP 基础认证
Authorization: Basic YWRtaW46cGFzc3dvcmQ=把用户名 + 密码用 Base64 编码后传输,简单但不安全(编码可逆向破解) - Bearer 认证Authorization: Bearer eyJhbGciOiJIUzI1Ni…`用 Token 代替密码,Token 是签名过的,且有效期通常较短,更适合 API 场景
我们直接输入生成了的Token
登录成功