hashcat分布 浅析JWT安全问题

在线wifi跑包 金刚包跑包 cap跑包 hccapx ewsa在线 就来 握手包跑包

各位好 又见面了 我是曹操 今天给大家带来一篇新的教程

希望各位细心学习 低调用网

hashcat分布

重新探索JWT安全性的靶场,最近我在研究WebSocket时发现了Port Swigger发布的新靶场。这个靶场主要关注JWT安全,正好让我回顾一下相关知识。

JWT简介
JWT(Json Web Token)是一种基于JSON的开放标准(RFC 7519),用于在网络应用环境中传递声明信息。它提供了一种紧凑且自包含的方式,用于在各方之间安全地传输信息,特别适用于分布式站点的单点登录(SSO)场景。

JWT与cookie/session的异同
与cookie/session类似,JWT也用于前后端认证。然而,cookie/session需要在后端存储用户登录信息,随着用户数量的增加,服务器的压力也会增大。此外,cookie还可能被窃取导致CSRF攻击。相比之下,JWT可以将认证信息存储在前端,减轻了服务器的负担。通过基于token的认证机制,应用不再需要考虑用户登录在哪个服务器上,客户端可以将通过服务器认证后的JSON对象存储起来,并在下次访问时一同发送。

JWT格式
JWT由Header、Payload和Signature三部分组成。

Header:包含加密算法和类型(typ)信息。
Payload:存储声明信息。
Signature:使用密钥对Header和Payload进行签名。

 iss: The issuer of the tokensub: The subject of the tokenaud: The audience of the tokenexp: JWT expiration time defined in Unix timenbf: "Not before" time that identifies the time before which the JWT must not be accepted for processingiat: "Issued at" time, in Unix time, at which the token was issuedjti: JWT ID claim provides a unique identifier for the JWT//可以自定义其它字段

hashcat分布

Header和Payload都是使用Base64编码的JSON对象。

JWT&JWS&JWE
JWS(JSON Web Signature)是JWT的一种实现方式。
JWE(JSON Web Encryption)也是JWT的一种实现方式。

潜在漏洞
在使用JWT时,可能存在以下潜在漏洞:

  1. 签名未校验
  2. 算法被篡改
  3. 敏感信息泄露
  4. 加密算法不安全
  5. 伪造密钥(CVE-2018-0114)

JWT安全问题
未对签名进行验证是JWT存在的一个安全问题。如果没有对签名进行认证,可能会导致越权情况。

靶场实例:JWT认证绕过通过未经验证的签名
解决这个靶场的方法是修改会话令牌,以获得对/admin面板的访问权限,然后删除用户carlos。

hashcat分布hashcat分布hashcat分布

观察到JWT后,我们将payload部分进行Base64解码,修改sub字段的值为administrator,并重新编码。通过这种方式,我们成功提升了权限,并可以删除用户。

未对加密算法进行强验证
回顾一下Header的构成,其中alg字段指定了加密算法。如果对该字段的设置不进行强制验证,也会导致越权问题。我们可以将alg设置为none来绕过验证。

靶场实例:通过弱签名验证绕过JWT认证
解决这个靶场的方法是先抓取JWT,然后使用hashcat进行爆破,找到密钥。接下来,使用jwt.io生成我们需要的JWT,并修改sub和密钥。最后,重新发送请求,成功绕过认证。

hashcat分布hashcat分布

成功成为管理员后,我们可以正常删除用户。

其他JWT头部参数的有趣用法
除了上述漏洞外,还有一些有趣的JWT头部参数可以用于攻击:

  1. cty(内容类型):可以尝试注入cty参数,将内容类型改为text/xml或application/x-java-serialized-object,为XXE和反序列化攻击提供新的向量。
  2. x5c(X.509证书链):可以注入自签名证书,由于X.509格式及其复杂性,引入这些证书时也可能引入漏洞。

JWT算法混淆
即使服务器密码使用了攻击者无法破解的复杂密码,由于JWT库的一些原生安全问题,攻击者可能会使用开发者意想不到的算法来伪造有效的JWT。

靶场实例:通过kid参数注入自签名的JWT
解决这个靶场的方法是生成一个自签名的JWT,并将kid参数设置为服务器上的任意文件名,从而形成攻击链。

hashcat分布hashcat分布

 {    "kid": "ed2Nf8sb-sD6ng0-scs5390g-fFD8sfxG",    "typ": "JWT",    "alg": "RS256",    "jwk": {        "kty": "RSA",        "e": "AQAB",        "kid": "ed2Nf8sb-sD6ng0-scs5390g-fFD8sfxG",        "n": "yy1wpYmffgXBxhAUJzHHocCuJolwDqql75ZWuCQ_cb33K2vh9m"    }}

通过kid参数注入自签名的JWT后,我们成功越权。

JWT攻击的防御
为了防止JWT攻击,我们可以采取以下措施:

  1. 使用最新的JWT库。
  2. 严格设置jku标头的白名单。
  3. 确保kid标头不容易受到目录遍历或SQL注入攻击。
  4. 为颁发的令牌设置到期日。
  5. 尽可能避免通过URL参数发送令牌。
  6. 提供aud声明,指定令牌的预期接收者,防止其在不同网站上被使用。
  7. 允许颁发服务器撤销令牌。

参考链接:

赞(0)