【需要重视的BUG】:偷权限的情况
!!如果您生產環境用到了Blog.Core系統(本文是我自己邏輯問題,和官方沒關系哈),且沒有做其他修改,且沒有使用Ids4認證中心來授權認證,請看完本文,并即時做系統維護。
----------------------------------------------------
(平臺的第一個安全BUG,已修改,請更新)
BCVP框架,是基于:
ASP.NETCore5.0+VUE.js+IdentityServer4等核心技術,實現的前后端分離與動態認證鑒權一體化平臺。
01
故事描述
通過修改令牌,可更新權限
Refresh Token.
故事源于文章開頭的圖片,今天QQ群中,偶然看到了大家在討論問題,最后發現是一個小伙伴(@---)發現了系統的漏洞,這里感謝他喲,通過一系列操作會篡改自己的權限,具體的過程是這樣的:
1、在Swagger中,用自己的測試賬號登錄,獲取Token令牌;
2、在jwt.io等工具內,修改jti為超級管理員的id;
3、用更換后的令牌,去刷新令牌接口發起請求;
4、得到最終的新令牌,此刻,你已經擁有管理員權限;
相關的動圖,可以參考:
(公眾號最多300幀,詳細的可以自己操作)
到這里你應該能看懂了,核心的BUG就出在刷新令牌的時候,我直接硬解了TOKEN,然后獲取到了數據,根據UID直接生成了新的令牌,這種思路沒問題,可是技術就差了,沒有做很好的集成和封裝,才導致了這個問題,你可能會說,官方不是有簽名校驗么,當然有,只不過這個接口是匿名的。
不過如果你用Ids4做認證平臺是沒有這個問題的,畢竟人家都考慮到了嘛,
順著思路,大家也可以多看看,多測測,還有沒有其他隱藏問題。
02
修改BUG問題
增加令牌校驗
CreateEncodedSignature.
這個問題已經被解決了,具體的代碼可以看我的提交記錄,這里感謝@wuare老鐵提供技術幫忙:
(已經提交到Github了,歡迎查看)
思路其實很簡單,就是在獲取用戶信息的時候,增加一次令牌校驗,看看當前令牌是否被篡改了,不過解題過程可以分享下:
1、在登錄的時候,我們調用
來生成令牌;
2、去查看Write源碼,發現用
JwtTokenUtilities.CreateEncodedSignature (string.Concat(rawHeader, ".", rawPayload), signingCredentials);來生成具體的令牌;
3、那我們就仿照它的這種寫法,我們也對token進行解析,將頭部和載荷拿出來,加鹽,看看和令牌的簽名是否一直;
public static bool customSafeVerify(string token) {var jwtHandler = new JwtSecurityTokenHandler();var symmetricKeyAsBase64 = AppSecretConfig.Audience_Secret_String;var keyByteArray = Encoding.ASCII.GetBytes(symmetricKeyAsBase64);var signingKey = new SymmetricSecurityKey(keyByteArray);var signingCredentials = new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256);var jwt = jwtHandler.ReadJwtToken(token);return jwt.RawSignature == Microsoft.IdentityModel.JsonWebTokens.JwtTokenUtilities.CreateEncodedSignature(jwt.RawHeader + "." + jwt.RawPayload, signingCredentials); }注意下,可能會和別的類沖突,注意命名空間的引用即可。
這樣就沒有問題了,在刷新令牌的時候,做個判斷,來看看是否被篡改了:
if (tokenModel != null && JwtHelper.customSafeVerify(token) && tokenModel.Uid > 0)PS: 這種方案可能不是最優的,也歡迎大家多多提意見吧,集思廣益喲。
好啦,本次就到這里了,還是很感謝提出這個問題的小伙伴的,不僅是讓我學到了知識,更讓框架更完善,加油加油!
希望本次更新沒有讓您對BCVP框架的質量受到影響。
總結
以上是生活随笔為你收集整理的【需要重视的BUG】:偷权限的情况的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 16年微软/腾讯云/华为云MVP是怎样炼
- 下一篇: Prism+WPF使用Dependenc