LOADING

加载过慢请开启缓存 浏览器默认开启

2024/5/5

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漏洞利用:

image:43538257467

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

image:45456357467

image:32453825754

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

image:4353784537

image:44784235347

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

image:345477627

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

image:435543773427

image:6765324467

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

image:324657853467

image:43267423467

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

image:6886453267

image:432546757657

image:6875347467

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

image:9874375267