JWT渗透与攻防(一)

目录

前言

JWT漏洞介绍

案列演示之Leaky_JWT

 JWT漏洞具体的实现方式:

案列演示之JWT None Algorithm

JWT漏洞工具的利用

JWT利用工具介绍

jwt_tool

漏洞利用

jwt-cracker

c-jwt-cracker


前言

Json web token (JWT)相关漏洞对于渗透测试人员而言可能是一种非常吸引人的攻击途径,因为它们不仅是让你获得无限访问权限的关键,而且还被视为隐藏了通往以下特权的途径:特权升级,信息泄露,SQLi,XSS,SSRF,RCE,LFI等,在测试JWT时,通过对目标服务的Web请求中使用的Token进行读取,篡改和签名。

JWT漏洞介绍

什么是身份认证

身份认证(Authentication)又称“身份验证”、“鉴权”,是指通过一定的手段,完成对用户身份的确认。

Web服务目前认证的方式有:session+cookie、jwt、token

Session认证机制 需要配合Cookie才能实现。由于 Cookie默认不支持跨域访问 ,所以,当涉及到前端跨域请求后端接口的时候,需要做 很多额外的配置,才能实现跨域Session认证。

JWT的概念

JWT(英文全称:JSON Web Token)是一个开放标准(RFC 7519),用于在双方之间安全地表示声明。一种无状态的认证机制,通常用于授权和信息交换。是目前 最流行的跨域认证解决方案。

 JWT认证举例:

JWT渗透与攻防(一)_第1张图片

 如上图,图中的1对应的是Header部分的编码后的样子,2对应的是Payload部分编码后的样子,3对应的是Signature编码后的样子。

JWT的安全性

从安全性的角度来看,至少存在两个潜在的问题。


1、缺乏机密性-我们能够轻松解码有效载荷payload(和报头header)。
2、用户插入另一个操作(例如删除)并绕过授权

案列演示之Leaky_JWT

靶场:https://authlab.digi.ninja/Leaky_JWT

JWT渗透与攻防(一)_第2张图片

 如图这里因为是靶场所以直接把JWT给爆露出来,实战中我们可以去抓包,如果抓到的数据包中有类似这样的JWT认证,那我们就可以直接拿去解密了。我们拿到的数据是这样的:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsZXZlbCI6ImFkbWluIiwicGFzc3dvcmQiOiIyYWM5Y2I3ZGMwMmIzYzAwODNlYjcwODk4ZTU0OWI2MyIsInVzZXJuYW1lIjoiam9lIn0.6j3NrK-0C7K8gmaWeB9CCyZuQKfvVEAl4KhitRN2p5k

这是一个标准的JWT认证的格式,之前说了JWT格式分为三个部分,分别为Header、Payload、Signature,每个部分之间又以“.”号分割。

他这里的JWT认证是经过base64加密的,所以我们这里先要拿到base64解密网站去解密一下

base64在线加解密网址:http://www.jsons.cn/base64/

Header部分解密:

JWT渗透与攻防(一)_第3张图片

 Payload部分解密:

JWT渗透与攻防(一)_第4张图片

我们这里看到了解密出来后的信息,password后面解出来的是一串md5数据,我们拿到md5网站去解密。

MD5在线解密网站:md5在线解密破解,md5解密加密

可以看到我们破解出来后的密码为:Password1

JWT渗透与攻防(一)_第5张图片

 我们来登录一下:

JWT渗透与攻防(一)_第6张图片

 显示登陆成功。

JWT渗透与攻防(一)_第7张图片 

 JWT漏洞具体的实现方式:

1、算法为none
2、算法修改
3、签名失败问题
4、暴力破解
5、密钥泄露
6、令牌刷新

攻击思路

首先找到需要JWT鉴权后才能访问的页面,如个人资料页面,将该请求包重放测试:
(1)未授权访问:删除Token后仍然可以正常响应对应页面
(2)敏感信息泄露:通过JWt.io解密出Payload后查看其中是否包含敏感信息,如弱加密的密码等
(3)破解密钥+越权访问:通过JWT.io解密出Payload部分内容,通过空加密算法或密钥爆破等方式实现重新签发Token并修改Payload部分内容,重放请求包,观察响应包是否能够越权查看其他用户资料

(4)检查Token时效性:解密查看payload中是否有exp字段键值对(Token过期时间),等待过期时间后再次使用该Token发送请求,若正常响应则存在Token不过期
(5)通过页面回显进行探测:如修改Payload中键值对后页面报错信息是否存在注入,payload中kid字段的目录遍历问题与sql注入问题

案列演示之JWT None Algorithm

我们再来看一下有关于JWT签名算法的一个关卡

JWT渗透与攻防(一)_第8张图片

我们打开Burpsurite抓包,然后点击 Valite Token。

JWT渗透与攻防(一)_第9张图片

我们抓到如下数据包:

JWT渗透与攻防(一)_第10张图片

 然后我们到JSON Web Tokens模块中查看,JSON Web Tokens是BurpSuite的一个扩展模块,他会自动识别有JWT认证的数据包,并处理。

