JWT攻击
2024-04-09 23:20:55  阅读数 2065

JWT攻击

1.jwt是什么

Json web token(JWT),是为了在网络应用环境间传递声明而执行的一中基于JSON的开放标准。常用于分布式站点的单点登录。

JWT的声明一般被用在客户端与服务端之间传递身份认证信息,便于向服务端请求资源。

1.1.原理

1)客户端提交用户名密码等信息到服务端请求登录,服务端在验证通过后前发一个具有时效性的token,将token返回给客户端

2)客户端收到token后会将token存储在cookie或localStorage中

3)随后客户端每次请求都会携带这个token,服务端收到请求后校验该token并在验证通过后返回对应资源

2.起源

基于传统的session认证看jwt的起源

2.1.session认证

解决http协议本身并不能记录状态问题,session在每一次会话开始时产生,用于存放会话信息,每个session以键值对的方式生成(session_id=session),将session_id以cookie的形式(set-cookie)返回给客户端,客户端再次请求时携带session_id,服务端根据session_id使用对应的session作为认证信息为客户端响应对应服务

2.2.传统session认证问题

1)服务端开销问题:由于认证信息存储在服务端,当认证用户量增加时,服务端开销会明显增大

2)扩展性不佳:由于存储在服务器端,意味着后续的请求也必须是在同一台服务器上才能响应对应资源,对于分布式应用,限制了负载均衡的能力以及应用扩展能力

3)CSRF攻击:由于存储在浏览器cookie中,CSRF攻击时,网站校验浏览器中cookie后会认为时用户本人操作

2.3.token与session区别

由上面的原理来看其实两者是十分类似的,但实际上,session的认证信息是存储在服务端,客户端的session_id仅仅是session的标识符,而token本身就是携带认证信息的。而且由于token是可以通过一定的手段在请求时与cookie分离独立出一个首部字段,故token是可以防御csrf攻击的。其二token机制服务端是不存储相关认证信息的,只是对token做解密并根据解密信息查询用户信息,故对于服务端的开销更小,也更利于分布式服务器应用的扩展

3.JWT结构与内容

3.1.形式

一般是一段eyJ开头,由英文点分割开的三段字符

image_yXciHi5KqO.png

3.2.结构与内容

三段字符串分别对应:

1)Header:加密算法与Token类型;

2)Payload:用户信息和附加信息的声明,一般是Json类型的键值对;

3)Signature:

①base64加密后的Header

②base64加密后的Payload

③签名加密算法私钥。

image_mvNh9esoLk.png

4.JWT攻击

4.1.JWT识别

根据上述特征识别,或在burp中使用正则匹配查找

eyJ[A-Za-z0-9_-]*\.[A-Za-z0-9._-]*

4.2.攻击思路

首先找到需要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注入问题

5.实战靶场

靶场地址:Authentication Lab (digi.ninja)

5.1.敏感信息泄露

Leaky JWT

image_yoItQPm7Nw.png

题目大意为:签名后的JWT看似是加密数据,实际上是极易解密的,若开发者在生成token时将非必要的信息放入到payload中,则可能造成敏感信息泄露,图中模拟我们已经获取到了某位用户的token,要求使用这段token信息进行登录。

首先将已经获得的token放入解密网站解密:

image_1XldjUqQPS.png

可以看到payload部分存在权限,用户名以及密码信息,存在不必要的用户密码字段。解密出的密码字段为密码,猜测为MD5加密,利用在线解密工具解出密码为Password1

image_7r3gewLXLB.png

回到靶场使用泄露的用户名密码成功登录

image_qQVui-QR_z.png

5.2.空加密算法破解JWT

image_fYN2rpuF5n.png

题目大意为:JWT一般使用HMAC和RSA两种加密算法进行签名,某些服务端也允许使用"none"算法进行签名(空加密算法)。

这里用到了burp的一款插件,名为Json Web Token Attacker,在Burp自带的扩展商店中便能找到安装

image_B1FwryyzCp.png

本插件在识别到请求包中包含JWT时便会将对应请求包标记为蓝色

image_t3vWcOD6Mn.png

回到靶场,点击Validate Token(验证token)

image_fL1Rmp6M29.png

可以看到当前token用户为robin,权限为user,我们查看burp中的请求包

image_MJKRf7mJJJ.png

将该请求包发送到重发器中,发现重发器中多了一项JWS,此项中可将JWT进行解密并对JWT签名进行攻击(替换加密算法,正常发包查看回包,发现回包中正是JWT中payload部分内容。

image_lHmUg7epYI.png

直接修改Payload内容重放,发现响应包提示签名无效

image_zCQ3WYRIqh.png

选择JWS下Attacker选项,选择Signature Exclusion,四种Payload都尝试一遍,发现None和NONE算法服务端是能够正常识别的,成功修改Payload并正常响应


image_of6mw4fQRQ.png

5.3.密钥爆破

使用工具c-jwt-cracker进行密钥爆破

工具地址:GitHub - brendan-rius/c-jwt-cracker: JWT brute force cracker written in C

靶场地址:https://authlab.digi.ninja/JWT_Cracking

image_129RrhCOg5.png

爆破结果如下图,分别为easy和Medium难度下的密钥

image_kK23L_6NOZ.png

进入jwy.io,使用获得的密钥重新签发token并修改Payload

image_MtTz9E9xae.png

测试有效

image_RZAY-CDmHj.png

Medium难度同理。