1. beplay体育能用吗网络安全学院
  2. JWT攻击

JWT攻击

在本节中,我们将研究JSON Web令牌(JWTS)的设计问题和缺陷处理如何使网站容易受到各种高级攻击的影响。beplay体育能用吗因为JWT最常用于身份验证,会话管理和访问控制机制,这些漏洞可能会损害整个网站及其用户。beplay体育能用吗

如果您不熟悉JWT以及它们的工作方式,请不要担心 - 我们将介绍所有相关细节。我们还提供了许多故意脆弱的实验室,以便您可以安全地利用这些脆弱性来防止现实的目标。

篡改JWT索赔

小费

Burp Suite Professional 2022.5.1,,,,bepaly下载 可以代表您自动检测JWT机制中的许多漏洞。有关更多信息,请参见有关的相关问题定义目标>发布的定义标签。

什么是JWT?

JSON beplay体育能用吗Web令牌(JWTS)是一种标准化格式,用于在系统之间发送密码签名的JSON数据。从理论上讲,它们可以包含任何类型的数据,但最常用于发送有关用户的信息(“索赔”),作为身份验证,会话处理和访问控制机制的一部分。

与经典的会话令牌不同,服务器所需的所有数据都存储在JWT本身中。这使JWTS成为用户需要与多个后端服务器无缝交互的高度分布式网站的流行选择。beplay体育能用吗

JWT格式

JWT由3个部分组成:标题, 一个有效载荷,a签名。这些每个都被一个点分开,如下所示:

EYJRAWQIOI5MTM2ZGRIMY1JYJBHLTRHMTKTYTA3ZS1LYWRMNWE0NGM4YJUILCJUILCJHBGCIOIJSUZI1NIJ9eyJpc3MiOiJwb3J0c3dpZ2dlciIsImV4cCI6MTY0ODAzNzE2NCwibmFtZSI6IkNhcmxvcyBNb250b3lhIiwic3ViIjoiY2FybG9zIiwicm9sZSI6ImJsb2dfYXV0aG9yIiwiZW1haWwiOiJjYXJsb3NAY2FybG9zLW1vbnRveWEubmV0IiwiaWF0IjoxNTE2MjM5MDIyfQSYZBPIBg2CRjXAJ8vCER0LA_ENjII1JakvNQoP-Hw6GG1zfl4JyngsZReIfqRvIAEi5L4HV0q7_9qGhQZvy9ZdxEJbwTxRs_6Lb-fZTDpW6lKYNdMyjw45_alSCZ1fypsMWz_2mTpQzil0lOtps5Ei_z7mM7M8gCwe_AGpI53JxduQOaB5HkT5gVrv9cKu9CsW5MS6ZbqYXpGyOG5ehoxqm8DL5tFYaW3lB50ELxi0KsuTKEbD0t5BCl0aCR2MBJWAbN-xeLwEenaqBiwPVvKixYleeDQiBEIylFdNNIMviKRgXiYuAvMziVPbwSgkZVHeEdF5MQP1Oe2Spac-6IfA

JWT的标题和有效载荷部分只是基本64url编码的JSON对象。标头包含有关令牌本身的元数据,而有效载荷包含有关用户的实际“索赔”。例如,您可以将有效载荷从上面的令牌解码,以揭示以下索赔:

{“ ISS”:“ beplay官网可以赌PortSwigger”,“ Exp”:1648037164,“名称”:“ Carlos Montoya”,“ sub”:“ Carlos”,“角色”:“ Blog_author”,“电子邮件”,“ email”:“ Carlos@carlos@carlos-montoya.net“,” IAT:1516239022}

在大多数情况下,任何访问令牌的人都可以轻松读取或修改此数据。因此,任何基于JWT的机制的安全性都在很大程度上依赖加密签名。

JWT签名

发出令牌的服务器通常通过哈哈标题和有效负载来生成签名。在某些情况下,它们还加密了由此产生的哈希。无论哪种方式,此过程都涉及一个秘密签名密钥。该机制为服务器提供了一种方法,可以验证以来令牌内部没有任何数据的数据:

  • 由于签名直接从令牌的其余部分得出,因此更改标头或有效载荷的单个字节会导致签名不匹配。

  • 在不知道服务器的秘密签名密钥的情况下,不应为给定的标头或有效负载生成正确的签名。

小费

如果您想更好地了解JWT的构建方式,则可以使用调试器jwt.io尝试任意令牌。

JWT vs JWS vs JWE

JWT规范实际上非常有限。它仅定义用于表示信息(“索赔”)为JSON对象的格式,可以在两方之间转移。实际上,JWT并没有真正用作独立实体。JWT规格通过JSON Web签名(JWS)和JSON Web加密(JWE)规格扩展beplay体育能用吗,该规范定义了实际实现JWT的具体方式。

