什么是JWT:
JSON 网络令牌 (JWT) 是一种标准化格式,用于在系统之间发送加密签名的 JSON 数据。它们理论上可以包含任何类型的数据,但最常用于发送有关用户的信息(“声明”),作为身份验证、会话处理和访问控制机制的一部分。
与经典会话令牌不同,服务器需要的所有数据都存储在 JWT 本身的客户端。这使得 JWT 成为高度分布式网站的热门选择,用户需要与多个后端服务器无缝交互。
简单理解JWT的本质就是:把用户信息通过加密后生成的一个字符串。
JWT的数据结构:
- HEADER:令牌头部,记录了整个令牌的类型和签名算法
- PAYLOAD:令牌负荷,记录了保存的主体信息,比如你要保存的用户信息就可以放到这里,可以减少数据库的访问。
- Signature【签名】:就是把header + payload + 密匙进行加密以后的密文数据。(传递数据的时候,header,payload也会进行加密,而签名就是在前面的加密基础之上再次进行加密)
JWT认证流程:
当客户端提交POST表单后,在后端验证完成时会生成一个JWT,接下来服务端会返回JWT至客户端,在随后的请求中都会带上JWT,即可工作。
JWT特点分析:
- JWT最大的缺点是服务器不会保存会话状态,所以在使用期间不可能取消令牌或更改令牌的权限,一旦JWT签发,在有效期内会一直生效。
- JWT不仅仅可用于认证,还可以用来信息交换,善用JWT有助于减少服务器请求数据库的次数。
- JWT本身包含 认证信息,因此一旦信息泄露,任何人都可以获得令牌的所有权限。
JWT攻击影响:
JWT攻击影响通常很严重,如果攻击者能够创建自己的具有任意值的有效令牌,则他们能够提升自己的权限或冒充其他用户,从而完全控制该账户。
实验靶场:
本文采用Burp Suit官方靶场Postwigger进行漏洞靶场实验。
链接地址:All labs | Web Security Academy
LAB 1 未经验证的签名绕过 JWT 身份验证
- 首先进入第一关实验靶场。
根据题目要求得知,需使用账号+密码:wiener : peter登录,后访问/admin页面,根据要求删除carlos用户即可通关。
- 点击Access the lab开启靶场后,点击登录处,输入账号密码登录。
- 登录成功后对次页面进行抓包请求,可发现红字JWT数据。
- 对JWT经过工具进行解密,可知。
解密网站链接:JWT在线解码 - 开发工具箱
JSON Web Tokens - jwt.io
可见Payload中当前登录用户为wiener。
- 根据题目提示第二步,使用Burp suit改包请求 /admin。
- 由此可以使用工具将JWT数据中Payload的wiener修改成administrator后继续尝试请求。
- 成功访问,点通过访问敏感链接 /admin/delele?username=colos 删除用户。
LAB 2 有缺陷的签名验证绕过 JWT 身份验证
- 同lab 1 一样正常登入账户密码抓包,按照lab 1方法修改administrator账号访问 /admin 后发现,仍无法成功。
因为在Header中,设置alg的值可以选择签名方式,可以选择HS256,即HMAC和SHA256。在某种情况下可以设置为None,即不签名,但是一般都会过滤这种危险的设置。
- 将header中的alg修改成none,payload中的sub修改成administrator,并删除第三段,保留到“ . ”结束。
- 测试访问成功!
- 通过请求 /admin/delete?username=carlos来删除用户carlos。
- 账户删除成功,通过lab 2
LAB 3 弱签名密钥绕过 JWT 身份验证
通过弱签名绕过JWT身份认证,虽然签名含密钥且为单向,但是如果使用的弱密钥,是可以用相应的工具来完成破解的。
这里选用的是hashcat进行密钥破解,因为是单向破解,需要相关字典进行辅助。
Hashcat下载地址:https://hashcat.net/hashcat/
JWT字典下载地址:https://github.com/wallarm/jwt-secrets
Hashcat破解命令:hashcat -a 0 -m 16500 <jwt> <wordlist>
破解成功,获取密钥:secret1
- 打开网站JSON Web Tokens - jwt.io 将JWT放进去解密,并修改Payload为administrator,添加密钥secret1.
- 将新生成得secrt1放入burp中访问得。
- 删除用户。
- 通过
LAB 4 JWK 标头注入绕过 JWT 身份验证
PS: 首先需通过Burp下载插件。
- 实验室说明
- 登录后点击My account通过Burp抓包获取令牌,并进入JSON WEB Token中操作令牌;图二中得JWS是JWT的另一种表现形式,两者结构相同。
- 修改JWS标头,首先生成RSA私钥,然后将公钥保存在JWT的标头中,每次只需要验证公钥的安全性即可,这里利用自己构造的公钥可以直接修改Payload。
- 生成完成后选择RSA秘钥,重新构造JWS 标头。
- 利用生成后的JWT直接删除用户carlos即可。
- 删除完成。
版权归原作者 Freekking 所有, 如有侵权,请联系我们删除。