安全矩阵

 找回密码
 立即注册
搜索
查看: 2199|回复: 0

基础14.1-JWT漏洞靶场及CTF实例

[复制链接]

991

主题

1063

帖子

4315

积分

论坛元老

Rank: 8Rank: 8

积分
4315
发表于 2022-1-23 14:54:43 | 显示全部楼层 |阅读模式
原文链接:基础14.1-JWT漏洞靶场及CTF实例


内容目录5.靶场演示
5.1 JWT身份验证绕过
5.2 JWT密钥爆破
5.3 JWT-修改伪造冒充
5.4 JWT安全之SQL注入
5.5 CTF实战案例(HFCTF 2020)

5.靶场演示-webGoat安装教程地址:https://www.cnblogs.com/lsdb/p/8881544.html
安装最新8.2的话jdk要最新版,所以使用8.1版即可。
5.1 JWT身份验证绕过


需要我们将令牌修改为管理员令牌,并重置投票


由于我们不知道密钥,所以签名是解不出来的。
不过我们可以看到,TOM用户在管理员判断上写的是false,所以我们第一步需要将false改为true。
但是这样改完后,签名是会变的,会导致校验错误。


那么我们就将header信息也改一下,他的签名不是HS512算法吗,我们将这里改为空-none,通过把算法置空,篡改身份来达到越权的目的。


修改完就是这样,放入burp。

5.2 JWT密钥爆破
需要将JWT中的账号改为WebGoat用户,然后重新加密后提交,因为第三部分是header和payload的base64然后加上秘钥hash的结果,hash的算法通过header部分就只能得到,所以需要爆破秘钥。


我们这里需要去下载一个常用密钥的字典。
地址:https://github.com/first20hours/google-10000-english


成功得到密钥为:availabl
然后我们去修改用户信息。


复制生成好的JWT,提交,过关。

5.3 JWT-修改伪造冒充
这一关要求我们利用TOM的身份去帮我们付款。(真是可怜的TOM)


这里有个日志,我们去查看一下。


解码出来发现是TOM的信息,我们使用tom的JWT提交看看。


所以我们需要去修改一下时间戳,和上题一样。
当然这里的签名也是可以通过写空绕过的。


修改进数据包并提交。


当然这里去爆破密钥也是完全可以的。
(操作就如上了)
5.4 JWT安全之SQL注入
下面你看到两个帐户,一个是杰瑞,一个是汤姆。杰瑞想从Twitter上删除Toms帐户,但他的令牌只能删除自己的帐户。你能帮他删除Toms帐户吗


点击删除Jerry,抓取数据包


发现JWT,解码看看


按照我们之前的思路来说就是改密钥算法为none,然后将Jerry改成Tom。
不过,这里是失败的,不可以。



不过我们注意到,头部信息中有一个值为kid,
kid是jwt header中的一个可选参数,全称是key ID,它用于指定加密算法的密钥。因为该参数可以由用户输入,所以可以造成一些安全问题。
KId处常出现SQL注入,文件读取,命令执行等漏洞,这里我们就测试一下sql注入漏洞。
这里and '1'='1 返回200

这里and '1'='2 返回500

我们查看源代码发现

kid这个参数直接拼接到了SQL语句中,而且将查询的结果作为解码后作为secret进行token解析。
所以第一步,我们需要改变kid的值,让查询的结果为1。

第二步修改,username值为Tom,且密钥改为1

第三步,将左侧字典生成的JWT复制到数据包中重放。

我这里显示时间有点问题,搞了几次还是这样,知道的大佬指点指点,这里偷个成功的图。

5.5 CTF实战案例


开启环境。


这里有个提示,要注意。
进去之后发现是个登录框,需要我们注册一个账号,再登录一下。


点击获取flag,弹框,显示没有权限


右击查看源代码,发现app.js文件。
http://challenge-dbbd85a060962e6 ... 00/static/js/app.js
访问查看:



提示是基于Node.js的koa框架,但是这个页面的代码并不是逻辑代码,用处不大。但在注释里提示静态文件处理出现问题,那么可能会出现任意文件读取漏洞。
这里就要了解一下koa框架常用目录,文件


其中controllers目录是项目控制器存放目录:接受请求,处理逻辑,所以我们去查看controllers/api.js文件。


查看代码可知,如果不是amdin用户,就不能查看flag。
此外,admin用户的注册不了的,逻辑限制。
所以这里我们开始伪造admin用户。()
第一步,注册一个账号,在登录处抓包。


发现JWT,解密查看信息


第二步,修改加密算法为空,secretid为[],username为admin,签名为空。


第三步,修改数据包中的username参数及authorization参数,并放包。



登录成功。
第四步,点击获得Get flag


成功得到flag。
本题小结:
1.要找到一个项目的主要逻辑代码,文件名可能为api.js
2.发现jwt令牌,思考可以用哪个jwt攻击思路
考察点:jwt相关攻击、node.js开发常识


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-4-19 01:01 , Processed in 0.013473 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表