JWT,JWS和JWE之间的关系

换句话说,JWT通常是JWS或JWE令牌。当人们使用“ JWT”一词时,它们几乎总是表示JWS令牌。JWE非常相似,除了令牌的实际内容是加密的,而不是编码。

笔记

为简单起见,在这些材料中,“ JWT”主要是指JWS令牌,尽管所描述的一些漏洞也可能适用于JWE令牌。

什么是JWT攻击?

JWT攻击涉及将修改后的JWT发送到服务器以实现恶意目标的用户。通常,此目标是绕过身份验证和访问控件通过冒充已经经过身份验证的另一个用户。

JWT攻击有什么影响?

JWT攻击的影响通常很严重。如果攻击者能够以任意价值创建自己的有效令牌,则他们可能能够升级自己的特权或冒充其他用户,完全控制其帐户。

JWT攻击的脆弱性如何出现?

JWT漏洞通常是由于应用程序本身内的JWT处理而出现的。这各种规格与JWT相关的设计相对灵活,使网站开发人员可以自己决定许多实施详细信息。beplay体育能用吗这可能会导致他们不小心引入漏洞,即使使用了战斗的库。

这些实现缺陷通常意味着JWT的签名未正确验证。这使攻击者能够通过令牌的有效载荷篡改将值传递给应用程序的值。即使对签名进行了可靠的验证,它是否真的可以信任它,也很大程度上依赖服务器的秘密密钥。如果该键以某种方式泄漏,或者可以被猜测或蛮力,则攻击者可以为任何任意令牌生成有效的签名,从而损害整个机制。

如何在Burp Suite中与JWTS合作

如果您过去没有与JWT合作,我们建议您在尝试本主题的实验室之前熟悉Burp Suite的相关功能。

利用有缺陷的JWT签名验证

通过设计,服务器通常不会存储有关其发行的JWT的任何信息。相反,每个令牌都是一个完全独立的实体。这有几个优点,但也引入了一个基本问题 - 服务器实际上对代币的原始内容甚至原始签名是什么都不了解。因此,如果服务器未正确验证签名,则没有什么可以阻止攻击者对其他令牌进行任意更改。

例如,考虑包含以下主张的JWT:

{“用户名”:“ Carlos”,“ Isadmin”:false}

如果服务器基于此标识会话用户名,修改其值可能使攻击者能够模仿其他登录用户。同样,如果Isadmin值用于访问控制,这可以为特权升级提供简单的向量。

在前几个实验室中,您将看到一些示例,说明这些漏洞在现实世界中的外观如何。

接受任意签名

JWT库通常提供一种用于验证令牌的方法,另一种只是解码它们。例如,node.js库jsonbeplay体育能用吗webtoken核实()解码()

有时,开发人员会混淆这两种方法,只将传入的令牌传递给解码()方法。这实际上意味着该应用程序根本无法验证签名。

接受令牌没有签名

除其他外,JWT标头包含一个alg范围。这告诉服务器在验证签名时需要使用哪种算法来签名令牌,因此,它需要使用哪种算法。

{“ alg”:“ HS256”,“ typ”:“ JWT”}

这是本质上存在缺陷的,因为服务器别无选择,只能隐式地信任代币的用户控制输入,此时根本没有验证。换句话说,攻击者可以直接影响服务器如何检查令牌是否值得信赖。

可以使用一系列不同的算法签名JWT,但也可以无符号签名。在这种情况下,alg参数设置为没有任何,这表示所谓的“无抵押JWT”。由于这一明显的危险,服务器通常拒绝没有签名的令牌。但是,由于这种过滤依赖于字符串解析,有时您可以使用经典的混淆技术(例如混合资本化和意外的编码)绕过这些过滤器。

笔记

即使令牌未签名,有效载荷零件仍必须用尾随点终止。

野蛮的秘密钥匙

一些签名算法,例如HS256(HMAC + SHA-256),使用任意的独立字符串作为秘密键。就像密码一样,至关重要的是,攻击者无法轻易猜测或蛮横构想这个秘密。否则,他们可能能够使用任何标头和有效载荷值创建JWT,然后使用键使用有效签名重新签名令牌。

在实施JWT应用程序时,开发人员有时会犯错误,例如忘记更改默认情况或占位符秘密。他们甚至可以复制并粘贴在网上找到的代码片段,然后忘记更改作为一个例子的硬编码秘密。在这种情况下,攻击者可以使用A爆发服务器的秘密是微不足道的著名秘密的文字清单

使用hashcat的蛮力秘密键

我们建议使用hashcat brute-force秘密键。你可以手动安装哈希猫,但它也可以预装并准备在Kali Linux上使用。

笔记

如果您使用的是Kali的预构建的VirtualBox图像,而不是裸金属安装程序版本,则可能没有足够的内存来运行HashCat。

