type
status
date
slug
summary
tags
category
icon
password
前言:
在某一次ctf比赛中遇到了这个CVE漏洞,也算是比较常见的一个漏洞,网上也有许多学习分享。写下此篇文章,仅为学习笔记。
参考文章:
https://blog.csdn.net/qq_45766062/article/details/121412607
https://blog.csdn.net/qq_70303095/article/details/134105948
https://ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html
https://blog.csdn.net/weixin_53090346/article/details/134277438
https://www.secpulse.com/archives/193450.html
JWT攻击
敏感信息泄露
JWT保证的是数据传输过程中的完整性而不是机密性。
由于JWT的payload部分是明文传输(Base64Url编码),若payload中携带敏感信息,可以对payload部分进行Base64Url解码,读取payload携带的敏感信息。
提示:JWT 的头部和有效载荷这两部分的数据是以明文形式传输的,如果其中包含了敏感信息的话,就会发生敏感信息泄露。试着找出FLAG。格式为 flag{}
进入环境,发现登录框
随便试一下 123&123
返回
F12查看cookie,存在一个token
根据提示,对JWT进行解码,查看头部、有效载荷的信息
拼接起来
算法修改攻击
JWT中两个常用的加密算法:
HMAC(HS256):是一种对称加密算法,使用秘密密钥对每条消息进行签名和验证 RSA(RS256):是一种非对称加密算法,使用私钥加密明文,公钥解密密文。
HS256
自始至终只有一个密钥,而RS256
是有两个密钥的。 在通常情况下,HS256
的密钥我们是不能取到的,RS256
的密钥也是很难获得的,RS256
的的公钥相对较容易获取,但无论是HS256
加密还是RS256
加密,都是无法实现伪造JWT的,但当我们修改RSA256
算法为HS256
算法时,后端代码会使用公钥作为密钥,然后用HS256
算法验证签名,如果我们此时有公钥,那么此时我们就可与实现JWT的伪造。
提示:有些JWT库支持多种密码算法进行签名、验签。若目标使用非对称密码算法时,有时攻击者可以获取到公钥,此时可通过修改JWT头部的签名算法,将非对称密码算法改为对称密码算法,从而达到攻击者目的。
代码如下:
简单分析一下:
当以用户名为
admin
,密码不是$flag
时,此时登录后JWT中payload
的role
是guest
,而只有当role
为admin
时才能够得到Flag,所以这里肯定是需要伪造JWT的,先以admin
为用户名,随便输入密码登录一下此时得到JWT,且下方给出了公钥
解一下,发现是RS256加密
尝试更改算法为
HS256
,以公钥作为密钥来进行签名和验证,因此我们构造一个伪造JWT的脚本,内容如下验证一下
都没问题了,替换cookie token
可以bp抓包改,也可以直接f12 改cookie
但笔者改完发送没成功,似乎是cookie缺了一个值
没找到原因,有缘再见~
- 作者:fnigkl
- 链接:https://www.fnigkl.com/article/009
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。