🔓 算法混淆攻击 (alg: none)

Algorithm Confusion Attack

📖 漏洞原理

JWT 规范允许 alg: "none" 表示不使用签名。如果服务端没有正确验证算法,攻击者可以:

  1. 获取一个有效的 JWT
  2. 修改 Header 中的 alg 为 "none"
  3. 修改 Payload 中的用户信息(如 role: admin)
  4. 删除签名部分
  5. 服务端接受这个无签名的 Token!

🧪 攻击演示

Step 1: 获取正常 Token

等待登录...

Step 2: 伪造 Token

修改 Payload,将 role 改为 admin,算法改为 none:

等待伪造...

Step 3: 验证伪造的 Token

🔬 漏洞代码分析

// ❌ 有漏洞的验证
function verifyJwt(token) {
  const { header, payload } = parseJwt(token)
  
  // 漏洞:根据 header.alg 决定验证方式
  if (header.alg === 'none') {
    return payload  // 直接返回,不验证签名!
  }
  
  // 正常验证...
}

// ✅ 安全的验证
function verifyJwt(token) {
  const { header, payload } = parseJwt(token)
  
  // 安全:服务端指定算法,忽略 header.alg
  if (header.alg !== 'HS256') {
    throw new Error('不支持的算法')
  }
  
  // 验证签名...
}

🛡️ 防御方法