Web攻防-身份验证篇JWT令牌空密钥未签名密钥爆破JWKJWUKID算法替换CVE报告复盘
知识点:
1、WEB攻防-JWT令牌-组成&识别&检测&安全
2、WEB攻防-JWT令牌-空算法&未签名&爆破密钥
3、WEB攻防-JWT令牌-JWK&JWU&KID&加密替换&CVE&报告复盘
JSON Web Token(JWT)
。它遵循JSON
格式,将用户信息加密到token
里,服务器不保存任何用户信息,只保存密钥信息,通过使用特定加密算法验证token
,通过token
验证用户身份。基于token
的身份验证可以替代传统的cookie+session
身份验证方法。这使得JWT
成为高度分布式网站的热门选择,在这些网站中,用户需要与多个后端服务器无缝交互。
文章参考:https://blog.csdn.net/weixin_44288604/article/details/128562796
一、演示案例-WEB攻防-JWT令牌-组成&识别&检测&安全
JWT组成
1、标头(Header)
Header
是JWT
的第一个部分,是一个JSON
对象,主要声明了JWT
的签名算法,如"HS256”、"RS256"
等,以及其他可选参数,如"kid"、"jku"、"x5u"
等
alg
字段通常用于表示加密采用的算法。如"HS256"、"RS256"
等
typ
字段通常用于表示类型
还有一些其他可选参数,如"kid"、"jku"、"jwk"
等
2、有效载荷(Payload)
Payload
是JWT
的第二个部分,这是一个JSON
对象,主要承载了各种声明并传递明文数据,用于存储用户的信息,如id
、用户名、角色、令牌生成时间和其他自定义声明。
iss:
该字段表示jwt的签发者。
sub:
该jwt面向的用户。
aud:
jwt的接收方。
exp:
jwt的过期时间,通常来说是一个时间戳。
iat:
jwt的签发时间,常来说是一个时间戳。
jti:
此jwt的唯一标识。通常用于解决请求中的重放攻击。该字段在大多数地方没有被提及或使用。因为使用此字段就意味着必须要在服务器维护一张jti表, 当客户端携带jwt访问的时候需要在jti表中查找这个唯一标识是否被使用过。使用这种方式防止重放攻击似乎让jwt有点怪怪的感觉, 毕竟jwt所宣称的优点就是无状态访问
3、签名(Signature)
Signature
是对Header
和Payload
进行签名加密,具体是用什么加密方式写在Header
的alg
中。同时拥有该部分的JWT
被称为JWS
,也就是签了名的JWT
。
对Header
和Payload
进行签名,具体是用什么加密方式写在Header
的alg
中。
同时拥有该部分的JWT
被称为JWS
,也就是签了名的JWT
。
第一部分:对 JSON
的头部做 base64
编码处理得到
第二部分:对 JSON
类型的 payload
做 base64
编码处理得到
第三部分:分别对头部和载荷做base64
编码,并使用.
拼接起来
使用头部声明的加密方式,对base64
编码前两部分合并的结果加盐加密处理,作为JWT
(算法密钥是在第三部分)
HS256:
对称性加密(同一的密钥加密和解密) 可以采用爆破密钥攻击
RS256:
非对称性加密(公钥和私钥,私钥解密或加密,公钥加密或解密)
JWT识别-人工识别
JWT识别-工具插件识别检测
1、Hae(识别)
项目地址:https://github.com/gh0stkey/HaE/
2、JSON Web Tokens(识别解析修改)
3、JWT Editor(识别解析修改)
4、jwt-scanner(漏洞检测)
项目地址:https://github.com/CompassSecurity/jwt-scanner
5、jwt_tool 综合利用工具(漏洞探测和密钥爆破)
项目地址:https://github.com/ticarpi/jwt_tool
6、jwt-secrets(jwt爆破字典)
项目地址:https://github.com/wallarm/jwt-secrets
7、Venom-JWT(漏洞探测和密钥爆破)
项目地址:https://github.com/z-bool/Venom-JWT
JWT在线解析
https://jwt.io/
JWT安全
首先找到需要JWT
鉴权后才能访问的页面,如个人资料页面,将请求重放测试:
1)未授权访问:删除Token
后仍然可以正常响应对应页面。
2)敏感信息泄露:通过JWt.io
解密出Payload
后查看其中是否包含敏感信息,如弱加密的密码等。
3)破解密钥+越权访问:通过JWT.io
解密出Payload
部分内容,通过空加密算法或密钥爆破等方式实现重新签发Token
并修改Payload
部分内容,重放请求包,观察响应包是否能够越权查看其他用户资料。
4)检查Token
时效性:解密查看payload
中是否有exp
字段键值对(Token
过期时间),等待过期时间后再次使用该Token
发送请求,若正常响应则存在Token
不过期。
5)通过页面回显进行探测:如修改Payload
中键值对后页面报错信息是否存在注入,payload
中kid
字段的目录遍历问题与sql
注入问题。
二、演示案例-WEB攻防-JWT令牌-空算法&未签名&爆破密钥
1、实验:通过未验证的签名绕过JWT身份验证(无签名校验)
2、实验:通过有缺陷的签名验证绕过JWT身份验证(空加密算法)
3、实验:通过弱签名密钥绕过JWT身份验证(爆破密钥)
爆破出密匙之后肯定要重新生成JWT
呀,如何重新生成?
1、BURP
插件-JSON Web Tokens
2、使用 JWT
在线解析生成:
https://jwt.io/
三、演示案例-WEB攻防-JWT令牌-JWK&JWU&KID&加密替换&CVE&报告复盘
1、实验:通过jwk标头注入绕过JWT身份验证
有些 JWT
验证库或者配置不当的服务端,在验证签名时,会优先使用 JWT
标头里自带的 jwk
参数提供的公钥,而不是使用服务器自己配置好的、信任的公钥(比如从固定文件或URL
获取的)。
2、实验:通过jku标头注入绕过JWT身份验证
3、实验:通过kid头路径遍历绕过JWT身份验证
文章参考:https://blog.csdn.net/weixin_44288604/article/details/128562796
4、实验:算法混淆
Web349(公钥私钥泄露)
这里可以使用专门的js ide
打开相关源码文件,看的比较清楚。
公钥私钥泄露,访问/private.key、/public.key
得到公钥密钥。
源码中私钥生成jwt
,利用公钥解密jwt
,只需要有私钥就可以重新生成JWT
。
使用python脚本来生成JWTimport jwt
public = open('private.key', 'r').read()
payload={"user":"admin"}
print(jwt.encode(payload, key=public, algorithm='RS256'))
注意源码中公匙解密的条件
Web350(密钥混淆攻击RS256=>HS256)
这里可以使用专门的js ide
打开相关源码文件,看的比较清楚。
将RS256
算法改为HS256
(非对称密码算法=>对称密码算法)
HS256
算法使用密钥为所有消息进行签名和验证。
而RS256
算法则使用私钥对消息进行签名并使用公钥进行身份验证。
test.jsvar jwt = require('jsonwebtoken');
var fs = require('fs');
var privateKey = fs.readFileSync('./public.key');
var token = jwt.sign({ user: 'admin' }, privateKey, { algorithm: 'HS256' });
console.log(token)
5、InfluxDB JWT未授权漏洞(CVE-2019-20933
文章参考:https://mp.weixin.qq.com/s/obiU3BaFoZ7272z2vS0QgQ
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjo0MDcyNjE1MzE0fQ.mwI2P1j8CIvhxBKFvcyU7TNLBeuFtiUM1mPrKanF1w4
Content-Type: application/x-www-form-urlencodeddb=sample&q=show users
6、报告复盘
https://mp.weixin.qq.com/s/ITVFuQpA8OCIRj4wW-peAA
https://mp.weixin.qq.com/s/xuY1oTwFcM1pyiql0U3NPQ
https://mp.weixin.qq.com/s/AVW8DsnLiviopeJYQYKC3A
https://mp.weixin.qq.com/s/st0xma6KoRbo1NUp9rtZhw
https://mp.weixin.qq.com/s/9OL5jZK7S1MiEUb8Q_F1Pw