戰(zhàn):從靶場學(xué)習(xí)訪問控制漏洞與權(quán)限提升攻防)
1. 項(xiàng)目概述從靶場實(shí)戰(zhàn)中理解訪問控制的本質(zhì)在安全測試和滲透學(xué)習(xí)的路上我們總會(huì)遇到一些聽起來很基礎(chǔ)但實(shí)際攻防中威力巨大且容易被忽視的漏洞類型。訪問控制漏洞或者說權(quán)限提升問題就是其中的典型代表。它不像SQL注入或XSS那樣有炫酷的Payload也不像RCE那樣能直接拿到系統(tǒng)權(quán)限但它往往是突破內(nèi)網(wǎng)、獲取核心數(shù)據(jù)、實(shí)現(xiàn)橫向移動(dòng)的關(guān)鍵跳板。很多安全從業(yè)者在入門時(shí)可能會(huì)把大量精力花在練習(xí)各種注入、繞過上卻對(duì)如何系統(tǒng)地發(fā)現(xiàn)和利用權(quán)限問題感到無從下手。這正是PortSwigger Web Security AcademyBurp Suite官方靶場的價(jià)值所在。它提供了一個(gè)結(jié)構(gòu)清晰、場景真實(shí)的實(shí)驗(yàn)環(huán)境讓我們可以拋開復(fù)雜的真實(shí)網(wǎng)絡(luò)環(huán)境干擾專注于漏洞原理本身。這個(gè)“訪問控制漏洞和權(quán)限提升”系列的第一部分就是帶領(lǐng)我們深入這個(gè)領(lǐng)域的絕佳起點(diǎn)。它不是簡單地告訴你點(diǎn)擊哪里而是通過一個(gè)個(gè)精心設(shè)計(jì)的實(shí)驗(yàn)讓你理解“為什么這里會(huì)出問題”以及“攻擊者是如何思考的”。無論是剛接觸Web安全的新手還是想鞏固基礎(chǔ)的中級(jí)選手通過這個(gè)靶場的實(shí)戰(zhàn)你都能建立起對(duì)權(quán)限邊界清晰的認(rèn)識(shí)學(xué)會(huì)像攻擊者一樣去尋找那些本不該存在的“越界”路徑。2. 核心漏洞原理與攻擊面解析2.1 什么是訪問控制為什么它總出問題訪問控制簡單說就是系統(tǒng)用來回答“誰能在什么情況下對(duì)什么資源做什么操作”的一套規(guī)則。一個(gè)健康的訪問控制機(jī)制應(yīng)該遵循“最小權(quán)限原則”即用戶只擁有完成其任務(wù)所必需的最低權(quán)限。然而在復(fù)雜的Web應(yīng)用開發(fā)中實(shí)現(xiàn)一套完備且無懈可擊的訪問控制邏輯是極具挑戰(zhàn)的。問題往往源于幾個(gè)方面一是開發(fā)人員的安全意識(shí)不足認(rèn)為前端隱藏了管理鏈接或按鈕就萬事大吉忽略了后端對(duì)每一個(gè)API接口、每一個(gè)功能點(diǎn)進(jìn)行權(quán)限校驗(yàn)的必要性。二是業(yè)務(wù)邏輯復(fù)雜角色和權(quán)限組合多變?cè)诖a迭代中容易產(chǎn)生疏漏比如忘記對(duì)新增加的API端點(diǎn)添加權(quán)限檢查。三是依賴不可信的客戶端輸入例如通過URL參數(shù)、Cookie或隱藏表單字段來傳遞用戶身份或權(quán)限級(jí)別攻擊者可以輕易篡改這些數(shù)據(jù)。在PortSwigger靶場中這些理論上的缺陷被轉(zhuǎn)化為了一個(gè)個(gè)具體的、可操作的實(shí)驗(yàn)場景。你會(huì)遇到諸如“未經(jīng)驗(yàn)證的用戶ID參數(shù)”、“基于HTTP方法的權(quán)限繞過”、“多階段流程中的權(quán)限缺失”等經(jīng)典問題。理解這些場景本質(zhì)上是在理解開發(fā)者在編碼時(shí)可能犯下的錯(cuò)誤模式。2.2 權(quán)限提升的兩種核心路徑垂直與水平權(quán)限提升攻擊通常分為兩類垂直權(quán)限提升和水平權(quán)限提升這是分析此類漏洞的基本框架。垂直權(quán)限提升即低權(quán)限用戶獲取高權(quán)限用戶的權(quán)限。例如一個(gè)普通論壇用戶通過某種漏洞獲得了管理員權(quán)限可以刪帖、封禁他人。在靶場中這可能表現(xiàn)為普通用戶能訪問/admin目錄、調(diào)用管理員專屬的API或者執(zhí)行需要管理員權(quán)限才能觸發(fā)的后臺(tái)任務(wù)。這種提升的破壞性極大因?yàn)樗苯哟蚱屏讼到y(tǒng)的核心權(quán)限模型。水平權(quán)限提升即用戶A獲取了本應(yīng)只屬于用戶B的同等權(quán)限資源的訪問權(quán)。例如用戶A通過修改URL中的參數(shù)看到了用戶B的私密訂單、個(gè)人信息或聊天記錄。雖然權(quán)限級(jí)別沒有變化但嚴(yán)重侵犯了數(shù)據(jù)隔離性和用戶隱私。這類漏洞非常普遍因?yàn)樗ǔ2簧婕皬?fù)雜的繞過只是簡單地猜測或遍歷資源標(biāo)識(shí)符如用戶ID、訂單號(hào)。靶場的實(shí)驗(yàn)會(huì)引導(dǎo)你同時(shí)關(guān)注這兩種路徑。你可能需要先通過一個(gè)水平越權(quán)漏洞獲取到另一個(gè)用戶的某個(gè)令牌或標(biāo)識(shí)再利用這個(gè)標(biāo)識(shí)去嘗試進(jìn)行垂直提升。這種鏈?zhǔn)嚼玫乃悸吩谡鎸?shí)攻擊中非常常見。2.3 靶場環(huán)境搭建與工具準(zhǔn)備要點(diǎn)雖然本次聚焦漏洞原理但一個(gè)順暢的實(shí)操環(huán)境是基礎(chǔ)。PortSwigger靶場基于Web無需本地搭建復(fù)雜環(huán)境這是其巨大優(yōu)勢。你只需要一個(gè)瀏覽器和Burp Suite。注意強(qiáng)烈建議使用Burp Suite專業(yè)版配合靶場學(xué)習(xí)。社區(qū)版雖然免費(fèi)但部分高級(jí)掃描和重放功能受限可能影響對(duì)某些漏洞細(xì)節(jié)的探究體驗(yàn)。官方提供有臨時(shí)項(xiàng)目試用足以完成所有實(shí)驗(yàn)。瀏覽器配置推薦使用Chrome或Firefox。關(guān)鍵步驟是配置代理將瀏覽器流量指向Burp Suite。在Burp中默認(rèn)監(jiān)聽127.0.0.1:8080。在瀏覽器網(wǎng)絡(luò)設(shè)置中手動(dòng)配置HTTP代理為此地址和端口即可。Burp Suite基礎(chǔ)配置證書安裝為了攔截和解密HTTPS流量需要在瀏覽器中安裝Burp Suite的CA證書。訪問http://burpsuite下載證書并導(dǎo)入到瀏覽器的受信任根證書頒發(fā)機(jī)構(gòu)中。代理攔截初期學(xué)習(xí)時(shí)可以打開Proxy-Intercept中的攔截開關(guān)觀察瀏覽器發(fā)出的每一個(gè)請(qǐng)求和收到的每一個(gè)響應(yīng)。這有助于理解應(yīng)用的工作流程。重放器Repeater這是測試訪問控制漏洞最常用的工具。你可以將攔截到的請(qǐng)求發(fā)送到Repeater然后隨意修改參數(shù)多次重復(fù)發(fā)送觀察響應(yīng)變化。靶場訪問直接訪問PortSwigger Web Security Academy官網(wǎng)找到“Access Control”模塊下的實(shí)驗(yàn)即可。每個(gè)實(shí)驗(yàn)都有明確的目標(biāo)比如“以其他用戶身份登錄并查看其API密鑰”或“提升權(quán)限成為管理員并刪除用戶carlos”。3. 實(shí)驗(yàn)一基于用戶ID的未授權(quán)訪問水平越權(quán)這是最常見、最基礎(chǔ)的訪問控制漏洞。應(yīng)用通過URL參數(shù)、Cookie或請(qǐng)求體來標(biāo)識(shí)當(dāng)前操作的目標(biāo)用戶但后端沒有校驗(yàn)當(dāng)前登錄用戶是否有權(quán)訪問該目標(biāo)用戶的數(shù)據(jù)。3.1 漏洞場景還原假設(shè)一個(gè)在線商店應(yīng)用用戶登錄后查看自己的訂單詳情URL可能形如https://vulnerable-website.com/myaccount?order_id12345后端邏輯可能簡單地執(zhí)行了如下偽代碼order_id request.getParameter(“order_id”) order_details database.query(“SELECT * FROM orders WHERE id ?”, order_id) return render_template(“order.html”, orderorder_details)這里缺失了最關(guān)鍵的一步驗(yàn)證當(dāng)前會(huì)話中的用戶身份如session[‘user_id’]是否與訂單的所有者order_details.user_id匹配。攻擊者只需將order_id參數(shù)改為其他數(shù)值如12346就可能看到別人的訂單。3.2 實(shí)戰(zhàn)探測步驟與技巧在靶場中這類實(shí)驗(yàn)通常會(huì)給你兩個(gè)賬號(hào)一個(gè)是你的攻擊賬號(hào)如wiener另一個(gè)是目標(biāo)受害者賬號(hào)如carlos。你的目標(biāo)是獲取carlos的敏感信息。登錄與功能探查首先用你的賬號(hào)wiener正常登錄。找到查看個(gè)人資料、訂單歷史、設(shè)置等功能的頁面。使用Burp Proxy攔截這些請(qǐng)求。參數(shù)識(shí)別仔細(xì)檢查攔截到的請(qǐng)求。關(guān)注URL查詢字符串?后面的部分、POST請(qǐng)求體以及Cookie。尋找任何可能標(biāo)識(shí)用戶或資源的參數(shù)如id,user_id,uid,account,document,order等。修改與重放將請(qǐng)求發(fā)送到Burp Repeater。嘗試修改識(shí)別出的參數(shù)。例如如果你看到/myaccount?idwiener嘗試將其改為/myaccount?idcarlos。然后發(fā)送請(qǐng)求。響應(yīng)分析這是關(guān)鍵一步。不要只看HTTP狀態(tài)碼200成功并不一定代表越權(quán)成功403失敗也可能有信息泄露。要仔細(xì)查看響應(yīng)體的內(nèi)容。直接成功響應(yīng)體里直接返回了carlos的完整信息。這是最明顯的情況。差異對(duì)比將修改參數(shù)前后的兩個(gè)響應(yīng)進(jìn)行對(duì)比Burp Suite的“Comparer”工具很好用。也許頁面結(jié)構(gòu)一樣但某個(gè)字段如郵箱、地址、API密鑰的值發(fā)生了變化。錯(cuò)誤信息泄露有時(shí)應(yīng)用會(huì)返回錯(cuò)誤但錯(cuò)誤信息中包含了部分敏感數(shù)據(jù)或者暴露了數(shù)據(jù)庫結(jié)構(gòu)。實(shí)操心得不要只測試一個(gè)參數(shù)。有時(shí)應(yīng)用會(huì)使用多個(gè)參數(shù)共同標(biāo)識(shí)或者將標(biāo)識(shí)符放在Cookie的自定義字段中。進(jìn)行系統(tǒng)性的模糊測試同時(shí)修改多個(gè)參數(shù)使用數(shù)字遞增/遞減ID遍歷嘗試使用UUID格式等。此外注意觀察響應(yīng)時(shí)間如果請(qǐng)求carlos的數(shù)據(jù)明顯比請(qǐng)求自己數(shù)據(jù)慢可能觸發(fā)了不同的、更復(fù)雜的數(shù)據(jù)庫查詢邏輯這本身也是一個(gè)線索。3.3 漏洞修復(fù)方案淺析從開發(fā)角度修復(fù)此類漏洞的核心在于實(shí)施“服務(wù)端強(qiáng)制權(quán)限校驗(yàn)”。絕不能信任客戶端傳來的任何關(guān)于權(quán)限或所有權(quán)的信息。會(huì)話綁定從當(dāng)前用戶的會(huì)話Session中直接獲取用戶ID而不是從請(qǐng)求參數(shù)中獲取。# 錯(cuò)誤示范 target_user_id request.params[‘user_id’] # 正確示范 current_user_id session[‘a(chǎn)uthenticated_user_id’]數(shù)據(jù)庫查詢集成校驗(yàn)在數(shù)據(jù)查詢時(shí)將當(dāng)前用戶ID作為查詢條件的一部分。-- 錯(cuò)誤示范 SELECT * FROM orders WHERE id ?; -- 正確示范 SELECT * FROM orders WHERE id ? AND user_id ?;這樣即使攻擊者傳入了其他訂單ID由于user_id不匹配查詢結(jié)果也會(huì)為空。使用間接引用映射Indirect Reference Map避免直接使用數(shù)據(jù)庫自增ID等可預(yù)測值暴露給前端??梢允褂秒S機(jī)的、唯一的令牌Token來映射真實(shí)資源ID。前端只傳遞令牌后端通過令牌查詢到真實(shí)ID和所有者后再進(jìn)行校驗(yàn)。這增加了攻擊者猜測和遍歷的難度。4. 實(shí)驗(yàn)二基于HTTP方法的權(quán)限繞過這是一種相對(duì)隱蔽的漏洞。應(yīng)用可能對(duì)某個(gè)URL的GET請(qǐng)求做了完善的權(quán)限檢查但對(duì)同樣指向該資源的POST、PUT、DELETE等請(qǐng)求卻疏于管理。4.1 漏洞原理深度剖析現(xiàn)代Web框架如Spring MVC, Django REST Framework通常通過注解或裝飾器來聲明某個(gè)API端點(diǎn)所需的權(quán)限。例如GetMapping(“/api/user/{id}”) PreAuthorize(“hasRole(‘ADMIN’)”) // 僅管理員可GET用戶詳情 public User getUser(PathVariable String id) { … }但如果開發(fā)者忘記為其他HTTP方法添加同樣的注解就可能出現(xiàn)PutMapping(“/api/user/{id}”) // 忘記添加 PreAuthorize 注解 public User updateUser(PathVariable String id) { … }此時(shí)一個(gè)普通用戶雖然無法GET查看用戶詳情卻可以通過發(fā)送PUT請(qǐng)求來修改用戶信息。同樣對(duì)于刪除操作DELETE的遺漏檢查也極為危險(xiǎn)。4.2 靶場實(shí)戰(zhàn)發(fā)現(xiàn)隱藏的入口點(diǎn)在靶場中這類實(shí)驗(yàn)的目標(biāo)往往是讓你以普通用戶身份去修改本應(yīng)只有管理員才能修改的數(shù)據(jù)例如網(wǎng)站標(biāo)題、用戶角色等。功能枚舉與抓包首先以管理員身份或根據(jù)實(shí)驗(yàn)描述找到擁有該功能權(quán)限的用戶正常操作一遍目標(biāo)功能。比如找到管理員修改網(wǎng)站配置的頁面進(jìn)行修改并抓包。假設(shè)抓到一個(gè)請(qǐng)求POST /admin/config HTTP/1.1 請(qǐng)求體為titleNewTitle。方法猜測與測試用你的低權(quán)限賬號(hào)登錄嘗試直接重放這個(gè)POST請(qǐng)求。如果返回403禁止不要?dú)怵H。嘗試將HTTP方法改為其他類型改為GET有時(shí)參數(shù)可以放在URL里如GET /admin/config?titleHackedTitle改為PUT、PATCHRESTful API常用請(qǐng)求體格式可能與POST相同。改為HEAD、OPTIONS這些方法通常用于探測但有時(shí)配置錯(cuò)誤會(huì)導(dǎo)致它們觸發(fā)與GET相同的后端邏輯盡管不返回響應(yīng)體。嘗試HTTP方法覆蓋有些框架支持通過表單隱藏字段如_methodPUT或自定義HTTP頭如X-HTTP-Method-Override: PUT來覆蓋實(shí)際的請(qǐng)求方法。這在處理老舊瀏覽器兼容性時(shí)引入可能成為繞過點(diǎn)。參數(shù)位置變換如果改變方法不奏效嘗試將參數(shù)放在不同的位置。比如將POST請(qǐng)求體中的參數(shù)移到URL查詢字符串中或者放到Cookie或自定義HTTP頭中。后端處理參數(shù)的邏輯可能存在多個(gè)入口而權(quán)限校驗(yàn)可能只覆蓋了其中一個(gè)。4.3 深入利用與自動(dòng)化探測思路單個(gè)漏洞的利用可能只是開始。思考如何將它與其它漏洞結(jié)合CSRF利用如果這個(gè)未受保護(hù)的PUT或DELETE端點(diǎn)沒有防CSRF令牌保護(hù)那么就可以構(gòu)造一個(gè)惡意頁面誘騙已登錄的管理員訪問從而在管理員不知情的情況下執(zhí)行操作如刪除其他用戶。這時(shí)漏洞的危害就從權(quán)限提升演變成了一個(gè)存儲(chǔ)型XSS或賬戶接管的前置條件。自動(dòng)化掃描提示在Burp Suite的主動(dòng)掃描中可以對(duì)已發(fā)現(xiàn)的端點(diǎn)自動(dòng)進(jìn)行HTTP方法枚舉測試。在自定義漏洞檢查或手動(dòng)測試時(shí)養(yǎng)成對(duì)每一個(gè)重要端點(diǎn)測試多種HTTP方法的習(xí)慣。使用Burp的“Intruder”模塊將請(qǐng)求方法設(shè)為Payload位置使用GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS等作為Payload集進(jìn)行快速枚舉。5. 實(shí)驗(yàn)三多階段流程中的權(quán)限校驗(yàn)缺失許多關(guān)鍵操作如密碼重置、郵箱更改、支付確認(rèn)被設(shè)計(jì)成多步驟流程。開發(fā)人員可能在第一步進(jìn)行了嚴(yán)格的權(quán)限和身份驗(yàn)證卻錯(cuò)誤地認(rèn)為用戶在后續(xù)步驟中“已經(jīng)通過驗(yàn)證”從而在第二步、第三步放松了警惕。5.4 典型場景密碼重置流程繞過這是最經(jīng)典的案例。一個(gè)安全的密碼重置流程應(yīng)是用戶輸入用戶名或郵箱 - 2. 系統(tǒng)向注冊(cè)郵箱發(fā)送包含唯一令牌的重置鏈接 - 3. 用戶點(diǎn)擊鏈接驗(yàn)證令牌 - 4. 用戶輸入新密碼。漏洞常出現(xiàn)在第3步到第4步的銜接處。攻擊者可能這樣利用為受害者發(fā)起重置攻擊者訪問重置頁面輸入受害者郵箱victimexample.com。系統(tǒng)向受害者郵箱發(fā)送鏈接https://site.com/reset?tokenabc123def。為自己發(fā)起重置攻擊者立即訪問重置頁面輸入自己的郵箱attackerexample.com。系統(tǒng)向攻擊者郵箱發(fā)送鏈接https://site.com/reset?tokenxyz789uvw。令牌混淆利用攻擊者點(diǎn)擊自己郵箱里的鏈接進(jìn)入重置密碼頁面URL帶tokenxyz789uvw。此時(shí)他攔截提交新密碼的POST請(qǐng)求。在這個(gè)請(qǐng)求中他嘗試將token參數(shù)的值改為abc123def受害者的令牌。如果后端在提交密碼這一步?jīng)]有再次校驗(yàn)該令牌與當(dāng)前會(huì)話用戶的匹配關(guān)系而只是簡單地通過令牌找到對(duì)應(yīng)用戶并更新密碼那么攻擊者就成功地將受害者victimexample.com的密碼改掉了。5.5 靶場實(shí)戰(zhàn)追蹤狀態(tài)與會(huì)話在靶場實(shí)驗(yàn)中你可能會(huì)遇到類似“完成其他用戶的購物流程”或“更改其他用戶的郵箱地址”的目標(biāo)。完整流程走查首先用自己的賬號(hào)完整地走一遍目標(biāo)流程如購買商品、修改資料并用Burp Suite的代理歷史記錄功能完整地記錄下來。關(guān)注每一個(gè)請(qǐng)求和響應(yīng)特別是那些攜帶了狀態(tài)標(biāo)識(shí)的參數(shù)如step2,transaction_idxxx,csrf_tokenyyy,user_idzzz。狀態(tài)參數(shù)分析分析哪些參數(shù)是用來追蹤流程狀態(tài)的。嘗試在流程的中后期替換這些狀態(tài)參數(shù)為其他值例如在修改郵箱的確認(rèn)步驟將user_id參數(shù)改為目標(biāo)用戶的ID。并行操作與競態(tài)條件有時(shí)漏洞存在于對(duì)“狀態(tài)”的并發(fā)處理上。例如同時(shí)用兩個(gè)瀏覽器標(biāo)簽頁或使用Burp Repeater快速連續(xù)發(fā)送請(qǐng)求操作流程。在第一個(gè)標(biāo)簽頁完成身份驗(yàn)證后在第二個(gè)標(biāo)簽頁嘗試跳過驗(yàn)證步驟直接訪問后續(xù)頁面?;蛘咴隍?yàn)證令牌尚未被消費(fèi)標(biāo)記為已使用的極短時(shí)間內(nèi)快速發(fā)起多次使用同一令牌的請(qǐng)求。注意事項(xiàng)測試多階段流程時(shí)務(wù)必使用不同的瀏覽器會(huì)話或Burp Suite的不同用戶上下文Project-level or User-level sessions以清晰隔離兩個(gè)賬號(hào)的狀態(tài)。Burp Suite的“Match and Replace”規(guī)則或“Sessions”標(biāo)簽頁下的“Session Handling Rules”可以幫助你自動(dòng)化地管理不同賬號(hào)的Cookie提高測試效率。5.6 防御策略無狀態(tài)與狀態(tài)機(jī)校驗(yàn)修復(fù)多階段流程漏洞關(guān)鍵在于讓流程的每一步都是“無狀態(tài)”的或者嚴(yán)格校驗(yàn)狀態(tài)轉(zhuǎn)移的合法性。將所有狀態(tài)存儲(chǔ)在服務(wù)端避免在URL或表單隱藏域中傳遞流程步驟、用戶ID等敏感狀態(tài)。使用服務(wù)端Session來存儲(chǔ)當(dāng)前流程的進(jìn)度和關(guān)聯(lián)的用戶標(biāo)識(shí)。使用不可預(yù)測的令牌流程中的每一個(gè)關(guān)鍵步驟尤其是涉及權(quán)限變更的都應(yīng)使用一個(gè)高強(qiáng)度、隨機(jī)、一次性且與當(dāng)前用戶和會(huì)話綁定的令牌。提交時(shí)服務(wù)端需驗(yàn)證令牌的有效性、所屬用戶以及是否已被使用。實(shí)現(xiàn)明確的狀態(tài)機(jī)在后臺(tái)代碼中為關(guān)鍵業(yè)務(wù)流程如訂單、支付、資料修改明確定義狀態(tài)機(jī)。當(dāng)收到請(qǐng)求時(shí)不僅檢查用戶權(quán)限還要檢查當(dāng)前業(yè)務(wù)對(duì)象是否允許從狀態(tài)A轉(zhuǎn)移到狀態(tài)B。任何非法狀態(tài)轉(zhuǎn)移請(qǐng)求都應(yīng)被拒絕并記錄日志。6. 實(shí)驗(yàn)四基于URL路徑的目錄遍歷與未授權(quán)訪問這種漏洞源于對(duì)URL路徑訪問控制的配置錯(cuò)誤。Web服務(wù)器或應(yīng)用框架可能錯(cuò)誤地配置了目錄權(quán)限導(dǎo)致攻擊者可以通過構(gòu)造特殊的路徑訪問到本應(yīng)受限的目錄或文件。6.1 從目錄遍歷到權(quán)限提升經(jīng)典的目錄遍歷Path Traversal是通過../序列跳出Web根目錄訪問系統(tǒng)文件。而基于URL路徑的未授權(quán)訪問更多是停留在Web應(yīng)用內(nèi)部訪問本應(yīng)需要特定權(quán)限才能訪問的控制器Controller或資源路徑。例如應(yīng)用的管理后臺(tái)位于/admin目錄下。開發(fā)者可能依賴前端菜單不顯示/admin鏈接來“保護(hù)”后臺(tái)或者只在訪問/admin/index.php時(shí)做了權(quán)限檢查。但攻擊者可能嘗試訪問/admin/(目錄列表可能開啟)/admin/config.php/admin/backup//admin/../admin/(嘗試?yán)@過簡單的字符串匹配檢查)如果這些路徑對(duì)應(yīng)的后端代碼沒有逐一進(jìn)行權(quán)限校驗(yàn)攻擊者就可能直接訪問到管理功能。6.2 靶場中的路徑探測技巧在靶場中這類實(shí)驗(yàn)可能要求你找到一個(gè)未受保護(hù)的管理員API端點(diǎn)或者直接訪問一個(gè)包含敏感信息的文件。資源枚舉使用工具如Burp Suite的“Content Discovery”功能或OWASP ZAP的“Forced Browse”對(duì)目標(biāo)網(wǎng)站進(jìn)行目錄和文件暴力猜解。使用常見的目錄字典如/admin,/backup,/config,/api,/private等和文件字典如.git,.env,config.php,backup.zip等。觀察模式與規(guī)律手動(dòng)瀏覽網(wǎng)站時(shí)留意URL的命名模式。例如用戶面板是/user/profile那么管理員面板會(huì)不會(huì)是/admin/profile普通API是/api/v1/getUserInfo管理API會(huì)不會(huì)是/api/v1/admin/getUserInfo或/api/admin/v1/getUserInfo處理重定向與響應(yīng)訪問一個(gè)疑似受限路徑時(shí)不要只看HTTP狀態(tài)碼。一個(gè)返回302重定向到登錄頁的響應(yīng)和一個(gè)返回200 OK但內(nèi)容是“Access Denied”的響應(yīng)其安全性是不同的。前者可能只是前端路由攔截后者則明確是后端拒絕了請(qǐng)求。有時(shí)應(yīng)用會(huì)對(duì)未授權(quán)訪問返回200狀態(tài)但響應(yīng)體是空的或是一個(gè)錯(cuò)誤頁面這需要通過與授權(quán)訪問的響應(yīng)進(jìn)行對(duì)比才能發(fā)現(xiàn)差異。嘗試路徑規(guī)范化繞過Web服務(wù)器和應(yīng)用程序?qū)β窂降奶幚砜赡艽嬖诓町?。嘗試使用多種編碼或變形URL編碼/admin-/%61%64%6d%69%6e(hex編碼)雙重編碼/admin-/%2561%2564%256d%2569%256e增加冗余路徑/admin-/./admin/./或/admin//使用絕對(duì)路徑如果知道Web根目錄嘗試http://site.com/var/www/html/admin但通常會(huì)被服務(wù)器拒絕。6.3 服務(wù)器配置與框架安全此類漏洞的根源往往在于粗放的訪問控制配置。框架路由安全在使用Spring Security、Django Guardian等安全框架時(shí)必須采用“默認(rèn)拒絕”策略即明確聲明哪些路徑是公開的其余所有路徑默認(rèn)都需要認(rèn)證。避免使用“默認(rèn)允許”再逐個(gè)添加限制的配置極易遺漏。// Spring Security 錯(cuò)誤配置示例默認(rèn)允許所有 http.authorizeRequests().antMatchers(“/public/**”).permitAll(); // 忘記配置 /admin/** 的規(guī)則導(dǎo)致其被默認(rèn)允許訪問 // 正確配置示例默認(rèn)拒絕 http.authorizeRequests() .antMatchers(“/public/**”).permitAll() .antMatchers(“/admin/**”).hasRole(“ADMIN”) .anyRequest().authenticated(); // 其他所有請(qǐng)求都需要認(rèn)證Web服務(wù)器配置在Nginx或Apache中使用location塊對(duì)敏感目錄進(jìn)行訪問控制可以作為一種深度防御措施。location /admin/ { # 僅允許內(nèi)部IP或通過特定認(rèn)證 allow 192.168.1.0/24; deny all; # 或者通過auth_basic進(jìn)行HTTP基礎(chǔ)認(rèn)證 auth_basic “Admin Area”; auth_basic_user_file /etc/nginx/.htpasswd_admin; }中間件與控制器級(jí)校驗(yàn)最重要的防線還是在應(yīng)用代碼中。在每個(gè)控制器方法或路由處理函數(shù)的入口處進(jìn)行統(tǒng)一的權(quán)限校驗(yàn)??梢允褂米远x注解、攔截器Interceptor或過濾器Filter來實(shí)現(xiàn)確保校驗(yàn)邏輯不會(huì)因?yàn)殚_發(fā)人員的疏忽而被遺漏。7. 常見問題排查與工具使用進(jìn)階技巧在實(shí)際測試中你可能會(huì)遇到一些棘手的情況。這里分享一些從靶場練習(xí)延伸到真實(shí)測試的經(jīng)驗(yàn)。7.1 遇到“403 Forbidden”或“401 Unauthorized”怎么辦不要輕易放棄。這些狀態(tài)碼只是表示訪問被拒絕但背后原因可能不同有時(shí)會(huì)泄露信息。分析響應(yīng)體仔細(xì)查看403頁面的內(nèi)容。有些自定義錯(cuò)誤頁面會(huì)透露服務(wù)器信息如Web框架、版本甚至可能因?yàn)榕渲缅e(cuò)誤而返回本應(yīng)受保護(hù)的數(shù)據(jù)片段。測試HTTP方法如前所述對(duì)同一路徑嘗試GET,POST,PUT等不同方法。測試路徑變形嘗試在路徑末尾添加或刪除/添加..;/分號(hào)在Tomcat等服務(wù)器中有特殊意義或使用大小寫變換在Windows服務(wù)器上可能有效。測試HTTP頭添加或修改一些HTTP頭如X-Forwarded-For: 127.0.0.1,X-Original-URL: /admin,X-Rewrite-URL: /admin。這些頭有時(shí)被負(fù)載均衡器或反向代理使用應(yīng)用程序可能錯(cuò)誤地信任它們。參數(shù)污染嘗試添加多個(gè)相同的參數(shù)如?id123id456。后端處理參數(shù)的邏輯可能只取第一個(gè)或最后一個(gè)值這可能導(dǎo)致校驗(yàn)邏輯被繞過。7.2 如何高效地測試水平越權(quán)當(dāng)面對(duì)成千上萬的用戶ID或訂單號(hào)時(shí)手動(dòng)測試不現(xiàn)實(shí)。使用Burp Intruder這是你的主力武器。將請(qǐng)求中疑似ID的參數(shù)標(biāo)記為Payload位置。Payload選擇如果ID是數(shù)字使用“Numbers”類型設(shè)置一個(gè)范圍進(jìn)行遞增或遞減遍歷。如果ID是用戶名可以嘗試使用常見的用戶名字典。Grep - Match在Intruder的“Settings”標(biāo)簽頁中使用“Grep - Match”功能。先用你自己的賬號(hào)正常請(qǐng)求一次將響應(yīng)中代表你個(gè)人數(shù)據(jù)的唯一字符串如你的郵箱、姓名標(biāo)記出來。在攻擊時(shí)Intruder會(huì)高亮顯示那些包含了這些字符串的響應(yīng)幫助你快速發(fā)現(xiàn)哪些請(qǐng)求返回了別人的數(shù)據(jù)因?yàn)轫憫?yīng)中出現(xiàn)了你的個(gè)人信息這顯然不合理。更常見的是標(biāo)記一個(gè)“未授權(quán)訪問”時(shí)的錯(cuò)誤信息字符串然后尋找那些沒有包含這個(gè)錯(cuò)誤信息的響應(yīng)。關(guān)注響應(yīng)長度和狀態(tài)碼在Intruder的結(jié)果表中排序“Length”和“Status”列。長度明顯不同或狀態(tài)碼為200而其他都是403的響應(yīng)值得優(yōu)先查看。7.3 靶場練習(xí)如何轉(zhuǎn)化為實(shí)戰(zhàn)能力PortSwigger靶場是完美的訓(xùn)練場但真實(shí)世界更復(fù)雜。思維模式靶場教會(huì)你的是攻擊模式。在真實(shí)測試中你需要逆向思考“如果我是開發(fā)者我可能會(huì)在哪里忘記做權(quán)限檢查” 關(guān)注新增功能、邊緣接口、舊的API版本/api/v1/vs/api/v2/。理解業(yè)務(wù)邏輯真正的“權(quán)限提升”往往藏在復(fù)雜的業(yè)務(wù)邏輯里。例如“試用用戶”能否通過某種操作序列如先訂閱后立即取消永久獲得“付費(fèi)用戶”的權(quán)限兩個(gè)低權(quán)限角色合作能否完成一個(gè)高權(quán)限操作這需要你深入理解應(yīng)用程序的業(yè)務(wù)流程。工具鏈擴(kuò)展除了Burp Suite可以學(xué)習(xí)使用curl,Postman進(jìn)行快速API測試使用ffuf或gobuster進(jìn)行更快速的目錄枚舉。將Burp與其他工具結(jié)合構(gòu)建自動(dòng)化工作流。7.4 針對(duì)API的專項(xiàng)測試現(xiàn)代應(yīng)用前后端分離API成為主要攻擊面。API的訪問控制漏洞原理類似但有一些特點(diǎn)關(guān)注API文檔如果存在/api/swagger.json,/api/openapi.json等文檔仔細(xì)閱讀。文檔可能列出了所有端點(diǎn)包括那些本應(yīng)隱藏的管理端點(diǎn)。測試GraphQL如果應(yīng)用使用GraphQL權(quán)限問題可能更隱蔽。一個(gè)查詢Query可能可以訪問多個(gè)資源類型而權(quán)限檢查可能只在頂層字段進(jìn)行忽略了嵌套字段。使用Burp Suite的“InQL”擴(kuò)展或graphql-map等工具來輔助測試。檢查CORS配置不正確的CORS跨域資源共享配置本身不是權(quán)限漏洞但它可能允許一個(gè)惡意網(wǎng)站代表已登錄的用戶向目標(biāo)API發(fā)起請(qǐng)求從而將權(quán)限漏洞的危害放大。檢查Access-Control-Allow-Origin頭是否被錯(cuò)誤地設(shè)置為*或過于寬松。通過PortSwigger靶場第一部分這系列實(shí)驗(yàn)的扎實(shí)訓(xùn)練你應(yīng)該已經(jīng)對(duì)訪問控制漏洞的常見形態(tài)、探測方法和利用技巧有了系統(tǒng)性的認(rèn)識(shí)。最關(guān)鍵的是養(yǎng)成一種“不信任客戶端任何輸入”和“時(shí)刻校驗(yàn)權(quán)限邊界”的安全思維。在接下來的實(shí)戰(zhàn)中不斷練習(xí)和深化這種思維你會(huì)發(fā)現(xiàn)這些看似簡單的漏洞往往是打開寶藏大門的第一把鑰匙。