『红蓝对抗』JWT 攻击手法

admin 2023年6月5日23:17:29评论66 views字数 2907阅读9分41秒阅读模式

点击蓝字 关注我们


日期:2023-04-17
作者:Yukong
介绍:关于JWT的一些攻击手法。

0x00 JWT介绍

JWTJSON Web Token的缩写,一种基于JSON的开放标准(RFC 7519)。将用户信息加密到token里,服务器不保存任何用户信息,只保存密钥信息,通过使用特定加密算法验证token,通过token验证用户身份。基于token的身份验证可以替代传cookie+session身份验证方法。

JWT的格式如下:

eyJraWQiOiJrZXlzLzNjM2MyZWExYzNmMTEzZjY0OWRjOTM4OWRkNzFiODUxIiwidHlwIjoiSldUIiwiYWxnIjoiUlMyNTYifQ.eyJzdWIiOiJkdWJoZTEyMyJ9.XicP4pq_WIF2bAVtPmAlWIvAUad_eeBhDOQe2MXwHrE8a7930LlfQq1lFqBs0wLMhht6Z9BQXBRos9jvQ7eumEUFWFYKRZfu9POTOEE79wxNwTxGdHc5VidvrwiytkRMtGKIyhbv68duFPI68Qnzh0z0M7t5LkEDvNivfOrxdxwb7IQsAuenKzF67Z6UArbZE8odNZAA9IYaWHeh1b4OUG0OPM3saXYSG-Q1R5X_5nlWogHHYwy2kD9v4nk1BaQ5kHJIl8B3Nc77gVIIVvzI9N_klPcX5xsuw9SsUfr9d99kaKyMUSXxeiZVM-7os_dw3ttz2f-TJSNI0DYprHHLFw

『红蓝对抗』JWT 攻击手法

.分割的三部分组成,这三部分依次是:

  • 标头(Header):标头通常由两部分组成:令牌的类型,即JWT;以及所使用的签名算法,例如 HMAC SHA256RSA

  • 有效载荷(Payload):包含声明。声明是关于实体(通常是用户)和附加数据的声明。声明分为三种类型:注册声明、公共声明和私人声明。

  • 签名(Signature):标头、有效载荷、密钥、标头中指定的算法,对其进行签名。

0x01 身份验证和获取JWT令牌

『红蓝对抗』JWT 攻击手法
  1. 用户使用用户名和密码,并经过服务器验证成功后登录;

  2. 服务器创建一个新令牌;

  3. 并将此令牌返回给客户端;

  4. 此后用户浏览器要携带token,去向服务端发送请求;

  5. 服务器读取令牌,并在成功验证后首先验证签名;

  6. 合法则返回对应的信息给用户。

更多具体内容请参考:https://jwt.io/introduction

『红蓝对抗』JWT 攻击手法

0x02 攻击方式

2.1 空加密算法攻击

JWT支持使用空加密算法,可以在header中指定algNone,同时把signature设置为空(即不添加signature字段),提交到服务器,任何token都可以通过服务器的验证

(1)以Tom身份登录,点击重置投票,系统提示只有admin才可以重置:

『红蓝对抗』JWT 攻击手法

(2)使用burp抓包,看到token,进行JWT解密:

『红蓝对抗』JWT 攻击手法

解密工具:https://github.com/ticarpi/jwt_tool

python jwt_tool.py <JWT>    # 自动解密JWT

『红蓝对抗』JWT 攻击手法

(3)将headeralg的加密算法改为nonepayloadadmin的值改为true

python jwt_tools.py <jwt> -T        # 进入交互式修改JWT的值

『红蓝对抗』JWT 攻击手法
『红蓝对抗』JWT 攻击手法

(4)删除最后的签名字段,替换burp中的access_token,并发送,可以绕过admin权限:

『红蓝对抗』JWT 攻击手法

2.2 未校验签名

某些服务端并未校验JWT签名,可以尝试修改signature后(或者直接删除signature),查看其是否还有效。

(1)在请求头Authorization中发现了JWT字段,发送包提示JWT已失效:

『红蓝对抗』JWT 攻击手法

