挖未授權、越權類漏洞的探究
市面上很多注入、XSS等漏洞的挖掘文章,但是權限類漏洞講的比較少。并且在最近項目上發現的越權,未授權類的漏洞比較多,就想著寫這么一篇文章,也是總結一下自己最近的學習心得。
文章開頭也希望大家看看OWASP TOP10漏洞的變化,剛開始我覺得沒什么,注入也只是變成了第三。
然后實際過程中發現,注入漏洞真的變少了,或者不容易發現了,更多關注的,便是訪問控制類的漏洞。

未授權訪問漏洞
概念
首先理解什么是未授權漏洞
未授權字面上理解是未獲得授權,對于正常的業務來說,有些功能點需要經過登錄之后才能進行,那么如果我們通過一些繞過,無需登錄也可以完成此類操作,那么便是未授權訪問漏洞了。
常見的未授權訪問漏洞
常見的未授權漏洞一般分為兩種:
1、組件類的,如redis未授權、mongodb未授權等,也是比較常見的。對于此類漏洞,可以理解為不需要登錄即可執行里面的功能,所以存在未授權漏洞。
2、WEB層面的,如某某CMS未授權文件上傳、未授權創建賬號等。
因為可以繞過登錄限制進行操作,所以存在未授權訪問漏洞。
本文旨在探究WEB層面的未授權訪問漏洞,暫不涉及組件類漏洞,感興趣的可以參考格格巫 MMQ!!師傅的文章:https://blog.csdn.net/weixin_43214644/article/details/124348759

Cookie
由于 HTTP 是無狀態的協議,不能保存每一次請求的狀態,所以需要給客戶端增加 Cookie 來保存客戶端的狀態。
在一些xss的文章中也常常會講到Cookie的概念。以防有師傅不理解,這里簡單講一下。
Cookie,是某些網站為了辨別用戶身份,進行Session跟蹤而儲存在用戶本地終端上的數據(通常經過加密),由用戶客戶端計算機暫時或永久保存的信息。簡單來說,Cookie就是一個加密了的字符串,用來分辨用戶身份的,有點像放在保險箱中的身份證。

當然不僅僅只能通過cookie,還有auth,jwt等認證方式。
大體方向是一樣的,都是為了辨別用戶身份。
如何挖掘此類漏洞
理解了什么是cookie之后,我們一起模擬一個場景:
用戶A是某網站的管理員,他今天的任務是修改一個賬號的信息。
首先,A打開網站后臺登錄界面,輸入賬號密碼后登錄系統,在系統后臺界面點擊用戶管理功能,在管理功能中找到并點擊修改按鈕,在修改界面進行了修改賬號信息的操作,點擊完成。
思考:
1、在登錄后,A至少點擊了幾個功能?
2、點擊后臺功能的時候,系統是怎么知道A是否登錄的?
第一個問題,訪問用戶管理是一個,點擊修改按鈕是一個,點擊修改完成按鈕是一個。至少有3個,可能細節沒有描述好,還會有更多。
進入到第二個問題,我想應該很多人已經知道了,就是Cookie,或者說是認證因子。考慮用戶的體驗性,不可能進行一步操作便輸入一次賬號密碼的,當然,這是最安全的。

挖掘方式很簡單,既然系統通過檢測Cookie等認證因子進行判斷是否登錄,那么只需要將認證因子刪除,分析刪除前后返回包的變化即可判斷。
這樣一想,對于使用Burp測試來說,只需要將數據包中的Cookie等字段值置空或者修改為無用字符,再查看前后的數據包是否相同即可。
有那么一個插件可以幫助快速挖掘此類漏洞。
項目地址:https://github.com/theLSA/burp-unauth-checker

burp本身的抓包模塊也有個功能可以進行替換,將授權類參數替換即可,不過好像不太好用,這是直接修改數據包內容而不是重放操作,影響體驗。如圖新增了一個規則,將匹配到Match的替換成Replace的內容。

代碼層面分析
代碼層面以某OA系統為例,通過auth.inc.php文件進行鑒權,在需要鑒權的文件中包含auth.inc.php,即可達到鑒權的效果。

