目录
前言
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认证举例:
如上图,图中的1对应的是Header部分的编码后的样子,2对应的是Payload部分编码后的样子,3对应的是Signature编码后的样子。
JWT的安全性
从安全性的角度来看,至少存在两个潜在的问题。
1、缺乏机密性-我们能够轻松解码有效载荷payload(和报头header)。
2、用户插入另一个操作(例如删除)并绕过授权
案列演示之Leaky_JWT
靶场:https://authlab.digi.ninja/Leaky_JWT
如图这里因为是靶场所以直接把JWT给爆露出来,实战中我们可以去抓包,如果抓到的数据包中有类似这样的JWT认证,那我们就可以直接拿去解密了。我们拿到的数据是这样的:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsZXZlbCI6ImFkbWluIiwicGFzc3dvcmQiOiIyYWM5Y2I3ZGMwMmIzYzAwODNlYjcwODk4ZTU0OWI2MyIsInVzZXJuYW1lIjoiam9lIn0.6j3NrK-0C7K8gmaWeB9CCyZuQKfvVEAl4KhitRN2p5k
这是一个标准的JWT认证的格式,之前说了JWT格式分为三个部分,分别为Header、Payload、Signature,每个部分之间又以“.”号分割。
他这里的JWT认证是经过base64加密的,所以我们这里先要拿到base64解密网站去解密一下
base64在线加解密网址:http://www.jsons.cn/base64/
Header部分解密:
Payload部分解密:
我们这里看到了解密出来后的信息,password后面解出来的是一串md5数据,我们拿到md5网站去解密。
MD5在线解密网站:md5在线解密破解,md5解密加密
可以看到我们破解出来后的密码为:Password1
我们来登录一下:
显示登陆成功。
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签名算法的一个关卡
我们打开Burpsurite抓包,然后点击 Valite Token。
我们抓到如下数据包:
然后我们到JSON Web Tokens模块中查看,JSON Web Tokens是BurpSuite的一个扩展模块,他会自动识别有JWT认证的数据包,并处理。
我们这里可以看到这里的JWT认证已经被解密出来了,是一个经过HS256加密的JWT,payload部分也可以看出很多信息,事实上这里就存在了一个信息泄露的漏洞了。
我们看到如上图存在一个JWT认证,我们将其Headr部分拿去解密得到:
我们将其加密方式修改为None:
然后将其放到上面在加密:
得到这么一串数据,再将其替换到原本的数据包格式中:
然后我们在将payload的部分解密后修改:
修改为:
然后在重新给他加密一下:
得到这么一串数据,再将其放到原本属于payload的部分:
然后我们得到一个回显,显示签名是错误的:
我们这里直接把它的签名部分删掉,变成如下图所示,再重放包:
原本的用户数据是不是就被我们修改了呢:
对比
原本的:
修改后的:
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
二、安装依赖
pip install pycryptodomex
三、进入到安装目录
四、解密
python jwt_tool.py eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoicm9iaW4iLCJsZXZlbCI6InVzZXIifQ.oYPuxIPnm6lYx3Zx_8zaMGVw7Np5nZtgJVnaMqlZcOQ
漏洞利用
1.签名算法可被修改为none(CVE-2015-9235)
使用jwt_tool进行攻击(该工具适用于不改变原有payload的数据的基础上而没有签名算法获得的token)
使用这个漏洞模块可以将原本的加密的算法修改为None,然后我们就可以直接去执行一些越权修改payload等操作。
python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczpcL1wvZGVtby5zam9lcmRsYW5na2VtcGVyLm5sXC8iLCJpYXQiOjE2NjI3Mzc5NjUsImV4cCI6MTY2MjczOTE2NSwiZGF0YSI6eyJoZWxsbyI6IndvcmxkIn19.LlHtXxVQkjLvW8cN_8Kb3TerEEPm2-rAfnwZ_h0pZBg -X a
得到签名算法为none/NONE/None/nOnE认证的token 。
2、JWKS公钥 注入 ——伪造密钥(CVE-2018-0114)
jwk是header里的一个参数,用于指出密钥,存在被伪造的风险。 攻击者可以通过以下方法来伪造JWT:删除原始签名,向标头添加新的公钥,然后使用与该公钥关联的私钥进行签名。
python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.aqNCvShlNT9jBFTPBpHDbt2gBB1MyHiisSDdp8SQvgw -X i
执行后我们得到了一串很长的密钥,这串密钥删除了原始的签名,在Header中添加了新的公钥,再使用与该公钥关联的私钥进行签名:
3、空签名(CVE-2020-28042)
从令牌末尾删除签名
python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.aqNCvShlNT9jBFTPBpHDbt2gBB1MyHiisSDdp8SQvgw -X n
jwt-cracker
该工具仅限于单一的签名算法(HS256) ,如果提供了不同的签名算法,则无法进行操作 。
用法就是命令后面直接加上JWT数据,他会一直给你进行爆破,直到爆破成功。
c-jwt-cracker
c-jwt-cracker是暴力破解 JWT 私钥的工具。
使用c-jwt-cracker需要我们在我们linux里安装好openssl头文件。
apt-get install libssl-dev
下载好c-jwt-cracker,还需要我么在工具所在目录执行make命令。目的是让文件makefile运行起来。编译完后会生成一个jwtcrack文件。