玩转JSON Web Tokens:从漏洞利用到账户劫持

本文详细解析如何通过篡改JWT令牌实现邮箱验证绕过、密码重置劫持等攻击手法。作者通过实际案例演示了JWT结构解析、签名验证缺失等安全隐患,为开发者和安全研究人员提供重要的技术参考。

玩转JSON Web Tokens:从漏洞利用到账户劫持

大家好,希望各位一切安好。今天我想分享关于JSON Web Tokens(JWT)的相关内容。在本篇文章中,我将介绍如何在不使用确认令牌的情况下确认邮箱、重置密码以及接管企业邮箱。

什么是JSON Web Token?

JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间作为JSON对象安全地传输信息。由于信息经过数字签名,因此可以被验证和信任。JWT可以使用密钥(通过HMAC算法)或使用RSA或ECDSA的公钥/私钥对进行签名。

JSON Web Token的结构是什么?

在紧凑形式中,JSON Web Tokens由三个部分组成,各部分之间用点(.)分隔:

  • 头部(Header)
  • 有效载荷(Payload)
  • 签名(Signature)

因此,JWT通常如下所示: xxxxx.yyyyy.zzzzz

无需确认令牌的邮箱确认

通过滥用邀请功能和更改JWT令牌,我实现了无需确认令牌的邮箱确认。

假设攻击者邮箱attacker@attacker.com属于我,我通过邀请功能邀请自己加入用户,并在收件箱中收到了确认令牌。

Burp套件中的响应如下:

1
{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImF0dGFja2VyQGF0dGFja2VyLmNvbSIsImlkIjoiMTIzNDU2Nzg5MCIsImlhdCI6MTU4NTkzMDAwMH0.xxxxx"}

解码JWT令牌后:

1
2
3
4
5
{
  "email": "attacker@attacker.com",
  "id": "1234567890",
  "iat": 1585930000
}

接下来我邀请admin@company.com,Burp中的响应为:

1
{"created_date":"xxxxxxxx"}

我修改了收件箱中收到的JSON Web令牌,将邮箱从attacker@attacker.com改为admin@company.com,将攻击者ID改为管理员ID,并将时间戳更改为响应中显示的签发时间戳"created_date":“xxxxxxxx”(有时服务器会验证签发时间戳以验证令牌)。通过这种方式,我成功确认了用户并设置了admin@company.com的密码。

我们可以使用这些凭据登录公司的不同SSO集成系统,如支持面板等。

重置其他用户密码

这种方法较为复杂,但通过用户选项卡和浏览器历史记录的物理访问,我能够查看组织用户的ID并重置他们的密码。

我使用自己的邮箱attacker@attacker.com请求密码重置链接,重置链接为:

1
https://example.com/reset?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImF0dGFja2VyQGF0dGFja2VyLmNvbSIsImlkIjoiMTIzNDU2Nzg5MCIsImlhdCI6MTU4NTkzMDAwMH0.xxxxx

通过将自己的ID更改为目标用户ID,我成功更改了密码。

该Web应用程序没有验证计算出的签名,因此我能够重新编码JWT。

如需更多理解,请参考:

感谢阅读,别忘了分享您的想法。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计