JWT
1、定义
JSON Web Token(Json web令牌)是一种跨域验证身份的方案,JWT不加密传输的数据,但能够通过数字签名来验证数据未被篡改。
2、与传统的token认证方式的对比
传统的token认证:用户登录后,服务端会返回一个token给客户端,客户端下次再访问时,携带token访问,服务端获取客户端token后与后端保存的token做校验。
JWT的token认证:同样,用户登录后,服务端会返回一个token给客户端,下次再访问时,客户端同样需要携带token进行访问,但这次服务端没有保存上一次访问的token,这次服务端拿到用户的token后,会通过JWT特有的格式对用户进行身份验证,一般都是比对jwt的签名是不是用户,不是用户的JWT格式将登录不成功。
最大的区别就是JWT的token不需要保存在服务端,在一定程度上可以减轻系统资源的占用。
3、JWT的原理与格式
原理:用户登录后,服务端用JWT返回一个token给用户这个token首先先生成一个json对象,json对象类似于如下:
{
"name":"xiaowang",
"age":"20岁"
}
生成的josn对象最终经过base64编码后成为一个jwt的token返回给用户。
jwt 的token实际是由三部分组成,类似于如下:
·
这三部分分别是
头部(header),经过解码后类似于:
alg表示token签名时用到的算法、tye表示token的类型。
这里面放的一般就是用户数据的一些字段。
签名(signature)
用户的签名就在里面
上面即是JWT的一些格式和原理讲解,下面将是jwt伪造登录的讲解。
验证
jwt登录的同时也带来了一定的安全问题,以一个平台的靶场环境为例
进入它提供的靶场环境后发现是一个登录框,先注册一个账号,登录时用抓包工具抓取一下数据包
从数据包最下面那行可以看出它是用JWT的token去进行验证,可以考虑是否存在登录伪造问题,复制一下数据包,然后把包放出去我们可以看到一个提示,提示flag就在里面,但当我们点击进去的时候发现没有权限查看,如下:
此时想到开启靶场时提示有node js ,还提到它的登录界面,查阅相关资料后发现nodejs有一个重要的文件controllers/api.js,在网址后面加入该文件后,发现页面源码意思为让我们伪造admin用户登录,此时将我们刚刚抓取的登陆包的JWTtoken 提取出来修改为admin的token,并用base64加密,如下:
头部
alg的值修改为none,即后面可以不签名直接登录
声明
secretid的值为[],意思为后面签名的密钥为空,然后将username的值修改为admin进行伪造登录
签名部分的编码值不需添加,删除即可
重新登录并抓取数据包并将数据包的token换成上面修改的token,username修改为admin,放包返回登录页面即可以admin身份进行伪造登录,且成功绕过用户签名并拿到该题的flag。
注意的是,人们看到token第一印象可能都是防CSRF想着破解token等,而且这种安全问题并不常见,首先数据包的格式要满足JWT的token格式才可以进行后续的测试,其次还要满足是nodejs开发,没拿到cms的情况下你可能还要去猜它的构造,在后续测试过程中也可能遇到waf产品拦截等问题,总之具体情况具体分析。