JWT漏洞学习

什么是JWT?

JWT是JSON Web Token的缩写,它是一串带有声明信息的字符串,由服务端使用加密算法对信息签名,以保证其完整性和不可伪造性。Token里可以包含所有必要的信息,这样服务端就无需保存任何关于用户或会话的信息了。JWT可用于身份认证,会话状态维持以及信息交换等任务。

JSON Web令牌结构是什么?

JWT由三部分构成,分别称为header,payload和signature,各部分用“.”相连构成一个完整的Token,形如xxxxx.yyyyy.zzzzz

下面一张图明确显示了该结构:

令牌是base64编码的,由三部分组成header.claims.signature。该令牌的解码版本为:

{
"alg":"HS256",
"typ":"JWT"
}
.
{
"exp": 1416471934,
"user_name": "user",
"scope": [
"read",
"write"
],
"authorities": [
"ROLE_ADMIN",
"ROLE_USER"
],
"jti": "9bc92a44-0b1a-4c5e-be70-da52075b9a84",
"client_id": "my-client-with-secret"
}
.
qxNjYSPIKSURZEMqLQQPw1Zdk6Le2FdGHRYZG7SQnNk

令牌数据解码

由于Header和Payload部分是使用可逆base64方法编码的,因此任何能够看到令牌的人都可以读取数据。

要读取内容,您只需要将每个部分传递给base64解码函数,以下是一些示例:

Linux base64工具(带有-d标志用于解码):

$ echo eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9 | base64 -d
{"typ":"JWT","alg":"HS256"}

浏览器JavaScript控制台:

>> atob("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9")
"{"typ":"JWT","alg":"HS256"}"

Powershell:

PS C:\> [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64Strin
g("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9"))
{"typ":"JWT","alg":"HS256"}

Pyhton:

>>> import base64
>>> print(base64.b64decode('eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9'))
{"typ":"JWT","alg":"HS256"}

靶场练习

靶场下载

实验使用靶场:WEBGOAT

https://github.com/WebGoat/WebGoat/releases/download/v8.0.0.M17/webgoat-server-8.0.0.M17.jar

如何运行:

java -jar webgoat-server-8.0.0.M17.jar

访问http://localhost:8080/WebGoat/即可。

特征识别

首先我们需要识别应用程序正在使用JWT,最简单的方法是在代理工具的历史记录中搜索JWT正则表达式:

[= ]ey[A-Za-z0-9_-]*\.[A-Za-z0-9._-]*         -网址安全的JWT版本
[= ]ey[A-Za-z0-9_\/+-]*\.[A-Za-z0-9._\/+-]* -所有JWT版本(可能误报)

以burpsuite举例,在Proxy-HTTP history-File by search term中填入上诉正则表达式,切记勾选“区分大小写”和“正则表达式”选项:

靶场实验

Page4

GET /WebGoat/JWT/votings HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
X-Requested-With: XMLHttpRequest
Connection: close
Referer: http://localhost:8080/WebGoat/start.mvc
Cookie: access_token=eyJhbGciOiJIUzUxMiJ9.eyJpYXQiOjE2MDYzNTgwNzAsImFkbWluIjoiZmFsc2UiLCJ1c2VyIjoiVG9tIn0.uuxUOl2GoZaVEY8TsKJte0adKMGVd5Eywu3ys-nNIetgg0vfPLC68mMoat-Pp9z20it0AzFfEEEy2YgIZXJKEg; JSESSIONID=6C55033D91301896A8FAB9BA824DDDDC
X-Forwarded-For: 127.0.0.1

token:

eyJhbGciOiJIUzUxMiJ9.eyJpYXQiOjE2MDYzNTgwNzAsImFkbWluIjoiZmFsc2UiLCJ1c2VyIjoiVG9tIn0.uuxUOl2GoZaVEY8TsKJte0adKMGVd5Eywu3ys-nNIetgg0vfPLC68mMoat-Pp9z20it0AzFfEEEy2YgIZXJKEg

解码:

Headers = {
"alg": "HS512"
} Payload = {
"iat": 1606358070,
"admin": "false",
"user": "Tom"
} Signature = "uuxUOl2GoZaVEY8TsKJte0adKMGVd5Eywu3ys-nNIetgg0vfPLC68mMoat-Pp9z20it0AzFfEEEy2YgIZXJKEg"

使用JWT_TOOL进行漏洞检测

显示存在"alg":"none"

更改Headers 中"alg"为none,Payload中"admin"为true.

注:https://jwt.io/ 该平台不能把alg更改为none,有些师傅使用该平台得到token也是神了,可以使用burpsuite中的Decoder模块,麻烦模仿别人博客的师傅自己实验一下好吧。

Page5

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJXZWJHb2F0IFRva2VuIEJ1aWxkZXIiLCJpYXQiOjE1MjQyMTA5MDQsImV4cCI6MTYxODkwNTMwNCwiYXVkIjoid2ViZ29hdC5vcmciLCJzdWIiOiJ0b21Ad2ViZ29hdC5jb20iLCJ1c2VybmFtZSI6IlRvbSIsIkVtYWlsIjoidG9tQHdlYmdvYXQuY29tIiwiUm9sZSI6WyJNYW5hZ2VyIiwiUHJvamVjdCBBZG1pbmlzdHJhdG9yIl19.m-jSyfYEsVzD3CBI6N39wZ7AcdKdp_GiO7F_Ym12u-0

base64解码后的令牌

