[HFCTF2020]EasyLogin(koa&jwt欺骗)
首先我们注册一个账号登录
进去后没有flag
我们查看源码
但源码并没有直接显示出来,经过一番寻找,我们发现源码在
1 | /** |
源码提示使用koa框架,我们了解一下koa目录的基本结构
我们访问controllers下的api.js找到主要逻辑代码
1 | const crypto = require('crypto'); |
我们进行代码审计,发现用户必须是admin才能得到flag
因此,我们需要登录admin账号
由于页面在注册时会生成一个jwt
所以我们可以通过jwt欺骗来登录admin账号
我们再次登录抓包得到我们自己账号的jwt
放入网站进行分析
按要修改的值修改,由于要修改alg为none,在网页上无法直接获取新的jwt,所以用python脚本生成,在此之前先用pip安装好生成jwt的库:PyJWT库。
1 | import jwt |
我们以admin账号登录,密码为设置的值,抓包将jwt修改为我们之后修改的值
登录成功后,我们访问api/flag得到flag
jwt
JWT的结构
- 一个JWT由三部分组成,他们之间通过一个点号”.”分隔:
- 头部Header
- 载体Payload
- 签名Signature
- header通常由两部分组成:token的类型,以及所使用的hash算法:
1 | { |
载体(payload)
部分是我们真值想要发送的数据所在,下面是一个载体的示例,真正的载体一般会更为复杂,以确保更好的安全性。
1 | { |
签名(Signature)
用于验证数据在到达目的地之前未被更改。通常使用的私钥。- 这三部分通常放一起编码为base64格式,并以”.”分隔。想要了解更多关于
JWT
的内容,请参考https://jwt.io/。 - 现在我们对JWT有个基本的了解了,接下来看看如何搭建一个简单的验证服务器来处理JWT,提供API供我们访问。