您只需要一个有效的,来自目标服务器的签名JWT和一个著名秘密的文字清单。然后,您可以运行以下命令,将JWT和WordList作为参数传递:

哈希猫-a 0 -M 16500

Hashcat使用WordList中的每个秘密签名标题和有效载荷,然后将结果签名与服务器的原始签名进行比较。如果任何签名匹配,Hashcat以以下格式输出确定的秘密以及其他各种细节:

笔记

如果您多次运行命令,则需要包括- 节目标志以输出结果。

由于Hashcat在您的计算机上本地运行,并且不依赖将请求发送到服务器,因此即使使用庞大的WordList,此过程也非常快。

确定秘密密钥后,您可以使用它来为任何JWT标头和您喜欢的有效负载生成有效的签名。有关如何重新签署Burp Suite修改后的JWT的详细信息,请参见签署JWTS

如果服务器使用一个极弱的秘密,甚至可能会逐个字符来表达这个角色,而不是使用单词列表。

JWT标题参数注射

根据JWS规范,仅alg标题参数是强制性的。但是,实际上,JWT标头(也称为Jose标头)通常包含其他几个参数。以下攻击者特别感兴趣。

  • JWK(JSON beplay体育能用吗Web键) - 提供代表密钥的嵌入式JSON对象。

  • jku(JSON beplay体育能用吗Web密钥集URL) - 提供一个URL,从该URL中,服务器可以从该URL中获取包含正确键的一组键。

  • 孩子(密钥ID) - 提供一个ID,在有多个键可供选择的情况下,服务器可以使用该ID来识别正确的密钥。根据键的格式,这可能具有匹配孩子范围。

如您所见,这些可控制的参数每个都告诉收件人服务器在验证签名时要使用的键。在本节中,您将学习如何利用它们以使用自己的任意密钥而不是服务器的秘密注入修改的JWT。

通过JWK参数注入自签名的JWT

JSON Web签beplay体育能用吗名(JWS)规范描述了可选的JWK标题参数,服务器可以用它直接以JWK格式将其公共密钥直接嵌入令牌本身中。

JWK

JWK(JSON Webbeplay体育能用吗键)是一种标准化格式,用于将键表示为JSON对象。

您可以在以下JWT标题中看到一个示例:

{“ KID”:“ ED2NF8SB-SD6NG0-SCS5390G-FFD8SFXG”,“ typ”:“ JWT”,“ ALG”:“ RS256”,“ JWK”,“ JWK”:{“ kty” kty“:””,“ KID”:“ ED2NF8SB-SD6NG0-SCS5390G-FFD8SFXG”,“ N”:“ YY1WPYMFFGXBXHAUJZHHHOCCUJOLWDQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ_CBB3K2VH9M”}}}

公钥和私钥

如果您不熟悉“公共密钥”和“私钥”一词,我们将其作为算法混乱攻击的材料的一部分进行了介绍。有关更多信息,请参阅对称与不对称算法

理想情况下,服务器应仅使用有限的公共钥匙白名单来验证JWT签名。但是,配置错误的服务器有时会使用嵌入在该的任何密钥JWK范围。

您可以通过使用自己的RSA私钥签署修改后的JWT来利用此行为,然后将匹配的公钥嵌入JWK标题。

尽管您可以手动添加或修改JWKBurp中的参数JWT编辑器扩展提供有用的功能来帮助您测试此漏洞:

  1. 加载扩展,在Burp的主标签栏中,请转到JWT编辑键标签。

  2. 生成新的RSA密钥。

  3. 将包含JWT的请求发送到Burp Repeater。

  4. 在消息编辑器中,切换到扩展生成的JSON网beplay体育能用吗络令牌标签和调整令牌的有效载荷随心所欲。

  5. 点击攻击,然后选择嵌入式JWK。提示时,选择您新生成的RSA密钥。

  6. 发送请求以测试服务器的响应方式。

您也可以通过添加JWK自己的标题。但是,您可能还需要更新JWT孩子标题参数匹配孩子嵌入式钥匙。扩展程序的内置攻击为您服务。

通过JKU参数注入自签名的JWT

而不是直接使用JWK标题参数,一些服务器让您使用jku(JWK SET URL)标题参数以引用包含密钥的JWK集。在验证签名时,服务器从此URL获取相关键。

JWK设置

JWK集是一个JSON对象,其中包含代表不同键的JWK数组。您可以在下面看到一个示例。