例如某個備份數據庫操作,便在最前面包含了auth.inc.php文件進行鑒權。

auth.inc.php文件中可以看到進行了校驗

越權訪問漏洞
概念
使用用戶A的權限去操作用戶B的數據,如果能夠成功操作,則稱之為越權操作。
如果A、B的權限相同,或者說是在同一水平層面的,那么我們稱此操作為水平越權。如果A的權限小于B的權限,那么我們稱此操作為垂直越權。
如何挖掘此類漏洞
如果問我近幾個月的滲透測試項目什么漏洞比較多,我應該會說越權漏洞。
在理解了越權漏洞之后,發現這類問題真的特別多,并且挖掘難度沒有特別大。
首先我將挖掘越權類漏洞分為兩大類:
1、未使用cookie鑒權,通過修改userid等字段進行越權。
2、使用cookie鑒權,未檢測對應操作是否符合當前權限預期。
(下面通過某CMS模擬漏洞環境,并非實際存在越權類漏洞。)
未使用cookie鑒權
要挖掘越權類漏洞,不能局限于1、2個功能點。首先需要在大體方向上判斷,整個系統的功能點,有沒有通過userid等參數值進行校驗的。
常見方式便是通過全局搜索userid、id、countid等字符,通過修改對應id值進行判斷。

例如此處獲取用戶數據功能,如果未檢測用戶id是否與cookie對應。
那么便可以通過枚舉用戶id,獲取其他用戶數據。

或者在某個獲取驗證碼功能,通過修改user字段值,偽造代替其他用戶獲取驗證碼進行越權操作。

使用cookie鑒權
第一種、擁有兩個賬號密碼的情況下,使用管理員賬號操作,抓取數據包,修改cookie為普通用戶的cookie
第二種、只有普通賬號的情況下,通過js文件發現接口,通過自主訪問接口,fuzz字段值進行越權測試
擁有兩個賬號密碼
1、登錄管理員用戶,獲取以下cookie
PHPSESSID=lm5n7it0hinhbnqa3fp4v263i3

2、登錄普通用戶,獲取以下cookie
PHPSESSID=9sa9vq9ng9n7b9hodjrkel5qg7

3、使用管理員進行添加用戶操作并抓取數據包

4、將數據包發送到重放模塊,替換cookie為普通用戶cookie。
如果依舊可以正常執行,那么即表示存在越權漏洞。

當然也可以使用burp替換的方式進行

只有普通賬號
這種情況下測試越權比較麻煩,但是更加適用于沒有賬號然后通過暴力破解獲取了一個低權限賬號的情況下,一般會先通過js文件、swagger等獲取存在的接口,然后訪問接口查看是否能直接獲取信息。如果能夠獲取信息那么刪除認證因子看看是否能夠未授權。
如果直接訪問提示錯誤,并且沒有辦法fuzz到具體的參數的話,一般就無法利用了。但是有些情況下,會提示缺少什么參數,或者什么參數不能為空。
這就可以構造出具體的請求包進行測試了,如果能夠進行操作,比如獲取某用戶信息,修改某用戶數據,那么便是存在越權漏洞。

使用普通賬號登錄后的Cookie,構造更新數據的數據包,成功執行更新操作,即存在越權漏洞。

當提示無權限或者其他錯誤信息,即不存在越權漏洞。

總結
權限問題最近發現了特別多,一開始挖掘替換cookie實現的越權,感覺好像沒什么危害,但是當只有普通用戶的情況下,通過js文件翻到了許多接口
再結合一些數據包中的參數,fuzz之后成功構造了數據包,越權實現了許多高危操作后,我發現越權漏洞確實應該重視。
那么怎么修復此類漏洞呢?
其實只要在每個操作前面做兩個步驟:
1、檢測cookie是否已登錄。
2、如果該功能屬于管理員才能操作的功能,檢測cookie中的用戶是否屬于管理員組。
聲明:?中所涉及的技術、思路和?具僅供以安全為?的的學習交流使?,任何?不得將其?于?法?途以及盈利等?的,否則后果??承擔。所有滲透都需獲取授權!