一、该问题的重现步骤是什么?
1.
复现方式:高权限登录抓取数据包 → 低权限账号登录后用其 Cookie + Blade-Auth 替换高权限字段 → 重放请求成功返回高权限数据。
2.
Cookie:
saber-access-token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0ZW5hbnRfaWQiOiIyMDQ1NzEi,...(高权限Token)
saber-refresh-token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...(高权限Refresh)
Blade-Auth: bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...(高权限)
Sec-Ch-Ua-Platform: "Windows"
Authorization: Basic c2FiZXI6c2FiZXJfc2VjcmV0
Accept-Language: zh-CN,zh;q=0.9
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...
Accept: application/json, text/plain, */*
3.
二、你期待的结果是什么?实际看到的又是什么?
如何处理?给出方案
三、你正在使用的是什么产品,什么版本?在什么操作系统上?
3.4.0
四、请提供详细的错误堆栈信息,这很重要。
五、若有更多详细信息,请在下面提供。
你说的这个不算越权。在你提供的这个复现里,最终发出去的请求携带的是高权限账号自己的合法令牌,服务端按令牌身份放行,鉴权逻辑是对的。
低权限账号 Cookie 里两个 token 和 Blade-Auth 头都被换成了高权限的,低权限身份根本没参与请求。
这等价于"我拿到了管理员的密码,所以能以管理员身份登录",这不是越权也不是漏洞,是令牌被盗用后的重放。 就好比你拿到了银行卡和密码,去atm能取出钱来,也不能说明银行就不安全。
真正的垂直越权是这样的 :
1. 低权限账号用自己的 token,直接请求管理员接口,比如 /blade-system/user/remove 或角色提交接口,服务端返回成功。
2. 或者篡改 JWT 里的 role_id、user_id 后重新签名,服务端接受。这只有在签名密钥是默认值或弱口令时才成立。另外 bladex的sign-key只有你们知道,外人是不知道的,要有sign-key才能篡改jwt,所以这个情况也不存在。