常熟高端網(wǎng)站建設(shè)游戲推廣論壇
??博客主頁:?iknow181
🔥系列專欄:?網(wǎng)絡(luò)安全、?Python、JavaSE、JavaWeb、CCNP
🎉歡迎大家點(diǎn)贊👍收藏?評論?
0x01 漏洞介紹
1、 原理
業(yè)務(wù)邏輯漏洞是一類特殊的安全漏洞,業(yè)務(wù)邏輯漏洞屬于設(shè)計(jì)漏洞而非實(shí)現(xiàn)漏洞,是業(yè)務(wù)邏輯設(shè)計(jì)不嚴(yán)謹(jǐn)導(dǎo)致的漏洞。大多數(shù)業(yè)務(wù)邏輯漏洞沒有明顯的攻擊特征,難以通過漏洞掃描的方式發(fā)現(xiàn),也難以通過安全設(shè)備來防護(hù)。
2、 特點(diǎn)
- 更多依據(jù)黑盒經(jīng)驗(yàn)發(fā)現(xiàn),無法通過工具檢測
- 白盒發(fā)現(xiàn)難度大,審計(jì)時間成本高【需要非常熟悉業(yè)務(wù)功能及源碼架構(gòu)對應(yīng)關(guān)系】,但是發(fā)現(xiàn)更加全
面,準(zhǔn)確性相比黑盒差
3、應(yīng)用場景
- 系統(tǒng)登錄后才能訪問功能,進(jìn)入系統(tǒng)首頁時會看到各種功能模塊的增刪改查(往往首頁面會進(jìn)行登錄驗(yàn)
證) - 需要追蹤到后端,逐層走讀代碼判斷是否進(jìn)行授權(quán)訪問
- 此類漏洞一般發(fā)生在比較老的技術(shù),往往是程序員手動進(jìn)行權(quán)限驗(yàn)證不全面或因安全意識不足導(dǎo)致。
- 文件下載或數(shù)據(jù)瀏覽(查看),程序員針對訪問數(shù)據(jù)僅校驗(yàn)是否登錄或最低權(quán)限驗(yàn)證,但權(quán)限應(yīng)通過用
戶關(guān)聯(lián)角色、角色關(guān)聯(lián)權(quán)限控制到API接口級別(有的系統(tǒng)甚至API權(quán)限控制不全面造成越權(quán)),除此外
權(quán)限未控制到某數(shù)據(jù)表中的各條數(shù)據(jù),因此產(chǎn)生了數(shù)據(jù)遍歷漏洞。
4、審計(jì)流程
- 通過后端controller層代碼或找業(yè)務(wù)獲取系統(tǒng)的所有API接口,梳理出本系統(tǒng)的API列表。
- 需要追蹤到后端,逐層走讀代碼判斷是否進(jìn)行授權(quán)訪問分析本系統(tǒng)的權(quán)限校驗(yàn)技術(shù)和邏輯,特別是對于
登錄驗(yàn)證控制的API,尋找遺漏點(diǎn)。 - 查看字符類型以及復(fù)雜度,被遍歷字段是否為整形,是否為有規(guī)律的字符串【防止被猜測遍歷】,但需
要確定是否進(jìn)行數(shù)據(jù)鑒權(quán) - 確定過濾器機(jī)制是否完整,即是否存在過濾器特殊符號繞過的情況
5、修復(fù)措施
- 對API全面梳理全面校驗(yàn),最大限度的保證不遺漏API接口,對所有的API進(jìn)行鑒權(quán)處理?!痉澜涌谠?br /> 權(quán)】
- 通過白名單機(jī)制,僅允許登錄相關(guān)操作,例如登錄前相關(guān)資源獲取(常見的有驗(yàn)證碼的獲取)等,其他
一律都必須登錄之后才能訪問,如確實(shí)業(yè)務(wù)需要登錄之前可訪問,需要配置到白名單中?!痉澜涌谠?br /> 權(quán)】 - 字段設(shè)置一定復(fù)雜度的隨機(jī)字符串,權(quán)限控制到數(shù)據(jù)級別,也就是說訪問的數(shù)據(jù)要去用戶關(guān)聯(lián)起來。
【防數(shù)據(jù)越層次越權(quán)】
0x02 常見的分類
- 數(shù)據(jù)可遍歷
- 越權(quán)
- API未授權(quán)
- 用戶名、密碼爆破【登錄認(rèn)證問題】
- 支付漏洞
- 驗(yàn)證碼問題【驗(yàn)證碼不失效、一碼多用、可被識別、可被猜測、可被繞過】
0x03 業(yè)務(wù)邏輯漏洞-API未授權(quán)漏洞【接口越權(quán)】
1、審計(jì)技巧
- 通過后端controller層代碼或找業(yè)務(wù)獲取系統(tǒng)的所有API接口,梳理出本系統(tǒng)的API列表。系統(tǒng)的API列表。
- 分析本系統(tǒng)的權(quán)限校驗(yàn)技術(shù)和邏輯,特別是對于登錄驗(yàn)證控制的API,尋找遺漏點(diǎn)。
- 系統(tǒng)登錄后才能訪問功能,進(jìn)入系統(tǒng)首頁時會看到各種功能模塊的增刪蓋查(往往首頁面會進(jìn)行登錄驗(yàn)證)需要追蹤到后端,逐層走讀代碼判斷是否進(jìn)行授權(quán)訪問。
- 此類漏洞一般發(fā)生在比較老的技術(shù),往往是程序員手動進(jìn)行權(quán)限驗(yàn)證不全面或因安全意識不足導(dǎo)致。
- 常見的驗(yàn)證技術(shù)shiro、Spring Security等成熟而又完善的權(quán)限驗(yàn)證框架大大減少了漏洞的產(chǎn)生。
2、修復(fù)方案
- 對API全面梳理全面校驗(yàn),最大限度的保證不遺漏API接口,對所有的API進(jìn)行鑒權(quán)處理。
- 通過白名單機(jī)制,僅允許登錄相關(guān)操作,例如登錄前相關(guān)資源獲取(常見的有驗(yàn)證碼的獲取)等,其他一律都必
- 須登錄之后才能訪問,如確實(shí)業(yè)務(wù)需要登錄之前可訪問,需要配置到白名單中。
3、審計(jì)案例
分析思路:
(1)先看權(quán)限控制(如何解決AP未授權(quán)的問題),確定是否動態(tài)使用了5張表完成了權(quán)限與用戶、角
色的動態(tài)綁定
通過查看實(shí)體類發(fā)現(xiàn)未采用動態(tài)權(quán)限控制。進(jìn)行下一步分析后,得出該權(quán)限通過手動的簡單編碼處理了權(quán)限控制。
(2)看權(quán)限控制的技術(shù)(如何解決API未授權(quán)的問題)是否是手動校驗(yàn)或者是使用了比較的老的比較
簡單的filer
發(fā)現(xiàn)未使用成熟的權(quán)限框架校驗(yàn)技術(shù),未使用手動編寫filter過濾器,其實(shí)就是我們加大未業(yè)務(wù)邏輯漏洞審
計(jì)的決心。
(3)看數(shù)據(jù)是如何鑒權(quán)的,需要分析詳細(xì)的API及業(yè)務(wù)系統(tǒng)功能,看各自的數(shù)據(jù)獲取是否合理。
第一點(diǎn),簡單來說看數(shù)據(jù)是否公開,公開就忽略
第二次,對于屬于私有的數(shù)據(jù),查看是否校驗(yàn)了當(dāng)前用戶登錄的身份(登錄用戶本人或管理員)
例如學(xué)生成績查詢系統(tǒng),能夠查看學(xué)生成績的,只有學(xué)生本人以及你的教師。
以學(xué)生成績查看業(yè)務(wù)功能為例,分析:
最后確定這個接口只要傳入ID,就能夠獲取當(dāng)成績,追溯整個的漏洞鏈中未發(fā)現(xiàn)進(jìn)行了合格的校驗(yàn)
如果我能確定,未對當(dāng)前登錄用戶的權(quán)限進(jìn)行控制,就可以得出該代碼存在著API未授權(quán)漏洞。
1、通過通讀源碼,發(fā)現(xiàn)考試系統(tǒng)未使用任何安全框架,未使用Filter過濾器進(jìn)行登錄驗(yàn)證,通過手寫
登錄方法對用戶是否存在,密碼是否正確以及登錄身份判斷后分別跳轉(zhuǎn)到對應(yīng)頁面(學(xué)生、教師、管
理員),未真正進(jìn)行API與用戶、角色的綁定校驗(yàn)權(quán)限,全局存在API未授權(quán)問題。
2、對梳理的API列表逐一按照參數(shù)要求在不登錄的情況下訪問后成功獲取對應(yīng)數(shù)據(jù),其他不在一一列
舉。
總結(jié):需要對登錄身份進(jìn)行權(quán)限控制,簡單的說就是驗(yàn)證查詢的學(xué)生成績的id是不是登錄用戶的ID,
校驗(yàn)手動參考如下:
關(guān)于水平越權(quán)的修復(fù)的問題:
1、數(shù)據(jù)層次導(dǎo)致的越權(quán)原因,直接通過sid查詢了某條數(shù)據(jù),未對當(dāng)前登錄的用戶進(jìn)行校驗(yàn):
2、如何鑒權(quán),應(yīng)該獲取到當(dāng)前登錄用戶的 ID,和查詢的數(shù)據(jù)所屬用戶進(jìn)行比對
除了API未授權(quán),未通過用戶的角色決定該接口是否被授權(quán)的用戶訪問,僅僅是接口的訪問,如果能夠控制接口的請求,這個授權(quán)就完美了。但是我們通過數(shù)據(jù)層次上控制了不同角色用戶訪問數(shù)據(jù)的權(quán)限并且通過sql語句的限制條件控制了數(shù)據(jù)遍歷訪問的問題。所以修復(fù)到這里,也不會出現(xiàn)越權(quán)問題。
0x04 shiro框架介紹
Apache Shiro 是 Java 的一個安全框架。目前,使用 Apache Shiro 的人越來越多,因?yàn)樗喈?dāng)簡單,對比Spring Security,可能沒有 Spring Security 做的功能強(qiáng)大,但是在實(shí)際工作時可能并不需要那么復(fù)雜的東西,所以使用小而簡單的 Shiro 。
Shiro 簡化開發(fā)應(yīng)用,能夠完成:認(rèn)證、授權(quán)、加密、會話管理、與 Web 集成、緩存等。
- Authentication:身份認(rèn)證 / 登錄,驗(yàn)證用戶是不是擁有相應(yīng)的身份;
- Authorization:授權(quán),即權(quán)限驗(yàn)證,驗(yàn)證某個已認(rèn)證的用戶是否擁有某個權(quán)限;即判斷用戶是否能做事情,常見的如:驗(yàn)證某個用戶是否擁有某個角色?;蛘呒?xì)粒度的驗(yàn)證某個用戶對某個資源是否具有某個權(quán)限;
- Session Management:會話管理,即用戶登錄后就是一次會話,在沒有退出之前,它的所有信息都在會話中;會話可以是普通 JavaSE 環(huán)境的,也可以是如 Web 環(huán)境的;
- Cryptography:加密,保護(hù)數(shù)據(jù)的安全性,如密碼加密存儲到數(shù)據(jù)庫,而不是明文存儲;
- Web Support:Web 支持,可以非常容易的集成到 Web 環(huán)境;
- Caching:緩存,比如用戶登錄后,其用戶信息、擁有的角色 / 權(quán)限不必每次去查,這樣可以提高效率;
- Concurrency:shiro 支持多線程應(yīng)用的并發(fā)驗(yàn)證,即如在一個線程中開啟另一個線程,能把權(quán)限自動傳播過
去; - Testing:提供測試支持;
- Run As:允許一個用戶假裝為另一個用戶(如果他們允許)的身份進(jìn)行訪問;
- Remember Me:記住我,這個是非常常見的功能,即一次登錄后,下次再來的話不用登錄了。
0x05 業(yè)務(wù)邏輯漏洞審計(jì)-水平越權(quán)【簡單】案例
1、審計(jì)技巧
- 被遍歷字段變量類型為整型
- 被遍歷字段變量為有規(guī)律的字符串
- 確定是否進(jìn)行數(shù)據(jù)鑒權(quán)
相同角色的用戶才會考慮水平越權(quán)的問題(如果用戶的角色不一樣,那低權(quán)限的賬號根本就沒有機(jī)會訪問到高權(quán)限賬號的接口),也就是說兩個用戶一定能夠同時訪問這個API,才會繼續(xù)往下考慮水平越權(quán)的問題。
2、應(yīng)用場景
文件下載或數(shù)據(jù)瀏覽(查看),程序員針對訪問數(shù)據(jù)僅校驗(yàn)是否登錄或最低權(quán)限驗(yàn)證,但權(quán)限一般是通過用戶關(guān)聯(lián)角色、角色關(guān)聯(lián)權(quán)限控制到AP接口級別(有的系統(tǒng)甚至AP權(quán)限控制不全面造成越權(quán)),權(quán)限未控制到某數(shù)據(jù)表中的各條數(shù)據(jù),因此產(chǎn)生了數(shù)據(jù)遍歷漏洞。
3、修復(fù)方案
- 設(shè)置具有一定復(fù)雜度的隨機(jī)字符串,例如隨機(jī)12位或16隨機(jī)字符串(迫不得以)。
- 將權(quán)限控制到數(shù)據(jù)級別,也就是說訪問的數(shù)據(jù)要去用戶關(guān)聯(lián)起來(最優(yōu)解)。
4、審計(jì)案例
1、以考試系統(tǒng)為例,查看李麗學(xué)生的成績,請求student/showScore?sid=1
2、確定sid表示查詢的李麗的成績,根據(jù)審計(jì)技巧猜測sid是否是一個可遍歷的字段且在數(shù)據(jù)級別未進(jìn)
行校驗(yàn),因此進(jìn)入后端參數(shù)追蹤,發(fā)現(xiàn)sid為一個整數(shù)易被遍歷且查詢數(shù)據(jù)前未進(jìn)行任何權(quán)限和校驗(yàn),從
而造成了登錄李麗賬號后可遍歷其他任意學(xué)生的成績信息。
3、利用黑盒遍歷sid可隨意查看其他同學(xué)的成績
0x06 業(yè)務(wù)邏輯漏洞-垂直越權(quán)
1、漏洞原理介紹
- 越權(quán)漏洞分類水平越權(quán)和垂直越權(quán),同級別權(quán)限的用戶之間能訪問、操作范圍外數(shù)據(jù)或請求接口的為水平越權(quán),低權(quán)限賬號能夠訪問或操作高權(quán)限數(shù)據(jù)或請求接口的為垂直越權(quán)。
- 越權(quán)漏洞主要發(fā)生在面向不同角色的用戶提供不同服務(wù)或功能的系統(tǒng),例如OA、HR等應(yīng)用類、管理類系統(tǒng),特別是使用老技術(shù)架構(gòu)的系統(tǒng)發(fā)生越權(quán)情況更為普遍。但如果使用了新技術(shù),一般會使用較為成熟的框架機(jī)制進(jìn)行權(quán)限控制,從而大大覺少了越權(quán)漏洞的發(fā)生。
2、審計(jì)漏洞突破口
- 查看后端索使用的技術(shù),特別是使用的權(quán)限認(rèn)證技術(shù),熟悉shiro,spring-security等框架的鑒權(quán)原理
- 梳理所有的API,進(jìn)行分類,追蹤api請求,查看是否會進(jìn)行權(quán)限驗(yàn)證。
- 對于較老技術(shù)架構(gòu)的系統(tǒng),往往只是進(jìn)行了登錄驗(yàn)證或API僅進(jìn)行了最低權(quán)限角色的認(rèn)證,未全部將角色和對應(yīng)的API匹配起來,導(dǎo)致了越權(quán)漏洞的產(chǎn)生
3、權(quán)限控制原理
- 將后端所有被請求的API均當(dāng)做權(quán)限(API請求路徑)存儲到數(shù)據(jù)庫權(quán)限表中
- 同時將角色表和權(quán)限表關(guān)聯(lián)起來,將用戶表和角色表管理起來
- 用戶在請求API時,權(quán)限驗(yàn)證框架會依據(jù)用戶信息查詢對應(yīng)角色所用戶的權(quán)限,權(quán)限足夠才會正常請求API,否則將會攔截。只要API未完全通過角色和用戶綁定起來就會存在越權(quán)漏洞的產(chǎn)生。
登錄認(rèn)證案例:
4、審計(jì)案例-1
1、在新醫(yī)院管理系統(tǒng)中,使用普通用戶(低權(quán)限)訪問醫(yī)院管理的功能,管理員(高權(quán)限)訪問系統(tǒng)
用戶的功能,嘗試查看是否存在垂直越權(quán)行為
2、分別發(fā)送請求后抓包發(fā)現(xiàn)存在醫(yī)院管理員能夠查看系統(tǒng)用戶的信息(此API越權(quán))
3、首先設(shè)置管理員和普通用戶的角色,不允許低權(quán)限用戶操作系統(tǒng)管理功能模塊
4、登錄低權(quán)限賬號后發(fā)現(xiàn)頁面確實(shí)不能訪問系統(tǒng)管理功能
5、隨后經(jīng)過梳理該系統(tǒng)使用Shiro框架權(quán)限驗(yàn)證,簡單來講就是框架自動將請求的API接口和我們數(shù)據(jù)
庫權(quán)限表關(guān)聯(lián)起來,用戶登錄-獲取用戶Id-查詢所屬角色-查詢權(quán)限列表-shiro框架會比對待請求的用
戶接口路徑是否在范圍內(nèi),如果在就放行,不在就攔截。此次能越權(quán)是因?yàn)榇_實(shí)在列表內(nèi):
6、因此接口能否越權(quán)的關(guān)鍵看權(quán)限列表控制的是否合理,也就是所看API是否完全和用戶、角色關(guān)聯(lián)
起來是關(guān)鍵,部分API關(guān)聯(lián)不合理成為了漏網(wǎng)之魚,數(shù)據(jù)越權(quán)需要看當(dāng)前數(shù)據(jù)是否和給用戶授權(quán)(通過
白名單存儲所有能訪問用戶的標(biāo)識與登錄用戶進(jìn)行比對,如果在范圍內(nèi)允許訪問,否則不允許訪問)
0x07 業(yè)務(wù)邏輯漏洞-字段爆破
- 常見的爆破字段有用戶名、密碼、驗(yàn)證碼(黑盒)
- 從白盒來講,通過審計(jì)源代碼包括字段的類型,例如整形,有規(guī)律的字符串作為數(shù)據(jù)的唯一標(biāo)識
- 此類漏洞通過黑盒直接測試比較方便,一般情況下只有使用了驗(yàn)證碼(圖形驗(yàn)證碼、短信驗(yàn)證碼)一般情況下不可被破解。
1、審計(jì)方法
- 追蹤登錄功能,查看后端源碼是否在登錄成功前進(jìn)行了驗(yàn)證碼的刷新(防失效)。
- 在修改密碼處可能不會再進(jìn)行驗(yàn)證碼設(shè)置,從而造成用戶名爆破。
- 搜索是否提示用戶名不存在且在未關(guān)聯(lián)驗(yàn)證碼的情況。
2、修復(fù)方案
- 凡是在涉及到用戶名判斷的情況反饋模糊提示信息,不得直接提示用戶名不存在。
- 凡是判斷用戶名和密碼的認(rèn)證情況,需要增加驗(yàn)證碼判斷邏輯來避免爆破。
- 設(shè)置基于IP鎖定和一定時間內(nèi)賬號錯誤輸入次數(shù)機(jī)制,來避免爆破密碼的情況。
- 通過增加具有一定復(fù)雜度的驗(yàn)證碼來方爆破
0x08 業(yè)務(wù)邏輯漏洞-支付漏洞
支付漏洞一般是程序員對異常的情況未進(jìn)行安全考慮,具體包括:
- 支付、取款、轉(zhuǎn)賬任意金額的修改,未對正負(fù)數(shù)、原金額足額比較
- 來自前端的金額直接執(zhí)行支付操作,未對前端折扣金額等于后端的金額比對,是產(chǎn)生支付漏洞是一種常見的現(xiàn)
象。
如果單價,折扣,原價,積分等等的不與數(shù)據(jù)庫進(jìn)行比對的話,將會出現(xiàn)任意金額下單,購買的業(yè)務(wù)
邏輯漏洞
如果未對同一客戶端IP、同一用戶、同一時間段內(nèi)重復(fù)下單的頻率進(jìn)行先限制和提醒,將會造成無限
刷單。
審計(jì)技巧:尋找支付相關(guān)業(yè)務(wù)邏輯,確定是否對金額進(jìn)行負(fù)數(shù)、原賬號金額、前端支付變量與數(shù)據(jù)庫
真正定價比較。
0x09 業(yè)務(wù)邏輯-filter 過濾器繞過
filter被稱為過濾器,是Servlet2.3新增的一個特性,同時它也是Servlet技術(shù)中最實(shí)用的技術(shù)。開發(fā)人員可以通過Filterj技術(shù),能夠?qū)崿F(xiàn)對所有Wb資源的管理,如實(shí)現(xiàn)權(quán)限訪問控制、過濾敏感詞匯、壓縮響應(yīng)信息、全局編碼配置、登錄認(rèn)證等一些高級功能。
1、filter 過濾器../繞過
1. 繞過原理分析
/user/loginServlet、/user/toLoginServlet開頭,符合匹配的規(guī)則,而匹配上該規(guī)則后則是直接放
行,讓系統(tǒng)認(rèn)為訪問路徑是一個登錄的路徑,但在后面加入../進(jìn)行跳轉(zhuǎn)到根目錄,并且拼接上
indexServlet,這時候?qū)嶋H訪問到的是http://127.0.0.1:8082/user/indexServlet
2. 修復(fù)方案
String uri = request.getRequestURI();
if(uri.contains("./")){resp.getwriter().write("error");return;}
2、手動filter過濾器-;繞過
1. 繞過原理分析
URL中有一個保留字符分號;,主要為參數(shù)進(jìn)行分割使用,有時候是請求中傳遞的參數(shù)太多了,所以使
用分號;將參數(shù)對(key=value)連接起來作為一個請求參數(shù)進(jìn)行傳遞。再來看到代碼,代碼中識別.do
和.action的后綴的字符,而加入;加上隨便內(nèi)容后,代碼中就識別不到了。則會走到最下面的
chain.doFilter(request,resp);,而在后面添加;分號不會對地址的訪問有任何影響。
2. 修復(fù)方案
3、 總結(jié)
前面提到過request.getRequestURL(),這些危險字符并不會自動剔除掉??芍攸c(diǎn)關(guān)注該方法。
關(guān)于手寫過濾器的繞過的總結(jié):
(1)兩個場景,第一是基于../截斷,第二是基于;截斷,對應(yīng)通過黑名單通過相關(guān)API獲取uri剔除特殊
的字符去分別防止兩個場景的繞過
(2)當(dāng)你遇到了手寫的過濾器,要基于以上兩個場景去判斷是否存在該問題