赞
踩
每天搞懂一个小漏洞——jwt
jwt漏洞成因:用户成功登录后,服务端会返回一段加密后的数据用于替代cookie的作用,当下一次打开此登录页面时候,客户端会将这一段数据自动发送给服务器端,服务器端根据收到的这一段数据,返回不同的页面,基本功能与cookie类似
jwt和cookie都是成功登录后服务器端返回客户端的一段数据, 下次登录时避免重新输入账号密码之类,提高用户体验
cookie本身不具有危害性,但是通过其他手段xss等获取到对方相关网站的cookie后,即可实现免密码登录,
jwt由于加密的特殊性可能会造成越权登录,越权修改等危害
jwt语句很好辨认,主要有三部分组成,前两部分由base64加密,最后一段为key加密(可以理解为md5加盐加密),中间使用点.截断,并且前两位字符为ew({),一般存在于请求包(返回包)中的cookie属性值中
主要利用方面:当获得系统的一个低权限之后,使用此漏洞可以实现越权登录,相当于web层面的提权
由于jwt使用的加密方式的不同,无论是alg:None属性值修改还是爆破HS256加密方式,特殊构造的字典加上一点点运气才能成功利用
以jwt.io网站显示为例
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
以点.截断显示的三段内容为
{
"alg": "HS256",
"typ": "JWT"
}
显示了加密方式和类型
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
数据传输的内容
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
)
加盐组合加密
JWT支持将算法设定为“None”。如果“alg”字段设为“ None”,那么签名会被置空,这样任何token都是有效的。
也就是说 上述的数据传输可以转变为ewogICJhbGciOiAiTm9uZSIsCiAgInR5cCI6ICJKV1QiCn0.ewogICJzdWIiOiAiMTIzNDU2Nzg5MCIsCiAgIm5hbWUiOiAiSm9obiBEb2UiLAogICJpYXQiOiAxNTE2MjM5MDIyCn0.
其中base64加密后会有个等于号=,需要去掉等于号=变换成.点
这种方式不需要理会加密方式,无论是HS256还是HS512 都可以使用这个方式,然后更改传输的数据看是否能够改变相应的页面达到越权的目的
还有一种方式就是爆破出来相应的key,然后修改数据包中的内容,可以使用hashcat或者使用c-jwt-cracker进行爆破
然后在下图中的位置输入相应的key修改数据包,但是仅限于HS256对称加密,简单的说就是服务端和客户端采用同一个key加密
欢迎各位大佬指正
参考链接:
https://www.freebuf.com/vuls/219056.html
https://www.cnblogs.com/xiaozi/p/12031111.html
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。