初识JWT

JWT全名JSON Web Token,是一串带有验证信息的字符串,由服务端使用加密算法对信息签名,以保证其完整性和不可伪造性。Token里可以包含所有必要的信息,可以减轻服务器存放用户信息的负担,JWT可用于身份验证,会话维持以及信息交换等

JWT结构

JWT由三部分组成,他们之间用点连接 Header、Payload、Signature Header部分表示token的类型和算法名称 Payload部分是一些用户和其他数据的声明 Signature是签名部分,签名是用于验证消息在传递过程中有没有被更改

JWT工作原理

1、客户端登录后,用户名和密码发送至服务器 2、服务器在身份确认后生成带有登陆信息的JSON头和声明,使用指定的secret进行签名,生成JWT并通过响应返回给客户端 3、客户端在下次访问服务器时会自动将JWT通过HTTP头提交 4、服务器验证JWT,验证成功的话则确认登陆状态

漏洞利用

这里使用[HFCTF2020]EasyLogin赛题来学习JWT的漏洞利用 开启环境访问得到这样一个页面 F12在源码中找到app.js文件,文件里发现提示 这里的koa-static是框架名,去网络上查找这个框架的结构可知这个app.js是项目的入口,而逻辑代码是controllers下的api.js(路由) 这页是最关键的js文件 通过简单的审计可知登陆注册登出获得flag等功能都写在这里 在回去测试登录窗口,发现admin账户无法注册,普通账户注册后无法getflag 回来继续审计api.js 这里应该就是无法注册admin账户并且非admin1账户无法getflag的原因了 这里是jwt代码 注册一个123的账户,登陆时抓包分析一下 这里三个使用点隔开的字符很明显是JWT,解码看一下 可以看到用户名密码等信息,可以确定是JWT,那么思路是将用户名伪造成admin,把algorithm的加密制空,同时用[]数组去绕过对secretid的判断,但是在这里直接更改后再加密需要密钥,这里的密钥需要去爆破比较麻烦,所以采用python脚本直接生成 得到JWT的Header部分和Payload部分,因为加密方法制空所以第三段也为空 抓包修改POST参数同时替换掉JWT,放包即可看到以ADMIN身份登入

总结

发现jwt漏洞主要是靠代码审计和和对jwt结构的辨识 jwt漏洞利用有三种方法: 1、篡改签名算法为none 2、对签名密钥进行爆破(概率) 3、伪造密钥