JWT渗透与攻防(一)_第11张图片

 我们这里可以看到这里的JWT认证已经被解密出来了,是一个经过HS256加密的JWT,payload部分也可以看出很多信息,事实上这里就存在了一个信息泄露的漏洞了。

JWT渗透与攻防(一)_第12张图片

 我们看到如上图存在一个JWT认证,我们将其Headr部分拿去解密得到:

JWT渗透与攻防(一)_第13张图片

 我们将其加密方式修改为None:

JWT渗透与攻防(一)_第14张图片

 

然后将其放到上面在加密:

JWT渗透与攻防(一)_第15张图片

 得到这么一串数据,再将其替换到原本的数据包格式中:

JWT渗透与攻防(一)_第16张图片

 然后我们在将payload的部分解密后修改:

JWT渗透与攻防(一)_第17张图片

 JWT渗透与攻防(一)_第18张图片

 修改为:

JWT渗透与攻防(一)_第19张图片

然后在重新给他加密一下:

JWT渗透与攻防(一)_第20张图片

 得到这么一串数据,再将其放到原本属于payload的部分:

JWT渗透与攻防(一)_第21张图片

然后我们得到一个回显,显示签名是错误的:

JWT渗透与攻防(一)_第22张图片

我们这里直接把它的签名部分删掉,变成如下图所示,再重放包:

JWT渗透与攻防(一)_第23张图片

原本的用户数据是不是就被我们修改了呢:

对比

原本的:

JWT渗透与攻防(一)_第24张图片

修改后的:

JWT渗透与攻防(一)_第25张图片

 

JWT漏洞工具的利用

JWT利用工具介绍

jwt_tool(git clone https://github.com/ticarpi/jwt_tool)可以用来验证、伪造和破解JWT令牌。

jwt-cracker
该工具仅限于单一的签名算法(HS256) ,如果提供了不同的签名算法,则无法进行操作
https://github.com/lmammino/jwt-cracker

c-jwt-cracker
同样是暴力破解 JWT 私钥的工具。
https://github.com/brendan-rius/c-jwt-cracker

jwt_tool

一、安装

git clone https://github.com/ticarpi/jwt_tool

JWT渗透与攻防(一)_第26张图片

 二、安装依赖

pip install pycryptodomex

三、进入到安装目录

JWT渗透与攻防(一)_第27张图片

 四、解密

python jwt_tool.py eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoicm9iaW4iLCJsZXZlbCI6InVzZXIifQ.oYPuxIPnm6lYx3Zx_8zaMGVw7Np5nZtgJVnaMqlZcOQ

JWT渗透与攻防(一)_第28张图片

JWT渗透与攻防(一)_第29张图片 

漏洞利用

1.签名算法可被修改为none(CVE-2015-9235)

使用jwt_tool进行攻击(该工具适用于不改变原有payload的数据的基础上而没有签名算法获得的token)

使用这个漏洞模块可以将原本的加密的算法修改为None,然后我们就可以直接去执行一些越权修改payload等操作。

python3 jwt_tool.py    eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczpcL1wvZGVtby5zam9lcmRsYW5na2VtcGVyLm5sXC8iLCJpYXQiOjE2NjI3Mzc5NjUsImV4cCI6MTY2MjczOTE2NSwiZGF0YSI6eyJoZWxsbyI6IndvcmxkIn19.LlHtXxVQkjLvW8cN_8Kb3TerEEPm2-rAfnwZ_h0pZBg  -X a

JWT渗透与攻防(一)_第30张图片

 得到签名算法为none/NONE/None/nOnE认证的token 。

 2、JWKS公钥 注入 ——伪造密钥(CVE-2018-0114)

jwk是header里的一个参数,用于指出密钥,存在被伪造的风险。 攻击者可以通过以下方法来伪造JWT:删除原始签名,向标头添加新的公钥,然后使用与该公钥关联的私钥进行签名。

python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.aqNCvShlNT9jBFTPBpHDbt2gBB1MyHiisSDdp8SQvgw      -X i

执行后我们得到了一串很长的密钥,这串密钥删除了原始的签名,在Header中添加了新的公钥,再使用与该公钥关联的私钥进行签名:

JWT渗透与攻防(一)_第31张图片

 3、空签名(CVE-2020-28042)

从令牌末尾删除签名

python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.aqNCvShlNT9jBFTPBpHDbt2gBB1MyHiisSDdp8SQvgw         -X n

JWT渗透与攻防(一)_第32张图片

 

jwt-cracker

该工具仅限于单一的签名算法(HS256) ,如果提供了不同的签名算法,则无法进行操作 。

用法就是命令后面直接加上JWT数据,他会一直给你进行爆破,直到爆破成功。

JWT渗透与攻防(一)_第33张图片

 JWT渗透与攻防(一)_第34张图片

 c-jwt-cracker

c-jwt-cracker是暴力破解 JWT 私钥的工具。

使用c-jwt-cracker需要我们在我们linux里安装好openssl头文件。

apt-get install libssl-dev

下载好c-jwt-cracker,还需要我么在工具所在目录执行make命令。目的是让文件makefile运行起来。编译完后会生成一个jwtcrack文件。

你可能感兴趣的:(Web漏洞,安全,web安全,网络安全)