赞
踩
JSON Web Token(JWT),是一种用户身份凭证,常用作身份验证、会话处理和访问控制机制。
标头.有效载荷.签名
header.payload.signature
{
"alg": "HS256",
"typ": "JWT"
}
alg属性表示签名使用的算法,typ表示令牌的类型。
iss (issuer):签发人/发行人
sub (subject):主题
aud (audience):用户
exp (expiration time):过期时间
nbf (Not Before):生效时间,在此之前是无效的
iat (Issued At):签发时间
jti (JWT ID):用于标识该 JWT
使用header指定的算法对header.payload字符串进行加盐secret组合加密,得到的哈希签名就是signature。服务器验证JWT的正确性只要将JWT的前两个部分同服务器存储的secret进行加密,将计算出的签名值与JWT第三段进行比较,相同则认证通过。
除了使用secret(HMAC算法)还可以使用“RSA或ECDSA的公用/私有key pair密钥对”对JWT进行签名。
用户登录经服务器认证后,客户端会获取一个JWT令牌,每当访问服务器资源时,携带此资源,服务器便能对其授权。
Burp正则表达式匹配
eyJ[A-Za-z0-9_-]*\.[A-Za-z0-9._-]*
jwt解码网站
https://jwt.io/
jwt攻击利用工具
https://github.com/ticarpi/jwt_tool
Hashcat下载地址
https://hashcat.net/hashcat/
JWT字典下载地址
https://github.com/wallarm/jwt-secrets
访问该页面提示不是管理员权限
使用jwt_tool,将sub改为administrator
替换原有的JWT,再次访问发现,以管理员权限访问成功。
将原有JWT的header的algx属性修改为“none”,payload的sub属性修改为administrator,并删除signature
替换原有的JWT,再次访问发现,以管理员权限访问成功。
hashcat -a 0 -m 16500 <jwt> <wordlist>
获取密钥:secret1
使用密钥生成新的JWT
替换原有的JWT,再次访问发现,以管理员权限访问成功。
JWK 是header里的一个参数,用于指出密钥,存在被伪造的风险。 攻击者可以通过以下方法来伪造JWT:删除原始签名,向标头添加新的公钥,然后使用与该公钥关联的私钥进行签名。
首先,利用Burp插件生成一个新的RSA KEY
先首先payload的sub为administrator,再点击攻击,设置Embedded JWK。
替换原有的JWT,再次访问发现,以管理员权限访问成功。
除此之外,JWT还具有以下安全漏洞问题:
KID
是jwt header
中的一个可选参数,全称是key ID
,它用于指定加密算法的密钥,因为该参数可以由用户输入,所以也可能造成一些安全问题。格式如下:
{
"typ": "JWT",
"kid": "webgoat_key",
"alg": "HS256"
}
任意文件读取
{
"typ": "JWT",
"kid": "/etc/passwd",
"alg": "HS256"
}
SQL注入
命令注入
KID参数直接传到不安全的文件读取操作可能会让一些命令注入代码流中,攻击者只需在输入的KID文件名后面添加命令,即可执行系统命令:
{
"typ": "JWT",
"kid": "/path/to/key_file|whoami",
"alg": "HS256"
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。