{
"typ":"JWT",
"alg":"HS256"
}
.
{
"iss":"WebGoat Token Builder",
"iat":1524210904,
"exp":1618905304,
"aud":"webgoat.org",
"sub":"tom@webgoat.com",
"username":"Tom",
"Email":"tom@webgoat.com",
"Role":[
"Manager",
"Project Administrator"]
}
.
m-jSyfYEsVzD3CBI6N39wZ7AcdKdp_GiO7F_Ym12u-0

使用JWT_TOOL跑密钥。

python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJXZWJHb2F0IFRva2VuIEJ1aWxkZXIiLCJpYXQiOjE1MjQyMTA5MDQsImV4cCI6MTYxODkwNTMwNCwiYXVkIjoid2ViZ29hdC5vcmciLCJzdWIiOiJ0b21Ad2ViZ29hdC5jb20iLCJ1c2VybmFtZSI6IlRvbSIsIkVtYWlsIjoidG9tQHdlYmdvYXQuY29tIiwiUm9sZSI6WyJNYW5hZ2VyIiwiUHJvamVjdCBBZG1pbmlzdHJhdG9yIl19.m-jSyfYEsVzD3CBI6N39wZ7AcdKdp_GiO7F_Ym12u-0 -C -d 20k.txt

然后更改Payload中“username”为WebGoat,使用破解的密钥victory生成新的token。

Page7

从题目大意来讲是以Tom的身份来购买这些物品,查看他给出的链接:http://localhost:8080/WebGoat/images/logs.txt 里面有一串token

eyJhbGciOiJIUzUxMiJ9.eyJpYXQiOjE1MjYxMzE0MTEsImV4cCI6MTUyNjIxNzgxMSwiYWRtaW4iOiJmYWxzZSIsInVzZXIiOiJUb20ifQ.DCoaq9zQkyDH25EcVWKcdbyVfUL4c9D4jRvsqOqvi9iAd4QuqmKcchfbU8FNzeBNF9tLeFXHZLU4yRkq-bjm7Q

解码:

考虑到题目给出的是令牌刷新,所以这因为是令牌过期的问题,直接查看"iat"和"exp"

使用python查看当前时间

>python3
>import time;
>time.time();

修改完exp之后把"admin"改为true,"alg"改为none,可以使用burpsuite的JOSEPH插件进行改编码

请求包添加“Authorization” 字段,然后把token加入即可。

Page8

请求包如下:

token:

eyJ0eXAiOiJKV1QiLCJraWQiOiJ3ZWJnb2F0X2tleSIsImFsZyI6IkhTMjU2In0.eyJpc3MiOiJXZWJHb2F0IFRva2VuIEJ1aWxkZXIiLCJpYXQiOjE1MjQyMTA5MDQsImV4cCI6MTYxODkwNTMwNCwiYXVkIjoid2ViZ29hdC5vcmciLCJzdWIiOiJqZXJyeUB3ZWJnb2F0LmNvbSIsInVzZXJuYW1lIjoiSmVycnkiLCJFbWFpbCI6ImplcnJ5QHdlYmdvYXQuY29tIiwiUm9sZSI6WyJDYXQiXX0.CgZ27DzgVW8gzc0n6izOU638uUCi6UhiOJKYzoEZGE8

解码:

常规思路是把"alg"改为none,username改为Tom.

另外一种应该是使用"kid"进行注入。(没试验过)

相关资料

https://www.cnblogs.com/yh-ma/p/10271720.html

https://www.cnblogs.com/xiaozi/p/12031111.html

https://www.cnblogs.com/xiaozi/p/12005929.html

https://emtunc.org/blog/11/2017/jwt-refresh-token-manipulation/

https://www.freebuf.com/vuls/211842.html

https://jwt.io/

最新文章

  1. 如何安装并使用hibernate tools
  2. 《利用Python进行数据分析》第5章学习笔记
  3. PHP-CS-Fixer:格式化你的PHP代码
  4. Nancy 学习-视图引擎 继续跨平台
  5. hdu.1067.Gap(bfs+hash)
  6. JAVA第三周作业
  7. mysqldump 使用 --set-gtid-purged
  8. tachyon 本地模式安装
  9. ios 视频音乐播放
  10. 深度模拟java动态代理实现机制系类之二
  11. Android WebRTC视频旋转问题
  12. Java String.contains()方法(转载)
  13. Linux 双网卡绑定技术
  14. zoj 3204 Connect them
  15. [asp.net mvc 奇淫巧技] 04 - 你真的会用Action的模型绑定吗?
  16. 用 Eclipse 搭建一个简单的 Maven spring mybatis 项目(包含测试用例)
  17. 阿里巴巴AI Lab成立两年,都做了些什么?
  18. 从.Net到Java学习第十篇——Spring Boot文件上传和下载
  19. macbook air 2012 mid 安装 windows10 双系统遇到错误 no bootable device insert boot disk and press any key
  20. 如何使用jQuery从字符串中删除最后一个字符

热门文章

  1. 001 手把手用Git,Git从入门到上传本地项目到Github,看这篇就够了
  2. 基于SqlSugar的开发框架循序渐进介绍(8)-- 在基类函数封装实现用户操作日志记录
  3. 牛亚男:基于多Domain多任务学习框架和Transformer,搭建快精排模型
  4. 《ECMAScript 6 入门》【二、变量的解构赋值】(持续更新中……)
  5. android stdio开发抖音自动点赞案例
  6. Pytorch从0开始实现YOLO V3指南 part5——设计输入和输出的流程
  7. 现代化CSS
  8. Mysql数据库的默认引擎
  9. Redis系列3:高可用之主从架构
  10. IIS部署的H5的单页面跳转的配置