CTFhub里的easy_login writeup
CTFHub链接:CTFHub
JWT介绍参考链接:小迪安全学习笔记–第40和41天JAVA安全及预编译CASE注入等目录遍历访问控制XSS等安全问题_小迪安全笔记40_铁锤2号的博客-CSDN博客
先介绍什么是JWT:
什么是JWT?
JSON web Token (JSON web令牌是一种跨域验证身份的方案。JWT不加密传输的数据,但能够通过数字签名来验证数据未被篡改。
JwT分为三部分,头部(Header),声明(claims),签名(signature),三个部分以英文句号.隔开。JWT的内容以Base64URL进行了编码。
1)头部(Header)
{“alg”:“HS256”,
“typ” : ““JWT””}
alg:是说明这个JwT的签名使用的算法的参数,常见值用s256(默认),Hs512等,也可以为None。HS256表示HMAC SHA256。
typ:说明这个token的类型为JWT
2)JWT固定参数(声明段)有:
iss:发行人
exp:到期时间
sub:主题
aud:用户
nbf:在此之前不可用
iat:发布时间
jti: JWT ID用于标识该JWT
3)签名(signatura)
服务器有一个不会发送给客户端的密码(secret),用头部中指定的算法对头部和声明的内容用此密码进行加密,生成的字符串就是JwT的签名。
下面是一个用Hs256生成JwT的代码例子
HMACSHA256(base64UrlEncode (header) + “.”+base64URlEncode(payload) ,secret)
1、用户端登录,用户名和密码在请求中被发往服务器
2、(确认登录信息正确后)服务器生成json头部和声明,将登录信息写入JSON的声明中(通常不应写入密码,因为JWT是不加密的),并用secret用指定算法进行加密,生成该用户的JWT。此时,服务器并没有保存登录状态信息。
3、服务器将JWT (通过响应)返回给客户端
4、用户下次会话时,客户端会自动将JwT写在HTTF请求头部的Authorization字段中
5、服务器对JWT进行验证,若验证成功,则确认此用户的登录状态
下面是小迪老师总结的JWT漏洞利用:

打开靶场后看到是登录注册界面,分别对注册和登录抓包看看情况


在注册包里面没看到什么异常,但是在登录的包里看到了JWT的标志authorization(大概)


将该base64字段拿到https://jwt.io解密,分别得到头部、声明、签名三个字段,先保存下来

登录成功后看到flag will be here, 通过题目的提示,该代码使用的是nodejs编写的,所以跳到api配置文件 /controllers/api.js 下发现需要使用admin账号登录下访问/api/flag目录,且admin用户不能注册和直接登录,这时就需要使用JWT漏洞


将之前的头部和声明段分别放到base64编码下,将alg的值改为“none”并且把base64加密后的“=”去掉并保存,声明内容里的secretid值改为空即:”[]”,username的值改为“admin”进行base64编码去掉等号使用“.”拼接在头部后并且在最后添加“.”表示为声明字段为空(secretid值改为“[]”是通过代码审计得出,因为没学过java其中的值分析不了)


重新登录抓包将改完的值添加到authorization上并且将username改为admin即可登录成功



根据api配置文件,最后访问/api/flag得到flag