{ "keys": [ { "kty": "RSA", "e": "AQAB", "kid": "75d0ef47-af89-47a9-9061-7c02a610d5ab", "n": "o-yy1wpYmffgXBxhAUJzHHocCuJolwDqql75ZWuCQ_cb33K2vh9mk6GPM9gNN4Y_qTVX67WhsN3JvaFYw-fhvsWQ"}, { "kty": "RSA", "e": "AQAB", "kid": "d8fDFo-fS9-faS14a9-ASf99sa-7c1Ad5abA", "n": "fc3f-yy1wpYmffgXBxhAUJzHql79gNNQ_cb33HocCuJolwDqmk6GPM4Y_qTVX67WhsN3JvaFYw-dfg6DH-asAScw" } ]}

这样的JWK集有时会通过标准端点公开公开暴露/.well-nown/jwks.json

更安全的网站只能从受信任beplay体育能用吗的域中获取键,但是您有时可以利用URL解析差异来绕过这种过滤。我们介绍了一些这些例子在我们的主题中SSRF

通过儿童参数注入自签名的JWT

服务器可以使用几个加密密钥来签署不同类型的数据,而不仅仅是JWT。因此,JWT的标题可能包含一个孩子(密钥ID)参数,该参数可帮助服务器识别验证签名时要使用的键。

验证密钥通常被存储为JWK集。在这种情况下,服务器可以简单地寻找使用相同的JWK孩子作为令牌。但是,JWS规范并未定义此ID的具体结构 - 它只是开发人员选择的任意字符串。例如,他们可能会使用孩子参数指向数据库中的特定条目,甚至是文件的名称。

如果此参数也很容易受到影响目录遍历,攻击者可能会迫使服务器从其文件系统中使用任意文件作为验证密钥。

{“ Kid”:“ ../ ../ ../ path/to/file”,“ typ”:“ jwt”,“ alg”:“ hs256”,“ k”:“ asgsadas3421-dfh9dgn-fh9dgn-afdfdfdbasfd8-anfd8-anfjkvc”}

如果服务器还支持使用A签署的JWTS,这尤其危险对称算法。在这种情况下,攻击者可能会指出孩子参数到可预测的静态文件,然后使用与此文件内容匹配的秘密签名JWT。

从理论上讲,您可以使用任何文件执行此操作,但是最简单的方法之一是使用/dev/null,大多数Linux系统都存在。由于这是一个空文件,因此获取它返回null。因此,用基本64编码的空字节签名将导致有效签名。

如果服务器将其验证密钥存储在数据库中,则孩子标题参数也是潜在的向量SQL注入攻击。

其他有趣的JWT标题参数

对于攻击者而言,以下标题参数也可能很有趣:

  • CTY(内容类型) - 有时用于声明JWT有效载荷中内容的媒体类型。通常会从标题中省略这一点,但是无论如何,基础解析库可能会支持它。如果您找到了绕过签名验证的方法,则可以尝试注入CTY将内容类型更改为文本/XML或者应用程序/X-Java-Serialized-Object,这可能有可能使新向量xxe避免攻击。

  • X5C(X.509证书链) - 有时用于通过用于数字签名JWT的键的X.509公共密钥证书或证书链。此标头参数可用于注入自签名证书,类似于JWK标题注射上面讨论的攻击。由于X.509格式及其扩展的复杂性,解析这些证书也会引入漏洞。这些攻击的详细信息超出了这些材料的范围,但有关更多详细信息,请查看CVE-2017-2800CVE-2018-2633

JWT算法混乱

即使服务器使用您无法爆发的强大秘密,您仍然可以通过使用开发人员未预料到的算法签署令牌来实现有效的JWT。这被称为算法混乱攻击。

如何防止JWT攻击

您可以通过采取以下高级措施来保护自己的网站免受我们beplay体育能用吗涵盖的许多攻击:

  • 使用最新的库来处理JWTS,并确保您的开发人员完全了解其工作原理以及任何安全含义。现代图书馆使您难以置信地实施它们更加困难,但是由于相关规格的固有灵活性,这并不是万无一失的。

  • 确保您在收到的任何JWT上执行强大的签名验证,并对使用意外算法签名的Edge-cases进行帐户。

  • 执行严格的允许主机的白名单jku标题。

  • 确保您不容易路径遍历或通过孩子标题参数。

JWT处理的其他最佳实践

尽管不必严格避免引入漏洞,但我们建议在应用程序中使用JWT时遵守以下最佳实践:

  • 始终为您发行的任何代币设置到期日期。

  • 尽可能避免在URL参数中发送令牌。

  • 包括奥德(受众)要求(或类似)指定令牌的预期收件人。这样可以防止其在不同的网站上使用。beplay体育能用吗

  • 启用发行服务器撤销令牌(例如,在注销时)。

免费注册以跟踪您的学习进度

通过Portswigger的网络安全学院工作的好处beplay官网可以赌beplay体育能用吗
  • 练习在现实目标上利用漏洞。

  • 记录您从学徒到专家的发展。

  • 看看您在我们的名人堂中排名。

已经有一个帐户?在此登录