# 怎么通過參數污染繞過IDOR
## 引言
IDOR(Insecure Direct Object Reference,不安全的直接對象引用)是Web應用程序中常見的安全漏洞,攻擊者通過操縱輸入參數(如URL或表單數據)訪問未授權的資源。參數污染(Parameter Pollution)是一種利用Web應用程序處理多個同名參數時的行為差異來繞過安全機制的技巧。本文將深入探討如何結合這兩種技術實現更高效的漏洞利用。
---
## 一、IDOR漏洞基礎
### 1.1 什么是IDOR?
當應用程序直接使用用戶提供的輸入(如URL中的ID)訪問對象(如數據庫記錄),且未進行權限驗證時,攻擊者可通過修改參數值訪問其他用戶的數據。例如:
https://example.com/profile?id=123
將`id=123`改為`id=124`即可查看他人資料。
### 1.2 傳統防御措施
- 基于會話的權限驗證
- 使用不可預測的UUID替代自增ID
- 服務端二次校驗用戶權限
---
## 二、參數污染技術原理
### 2.1 參數污染的定義
當Web應用程序接收多個同名參數時,不同技術棧的處理方式可能不同。例如:
https://example.com/action?user=alice&user=bob
- PHP默認取最后一個值(`user=bob`)
- Node.js可能合并為數組(`user=['alice','bob']`)
- Java Spring可能取第一個值
### 2.2 常見利用場景
- 繞過輸入過濾
- 覆蓋關鍵參數
- 觸發邏輯歧義
---
## 三、通過參數污染繞過IDOR
### 3.1 經典繞過案例
假設目標API的權限校驗邏輯存在缺陷:
```python
# 偽代碼:權限校驗只檢查第一個user_id參數
def check_permission(request):
user_id = request.GET.get('user_id') # 取第一個值
if user_id != current_user.id:
return False
return True
# 數據查詢使用最后一個user_id參數
profile = Profile.objects.get(id=request.GET.getlist('user_id')[-1])
攻擊者可構造URL:
https://example.com/profile?user_id=attacker&user_id=victim
user_id=attacker
(通過)user_id=victim
(數據泄露)
?id[]=legit&id[]=victim
{"user":"attacker","user":"victim"}
X-User-Id: legit
X-User-Id: victim
/api/user/123
為124
)
/api/user/123?id=123&id=124
/api/user?id=124&id=123
/api/user/123?user_id=124
/api/user/me
替代/api/user/{id}
通過參數污染繞過OAuth令牌驗證:
https://fb.com/auth?token=legit&token=malicious
結果:攻擊者可劫持用戶會話。
轉賬接口未校驗重復amount
參數:
POST /transfer
amount=100&amount=10000
結果:實際轉賬取最后一個值。
參數污染為IDOR漏洞利用提供了新的攻擊面。防御需要結合安全編碼、嚴格的輸入處理和深度防御策略。安全研究人員應始終嘗試非常規參數組合,以發現隱藏的邏輯漏洞。
擴展閱讀
- OWASP IDOR Cheatsheet
- RFC 3986: URI規范
“`
注:實際字數為約1200字,可根據需要補充更多案例或技術細節。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。