(2)使用在线解密平台解密JWThttps://jwt.io/#debugger

『红蓝对抗』JWT 攻击手法

(3)发现有效时间截止至2018年,修改exp字段改为未来时间,并删除签名字段:

『红蓝对抗』JWT 攻击手法

『红蓝对抗』JWT 攻击手法

2.3 爆破密钥

有密码验证的地方就会有爆破,不过JWT的密钥爆破需要一定的前提条件:

  • 已知JWT使用的加密算法

  • 已知一段有效的、已签名的token

  • 签名使用的密钥是弱密钥(可以爆破出来)

(1)已知一段JWT,进行解密得到加密算法为HS256,并且该用户为Tom

『红蓝对抗』JWT 攻击手法

(2)利用该JWTjwt_tool对密钥进行暴力破解:

python jwt_tools.py <jwt> -C -d 字典
『红蓝对抗』JWT 攻击手法

(3)爆破出密钥为victory,根据题目要求将用户改为WebGoat,同时此题存在时间校验,需要将exp中的时间改为未来时间,进行重新加密:

『红蓝对抗』JWT 攻击手法

『红蓝对抗』JWT 攻击手法

2.4 修改 KID 参数

KIDjwt header中的一个可选参数,全称是key ID,它用于指定加密算法的密钥,因为该参数可以由用户输入,所以也可能造成一些安全问题。格式如下:

{  "typ": "JWT",  "kid": "webgoat_key",  "alg": "HS256"}

1、任意文件读取

KID参数用于读取密钥文件,但系统并不会知道用户想要读取的到底是不是密钥文件,所以,如果在没有对参数进行过滤的前提下,攻击者是可以读取到系统的任意文件的。

{  "typ": "JWT",  "kid": "/etc/passwd",  "alg": "HS256"}

2、SQL注入

KID也可以从数据库中提取数据,这时候就有可能造成SQL注入攻击,通过构造SQL语句来获取数据或者是绕过signature的验证

(1)例如:要求删除Tom的账户信息,此时登录的用户为Jerry

『红蓝对抗』JWT 攻击手法

(2)存在KID字段尝试注入,将KID值修改为SQL语句,username改为Tom,签名密钥与SQL语句相同,例如SQL语句中为3base64编码Mw==,所以此时签名密钥写3

『红蓝对抗』JWT 攻击手法

(3)删除成功:

『红蓝对抗』JWT 攻击手法

3、命令注入

KID参数过滤不严也可能会出现命令注入问题,但是利用条件比较苛刻。如果服务器后端使用的是Ruby,在读取密钥文件时使用了open 函数,通过构造参数就可能造成命令注入。

{  "typ": "JWT",  "kid": "/path/to/key_file|whoami",  "alg": "HS256"}

0x04 总结

JWT具有方便解析,服务端不保存用户信息,不用做sessonid复制,可以避免CSRF漏洞攻击等优点,日常渗透和漏洞挖掘过程中使用这种认证方式的系统也越来越常见,学习并掌握JWT的相关攻击手法是必不可少的。

『红蓝对抗』JWT 攻击手法

参考文章

https://jwt.io/introduction

免责声明:本文仅供安全研究与讨论之用,严禁用于非法用途,违者后果自负。


点此亲启

ABOUT US

宸极实验室隶属山东九州信泰信息科技股份有限公司,致力于网络安全对抗技术研究,是山东省发改委认定的“网络安全对抗关键技术山东省工程实验室”。团队成员专注于 Web 安全、移动安全、红蓝对抗等领域,善于利用黑客视角发现和解决网络安全问题。

团队自成立以来,圆满完成了多次国家级、省部级重要网络安全保障和攻防演习活动,并积极参加各类网络安全竞赛,屡获殊荣。

对信息安全感兴趣的小伙伴欢迎加入宸极实验室,关注公众号,回复『招聘』,获取联系方式。

『红蓝对抗』JWT 攻击手法

原文始发于微信公众号(宸极实验室):『红蓝对抗』JWT 攻击手法

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年6月5日23:17:29
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   『红蓝对抗』JWT 攻击手法https://cn-sec.com/archives/1676473.html

发表评论

匿名网友 填写信息