歡迎來到 黑吧安全網 聚焦網絡安全前沿資訊,精華內容,交流技術心得!

代碼審計 | SiteServerCMS身份認證機制

來源:本站整理 作者:佚名 時間:2020-03-11 TAG: 我要投稿

一、前言
SiteServerCMS是一款開源免費的企業級CMS系統,功能比較豐富,代碼一多起來,難免會有些漏洞產生,之前應急響應碰到過幾次這個系統,有些問題修復了,有些問題依然還在,趁著整理之前零散的資料,結合6.14.0版本寫個總結。
SiteServerCMS有多種身份認證方式,這里以最常見的Cookie認證來展開分析:
官網: https://www.siteserver.cn/
Github: https://github.com/siteserver/cms/releases
二、身份認證
2.1 登錄框
從何說起呢?滲透,經常開局就只有一個登錄框,有時還有驗證碼,那就從登錄框開始吧,SiteServerCMS是后臺管理+前臺內容(含會員)的前后分離模式,各有獨立的登錄地址,先從后臺登錄開始,默認后臺登錄地址是:
http://IP:Port/SiteServer/pageLogin.cshtml

隨便輸入個用戶名和密碼登錄查看數據包,通過JSON格式提交到了/api/v1/administrators/actions/login,進入脫發模式,打開源碼跟進,位置:
源文件: ./SiteServer.Web/Controllers/V1/AdministratorsController.cs

登錄失敗次數+1,出局。
2.2 Cookie & accessToken
使用正確的用戶名密碼登錄,登錄成功后,會生成一個accessToken的字符串,這個accessToken是作為Cookie身份認證用的:
var accessToken = request.AdminLogin(adminInfo.UserName, isAutoLogin);
不信且看,走進AdminLogin(),跟進accessToken生成過程:
var accessToken = AdminApi.Instance.GetAccessToken(adminInfo.Id, adminInfo.UserName, expiresAt);
源文件: ./SiteServer.CMS/Core/AuthenticatedRequest.cs

SiteServerCMS有多種身份認證方式,這里的Constants.AuthKeyAdminCookie對應的是Cookie命名份格式: SS+名稱,規則如下:
源文件: ./SiteServer.Utils/Constants.cs
public const string AuthKeyUserHeader = "X-SS-USER-TOKEN";
public const string AuthKeyUserCookie = "SS-USER-TOKEN";
public const string AuthKeyUserQuery = "userToken";
public const string AuthKeyAdminHeader = "X-SS-ADMIN-TOKEN";
public const string AuthKeyAdminCookie = "SS-ADMIN-TOKEN";
public const string AuthKeyAdminQuery = "adminToken";
public const string AuthKeyApiHeader = "X-SS-API-KEY";
public const string AuthKeyApiCookie = "SS-API-KEY";
public const string AuthKeyApiQuery = "apiKey";
public const int AccessTokenExpireDays = 7;
public static string GetSessionIdCacheKey(int userId)
{
    return $"SESSION-ID-{userId}";
}
回來繼續跟進GetAccessToken():
源文件: ./SiteServer.CMS/Plugin/Apis/AdminApi.cs

又回來了,繼續回到上一個文件,找到那個GetAccessToken():

還記得第三個參數類型是什么嗎? 突然冒出來的WebConfigUtils.SecretKey是什么?JwtHashAlgorithm.HS256又是什么鬼?為了避免篇幅太長:
WebConfigUtils.SecretKey: 加密密鑰,圈起來,要考的;
JwtHashAlgorithm.HS256: Hash算法模式,知道就行了。
繼續跟進JsonWebToken.Encode(),直接跳過中間的方法到最后一個Encode():
源文件: ./SiteServer.Utils/Auth/JWT.cs

這里的參數對應關系:
payload對應userToken;
key對應WebConfigUtils.SecretKey;
algorithm對應JwtHashAlgorithm.HS256。
然后整個accessToken生成格式為:
算法類型 + 認證信息 + 哈希摘要
Base64UrlEncode(headerBytes) + "." + Base64UrlEncode(payloadBytes) + "." + Base64UrlEncode(signature)
明文格式大致像這樣:
{"typ":"JWT","alg":"HS256"}.{"UserId":1,"UserName":"admin","ExpiresAt":"\/Date(1583293343684)\/"}.哈希摘要
accessToken生成完了,看完頭發掉了不少,有什么用?
2.3 加密 & 解密
暫時還派不上用場,現在我要講另一件事:加密與解密。
且回到AdminLogin(),登錄成功后會將accessToken通過Cookie返回客戶端:
CookieUtils.SetCookie(Constants.AuthKeyAdminCookie, accessToken);
這里暫時不去理會是否isAutoLogin,撿簡單的,跟進SetCookie():
源文件: ./SiteServer.Utils/CookieUtils.cs

注意這里有一個很關鍵的參數isEncrypt,缺省值是true,默認都是啟用的:

[1] [2] [3]  下一頁

【聲明】:黑吧安全網(http://www.www.hfjixin.com)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱admin@www.hfjixin.com,我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        百度 好搜 搜狗

        警告:本站禁止未滿18周歲訪客瀏覽,如果當地法律禁止請自覺離開本站!收藏本站:請使用Ctrl+D進行收藏