前言
basectf2024遇到的,学习并记录
一、什么是JWT?
JWT即Json Web Token的缩写,顾名思义,是Token的一种。它常被用来在向服务器发起请求时用作身份认证。
了解一下格式
JWT由三部分组成,类似于xxx.yyy.zzz,前两部分是base64编码的内容,第三部分是加密的签名部分。
第一部分被称为header,会说明字符串的类型以及加密方式,用base64编码
第二部分被称为payload,包含用户的身份id,是否是管理权限等字段,这部分中的相关字段可以根据实际情况自行定义。用base64编码
第三部分是加密部分,对前面的“xxx.yyy”用头部中声明的加密方法进行加密,保证JWT的完整性。
如图:

推荐网站JSON Web Tokens - jwt.io 这里可以进行jwt的编码和解码

二、漏洞注入流程
用ctfshow_web345举例


提示admin,抓包看看有没有其他信息

cookie里很明显的Jwt,去之前给的网站解码一下

根据提示,编码时把user改成admin
然后因为没有加密算法(没有的话就没有第三部分),jwt.io编码不了,就直接base64(第一第二部分由base64编码)
这里还有一个小细节,那个.是不需要base加密的,直接用下面的字符串base64编码。
|
|
最后就是,你需要访问/admin/路由,是admin文件夹里的index.php

三、简单绕过和题目考点
接下来是一些考点
改none
如果没有密钥的话,后端没有校验签名,则可以通过改alg的值改为none,来进行利用漏洞。省略抓包过程

改加密算法的话,这个网站不能编码,这里就用python脚本
|
|

(第一题不能用这个喔,起码我尝试后的结果是这样的)
后续抓包改bookie,进/admin/就行

弱密码
其实就是设置了个密钥,猜一下是123456

猜对了,然后就用脚本,编码一下。


爆破
[ubuntu/kali安装c-jwt-cracker-CSDN博客](https://blog.csdn.net/qq_74263993/article/details/145077681?ops_request_misc=%7B%22request%5Fid%22%3A%22d38a947a2bdd7d48c874d740e4cf62e4%22%2C%22scm%22%3A%2220140713.130102334..%22%7D&request_id=d38a947a2bdd7d48c874d740e4cf62e4&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-4-145077681-null-null.142^v102^pc_search_result_base1&utm_term= c-jwt-cracker&spm=1018.2226.3001.4187)
按照教程安装工具

之后就和之前一样,密钥也是对的

泄露公钥加密算法替换
rs256改成hs256
因为rs256是对称加密,所有信息都只用一个钥
hs256是非对称加密,使用私钥对消息进行签名并使用公钥进行身份验证。
改后就可以用公钥加密hs256的jwt,这个jwt是可以被后端认证的
本来是这样的,但是python脚本运行之后是没用的,要用JavaScript的环境
咱也没装nodejs,不过可以用在线环境https://lightly.teamcode.com/ (要钱的,只能当免费使用一下。。)
(记得装库)

泄露私钥
私钥用于加密rs256,之后的公钥认证是后端的事情,这里我们用python就可以解决,和上面一样,就不多说了。

小结
jwt还是比较简单的,这里一天就速成了,知识点都是按照ctfshow的顺序,并配合例题讲解了,这下jwt也算是通关了