目录
jwt由三个部分组成:header.payload.signature
什么是JWT?
JWT的全称是Json Web Token。将用户信息加密到token里,服务器不保存任何用户信息,只保存密钥信息,通过使用特定加密算法验证token;服务器通过密钥验证token的正确性,判断是否通过验证。jwt 之前,使用 session 来做用户认证,session需要服务器执行查询操作。
jwt由三个部分组成:header.payload.signature
令牌采用 base64-url 编码,由三部分组成。header.payload.signature 每一部分由.
进行链接而成,如下所示:
根据算法,签名将被添加到令牌中。这样,您可以验证某人没有修改令牌(对令牌的一次更改将使签名无效)。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
header部分:
{
"alg" : "HS256",
"typ" : "jwt"
}
payload部分:声明
{
"user_role" : "finn", //当前登录用户
"iss": "admin", //该JWT的签发者
"iat": 1573440582, //签发时间
"exp": 1573940267, //过期时间
"nbf": 1573440582, //该时间之前不接收处理该Token
"domain": "example.com", //面向的用户
"jti": "dff4214121e83057655e10bd9751d657" //Token唯一标识
}
signature部分:
signature的功能是保护token完整性。 生成方法为将header和payload两个部分联结起来,然后通过header部分指定的算法,计算出签名。
JWT验证过程:
1、用户访问网站,输入帐号密码登入
2、服务器校验通过后,生成JWT,不保存JWT,直接返回给客户端
3、客户端将JWT存入cookie或者localStorage
4、此后用户发起的请求,都将使用js从cookie或者localStorage读取JWT放在http请求的header中,发给服务端
5、服务端获取header中的JWT,用base64URL算法解码各部分内容,并在服务端用同样的秘钥和算法生成signature,与传过来的signature对比,验证JWT是否合法。
ctfhub-easy_login
目的:拿到flag
过程分析以及实操:
1、首先注册一个新用户(注册的时候可以使用bp抓包,查看数据包的内容,我们是否可以进行利用)
2、拿着我们注册的帐号密码进行登录(这里必须使用bp工具进行抓包,在数据包发现了JWT的相应内容)
使用JWT平台 JSON Web Tokens - jwt.io
3、我们的目的是拿到flag,登录成功后尝试拿flag(你以为就这么简单?当然不是,在getglag时候,提示我们的权限不够,也就是说,我们的权限很低,猜想应该是管理员权限,这里我尝试用admin 和 root试了下,不过第一次使用admin账户就成功了)
4、根据分析目标也就明确了,那就是将用户名ssss修改为admin,但是我们又没有signature签名(密匙),修改后肯定也不会成功啊,有没有什么手段,不需要拿到这个signature,就可以完成。
那就是修改我们的header部分和payload部分;
使用编码工具,base64编码格式
修改原因是这里代表是一种加密算法,我们将算法修改为none;
红色标记的内容是,使用第几个 signature 签名,我们将它也修改为空;
修改后的令牌:(每个人的肯定不一样)
ewogICJhbGciOiAibm9uZSIsCiAgInR5cCI6ICJKV1QiCn0.ewogICJzZWNyZXRpZCI6IFtdLAogICJ1c2VybmFtZSI6ICJhZG1pbiIsCiAgInBhc3N3b3JkIjogInNzc3MiLAogICJpYXQiOiAxNjc3OTg2OTUxCn0.
进行重新登录提交:(抓包少不了),
修改的内容
然后放包,这里就是以admin的身份到达服务端的,也就是说我们此时的权限为admin
点击getflag 抓包查看
我们的flag为:
{"flag":"ctfhub{327725b85023e9ff368d8036}\n"}