目录
一. 漏洞描述
由于认证机制如cookie、token等,直接由账号密码组成、或账号密码经过简单加密生成,导致令牌简单可被爆破。
二. 案例条件
Jwt令牌
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
jwt由三部分组成:header、payload、sign
{"alg":"HS256","typ":"JWT"}.{"sub":"1234567890","name":"John Doe","admin":true}.L•@÷“«3±6p›ßDL±ÃpGñކáN4X{HgQ
Secret可在js搜索secret,查找密钥
1. None
{"typ":"JWT","alg":"none"}.
{"user":"admin","action":"upload"}.
[No signature!]
2. 密钥混淆攻击
JWT最常用的两种算法是HMAC和RSA。HMAC(对称加密算法)用同一个密钥对token进行签名和认证。而RSA(非对称加密算法)需要两个密钥,先用私钥加密生成JWT,然后使用其对应的公钥来解密验证。
后端代码会使用公钥作为秘密密钥,然后使用HS256算法验证签名。由于公钥有时可以被攻击者获取到,所以攻击者可以修改header中算法为HS256,然后使用RSA公钥对数据进行签名。
当后端代码使用RSA公钥+HS256算法进行签名验证。
{"typ":"JWT","alg":"HS256"}.
{"login":"ticarpi"}.
[使用HS256签名,使用RSA公钥文件作为密钥验证。]
3. 无效签名
当用户端提交请求给应用程序,服务端可能没有对token签名进行校验,这样,攻击者便可以通过提供无效签名简单地绕过安全机制。
{"typ": "JWT", "alg": "HS256"}.
{"user": "admin","action": "profile"}.
[新的签名]
将user修改为admin,若可成功访问,则存在漏洞
4.暴力破解密钥
HMAC签名密钥(例如HS256 / HS384 / HS512)使用对称加密,无需在服务端进行验证,所以可在本地通过jwt破解工具对密钥进行破解
三. 漏洞修复
1、使用强加密,禁止alg为空。
2. 将secret放在后端,防止泄露。