Burpsuite靶场-jwt漏洞原理总结及复现


一.未验证签名绕过JWT认证

靶场地址 :实验室:通过未验证签名绕过JWT认证 |网络安全学院

原理 :

由于服务器未对jwt签名进行验证,导致任何人生成的jwt都可以通过认证

靶场复现 :

准备工具:
burpsuite加上jwt editor插件拓展

目的 :

伪造用户访问后台/admin,越权删除账户carlos

1.启动靶场,登录账号密码 wiener:peter,抓取带有自身jwt的数据包进行修改

显示401 未授权,需要administrator用户才可以访问/admin

2.发送到repeater模块,点击Json Web Token直接修改sub的值为administrator

成功200

可以来到浏览器替换jwt访问/admin页面点击删除,也可以直接在burpsuit上修改url访问路径/admin/delete?username=carlos删除用户

这里我替换好了

这里直接删除就好了

二.通过有缺陷的签名验证实现JWT认证绕过

靶场地址 :
实验:通过有缺陷的签名验证绕过JWT认证 |网络安全学院

原理:

服务器允许签名算法为空,可以将签名算法改成none,从而伪造签名

复现 :

1.前面的一系列登录,抓包,操作与上一个一致,只有修改签名使用的算法,改成none即可

修改之后

由此401变成200,可以重复上一个操作了,将有效jwt复制或者直接接口删除用户

三.通过弱签名密钥绕过JWT认证

靶场地址 :
实验室:通过弱签名密钥绕过JWT认证 |网络安全学院

准备工具 :
jwt_tool工具

原理:

由于签名使用对称加密,并且加密的密钥泄露或者使用的弱密码造成攻击者可以使用该密钥伪造jwt

复现:

1.登录,抓包,获取jwt

2.使用jwt_tool工具进行破解

字典在题目上给了jwt.secrets.list文件

bash 复制代码
python jwt_tool.py <JWT> -C -d jwt.secrets.list

=

成功获取了密码

3.使用jwt.io网站使用密码验证,并且修改
验证

修改

将右边的有效jwt复制即可,同上

四.通过JWK头注入实现JWT认证绕过

靶场地址 :
实验:通过JWK头注入实现JWT认证绕过 |Web Security Academy
原理:
JWK内嵌公钥攻击,就是jwt将公钥放在头部,攻击者通过修改头部控制 JWT 验证所使用的公钥,从而使攻击者变成了签发 JWT 的人.

JWT header 允许:

json 复制代码
{  
 "alg":"RS256",  
 "jwk":{  
   "kty":"RSA",  
   "n":"攻击者公钥",  
   "e":"AQAB"  
 }  
}

如果服务器:

复制代码
直接使用 header.jwk 验证

攻击者:

  • 用自己私钥签名
  • 把公钥放 header
    服务器验证成功。

复现:

1.获取带有自己jwt/admin包发送到repeater模块,使用jwt editor生成新的rsa key

成功生成

2.在repeater模块,注入自己的rsa公钥

3.修改用户之后还要点一下sign进行签名

注意:如果生成过多个key的话,要选择对应的,不要选错了

4.发送数据,已经变成200,可以访问了,可以直接删除用户了

五.通过JKU头注入绕过JWT认证

靶场地址 :
实验:通过JKU头注入绕过JWT认证 |网络安全学院

原理:

与上一个类似,上一个是直接使用头部的公钥进行验证,这一个则是头部使用jku字段,加载远程的公钥字段,攻击者只需要搭建一个远程服务器构造特定的返回公钥值,就可以实现绕过认证.

JWT header 支持字段:

json 复制代码
{
  "alg": "RS256",
  "jku": "https://attacker.com/jwks.json",
  "kid": "hack"
}

jku = JSON Web Key URL

含义:指定 JWKS 地址

JWKS格式:

json 复制代码
{  
"keys":[  
	{  
	"kid":"hack",  
	"kty":"RSA",  
	"n":"攻击者公钥",  
	"e":"AQAB"  
	}  
   ]  
}

复现:

1.同上获取数据包,并且通过jwt editor生成rsa key

2.复制jwk

3.去提供的漏洞服务器,构造恶意url

将刚刚复制的jwk放进以下keys里面,构造有效jwks,并且放到返回中

复制代码
{  
"keys":[  

   ]  
}

添加之后

json 复制代码
{  
"keys":[  
	{
	    "kty": "RSA",
	    "e": "AQAB",
	    "kid": "fd9a2045-9d42-4952-919a-93a1e35a56ff",
	    "n": "uKtgYTLgMV3BBvLnLfcn_bSN-tRIbP_1oY7Gu3IxY51hLOSIPKiYeRbiI2fEZBmex6JJ7_YRf9SnQBIc_iyBOXNoZnUUZ5qJzPaI1O2mvmQhnXFHkcuMwneSyxQ1lok1SzeL45AalXwMwANCVqUz83VEziJrNc3fFS0RtoSYzsf3v6uJ82QsMWJ-QTZNhUibvd3BCOIh8aLL-IzFk48fRwcz3CBn0jgtNcx8OG97C6jt04vp0DYhf5ykdLBbzEb9UnM4HKVTrZXdNB2IwYMfPmwfXCoq-5cOLvC7i_mYsPdS6QmQyezTK824nvgKHA-qXO-wysFoQBlVKmJOM3avBQ"
	} 
   ]  
}

复制恶意url:
https://exploit-0a9300cb04f1772a82f3bec4013d000e.exploit-server.net/exploit

4.回到burpsuiterepeater模块,json web token添加头部字段jku,并且将kid修改成我们刚刚生成的kid,还有administrator

5.最后sign签名,发包,成功200

六. 通过kid头路径遍历实现JWT认证绕过

靶场地址 :
实验:通过kid头路径穿越JWT认证 |网络安全学院

原理 :

有些代码写成

复制代码
key = open("/keys/" + kid + ".pem")

通过头部的kid遍历本地的签名文件来作为jwt的签名

攻击者可以通过使用../../使服务器读取其他目录的文件,进行签名,然而服务器根目录/dev/null会返回空

即可以使用这个来用空来验签,我们用空来签名

复现 :

1.一如既往登录将数据包发送到repeater,使用jwt editor 生成symmetric key

2.将k改成AA==,AA==是空的base64编码

3.回到repeater模块的json web token,将kid改成../../../../../../../dev/null,跳出到根目录的/dev/null,administrator记得修改

4.签名jwt,点Sign选择刚刚生成的key,确认

5,成功200