写在前面

靶场链接及官方资料:https://portswigger.net/web-security/jwt

JWTtoken的一种实现,全称为 JSON Web Token 。以形式来说,它就是一个字符串,将用户的信息保存在一个json字符串中,编码后得到的一个token,这个token有签名功能防篡改

认证流程:

post提交表单后,后端验证完成生成一个jwt,接下来返回该jwt至客户端,随后请求中带上该jwt,即可工作。

传统cookiesession对比:

1、JWT数据量小,传输速度快
2、由于是json,JWT是跨语言的,应用广
3、更适用于移动端,因为它们不支持cookie
4、避免csrf,因为不依赖cookie
5、作为请求头可以跨域工作

JWT结构

由Header、Payload、Signature组成

JWTString=Base64(Header).Base64(Payload).HMACSHA256(base64UrlEncode(header)+"."+base64UrlEncode(payload),secret)

Header

{
  "alg": "HS256",	#签名算法 HMAC SHA256
  "typ": "JWT"		#统一为JWT
}

Payload

{
  "sub": "1234567890",
  "name": "Helen",
  "admin": true
}
#自定义即可

Signature

仅单向验证是否被篡改,摘要算法。

比较关键的一点在于,签名的密钥存储在服务器中,一般情况下无法重新签名

尝试生成一个可跳转 https://jwt.io/

更多JWT详情 https://blog.csdn.net/weixin_45070175/article/details/118559272

为了更好的对JWT进行分析和编辑,可以在bp商店中下载JWT Editor
在这里插入图片描述

JWT authentication bypass via unverified signature

JWT 库通常提供一种验证令牌的方法和另一种仅对它们进行解码的方法。例如,Node.jsjsonwebtoken具有verify()decode().

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

在这里插入图片描述

靶场登录账户密码:winner peter

在这里插入图片描述
bp中直接双击JWT可以直接以句号分隔,在右边的inspector选项卡中会自动对它进行解码,不过并不支持一起全部解码,只能一段一段的查看。

这里可以明显看到解码后的结果有一个wiener的用户名
在这里插入图片描述
将其修改为administrator,重新发出请求,即可以administrator的身份登录

在这里插入图片描述
请求敏感链接
在这里插入图片描述
完成题目要求
在这里插入图片描述

JWT authentication bypass via flawed signature verification

Header中,设置alg的值可以选择签名方式,就像前面的介绍,可以选择HS256,即HMACSHA256。在某些情况下可以设置为None,即不签名,但是一般都会过滤这种危险的设置,实战中较少,可以尝试大小写等等绕过。
在这里插入图片描述
不能直接请求管理页面
在这里插入图片描述
设置sub参数为administrator,和上面一样
在这里插入图片描述
更改alg参数为none
在这里插入图片描述
再次请求成功
在这里插入图片描述
请求敏感链接成功
在这里插入图片描述

JWT authentication bypass via flawed signature verification

通过弱签名绕过JWT身份认证。虽然签名含密钥且为单向,但是如果使用的弱密钥,是可以用相应的工具来完成破解

这里使用的是hashcat,进行破解,使用语句如下:
hashcat -a 0 -m 16500 <jwt> <wordlist>
因为是单向,需要字典来爆破,建议在github上找找,这里我使用的是:
https://github.com/wallarm/jwt-secrets

爆破成功,得到弱密钥,secret1
在这里插入图片描述
base64编码
在这里插入图片描述
JWT Editor中产生对称密钥对,设置k值为你密钥的base64
在这里插入图片描述
理论上来说,可以使用这个插件直接更改密钥,重新签名,不过我暂时没用起。你也可以在网页端,重新设置密钥,在这个下面我写上了secret1。复制这个重新产生的字符串就可以了
在这里插入图片描述
绕过认证成功
在这里插入图片描述
在这里插入图片描述

Lab: JWT authentication bypass via jwk header injection

通过 jwk 标头注入绕过 JWT 身份验证。在Header中可以插入一些其他头。

JSON Web 签名 (JWS) 规范描述了一个可选的jwk标头参数,服务器可以使用该参数以 JWK 格式将其公钥直接嵌入到令牌本身中。

首先在插件中产生RSA Key,选择RSA选项,点击生成即可
在这里插入图片描述
repeater中改到JWT编辑界面,选择下面的嵌入JWK 进行攻击
在这里插入图片描述
选择你产生的RSA密钥对
在这里插入图片描述
嵌入成功,更改sub参数为administrator
在这里插入图片描述
请求敏感链接成功
在这里插入图片描述

JWT authentication bypass via jku header injection

某些服务器不是直接使用 header 参数嵌入公钥,而是jwk允许您使用jku(JWK Set URL) header 参数来引用包含密钥的 JWK Set。验证签名时,服务器从该 URL 获取相关密钥。

这也是header中的另一个头,和上一个不同的是它是远程请求得到密钥对后工作。

和上面相同的方法产生RSA密钥对,然后复制公钥作为JWK
请添加图片描述
捕捉到受JWT攻击的包
在这里插入图片描述
使用攻击服务器,在像这样输入你的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"
        }
    ]
}

在这里插入图片描述
浏览请求网页如下
在这里插入图片描述
手动插入jku头,带上url,并更改subadministrator,注意需要重新签名一下,点一下sign即可
在这里插入图片描述
请求敏感链接成功
在这里插入图片描述

JWT authentication bypass via kid header path traversal

服务器可以使用多个加密密钥来签署不同类型的数据,而不仅仅是 JWT。出于这个原因,JWT 的头部可能包含一个kid(Key ID)参数,该参数帮助服务器在验证签名时识别使用哪个密钥。

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

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

如果服务器还支持使用对称算法签名的 JWT,这尤其危险。在这种情况下,攻击者可能会将kid参数指向一个可预测的静态文件,然后使用与该文件内容匹配的密钥对 JWT 进行签名。

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

首先捕捉易受攻击的数据包
在这里插入图片描述
直接请求admin路径是不行的
在这里插入图片描述
这里尝试对称密钥对,使用的k就为 nullbase64编码,也就是“AA==”
在这里插入图片描述
当然,你仍然可以和前面一样,在网页中直接输入密钥值,产生一个新的JWTkid参数使用路径穿越定位到空文件,然后输入密钥,记得勾选secret base64 encoded
在这里插入图片描述
复制该值,即可完成访问
在这里插入图片描述
访问敏感链接
在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