https://portswigger.net/web-security/all-labs#jwt
通过未验证的签名绕过 JWT 身份验证
任务:修改会话令牌访问管理面板/admin
,然后删除用户carlos
。
登录帐户:wiener:peter
1、在burp的应用市场中下载【JWT Editor】
2、登录系统后,在【http history】中发现有高亮部分,点击后发现高亮部分都是使用了JWT认证。
3、点击【/my-account?id=wiener】路径的请求包,发送到repeater模块中,在【JSON Web Token】模块中自动解码了JWT的头部和Payload部分。
4、将Payload部分的wiener换为administrator,路径修改为/admin
请求成功
5、在响应包的模块【render】中发现delete功能。
6、找到删除用户的链接,/admin/delete?username=carlos
7、删除成功
通过有缺陷的签名验证绕过 JWT 身份验证
任务:修改会话令牌以访问管理面板/admin
,然后删除用户carlos
。
登录帐户:wiener:peter
1、使用账户登陆后,同样有高亮部分为JWT认证模式。
2、修改原有名称,改为administrator,再访问/admin路径。
报了401,缺乏目标资源要求的身份验证凭证。
3、原有的签名算法为RS256,现在修改none
会怎么样呢?
如果服务端支持 "alg": "none"
且不做验证,攻击者就可以删除签名绕过验证。
然后在JWT字符中删除掉签名部分,保留点.
。
4、找到删除用户链接。
5、删除成功。
通过弱签名密钥绕过 JWT 身份验证
任务:暴力破解网站的密钥,获取密钥后,用它对修改后的会话令牌进行签名,访问管理面板的权限/admin
,然后删除该用户carlos
。
登录帐户:wiener:peter
1、修改Payload中的sub为administrator,然后访问/admin
路径
2、复制JWT的值,通过kali中的hashcat破解密钥。
eyJraWQiOiIwZmRmYjNiYy1mMDE2LTQ5NDItYTEyNy05YWFmOWFhZjYxNTMiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwb3J0c3dpZ2dlciIsImV4cCI6MTc1NTA3NDAwOCwic3ViIjoiYWRtaW5pc3RyYXRvciJ9.X-jEPb4bwH7ybTwSCRWL4MoVm_6P1Eww2cOORLkZIvA
字典:https://github.com/wallarm/jwt-secrets/blob/master/jwt.secrets.list
密钥为:secret1
3、伪造签名密钥,在【JWT Editor】插件中,选择新创建一对密钥。
4、点击生成。
5、将密钥secret1
进行Base64编码后,替换掉生成的K值。
点击ok
6、返回响应包中的【JSON Web Token】选项卡,点击sign,选择生成的密钥。
7、再次选择发包,响应码为200,成功。
8、成功删除。
通过 jwk 标头注入绕过 JWT 身份验证
任务:修改并签署一个 JWT,该 JWT 允许您访问 的管理面板/admin
,然后删除用户carlos
。
登录帐户:wiener:peter
1、登录账户后,观察请求包,发现当前的JWT签名算法为【RS256】。
2、同样在【JWT Editor】插件中新创建一个RSA的key。
点击生成后,再点击完成
3、返回请求包中,将payload中的sub修改为administrator
4、点击底部的【Attack】,选择Embedded JWK,出现提示时,选择新生成的 RSA 密钥,然后单击OK。
5、将路径修改为/admin
,之后成功访问管理面板。
6、删除成功。