...

@router.put("/profile", response_model=UserRead, status_code=status.HTTP_200_OK)
def update_current_user_details(
user: UserSchema,
current_user: Annotated[User, Depends(get_current_user)],
db: Session = Depends(get_db),
):
db_user = update_user(db, user.username, user)

return current_user

User class with 字段如下所示:role

class User(BaseModel):
username: str
first_name: Union[str, None] = None
last_name: Union[str, None] = None
phone_number: Union[str, None] = None
role: Union[str, None] = None

損壞的對象屬性級別授權概念驗證

利用此漏洞非常簡單。例如,可以發送以下 curl HTTP 請求來更改當前用戶的角色,以對餐廳的員工執行權限提升:

curl -X 'PUT' \
'http://localhost:8080/profile' \
-H 'accept: application/json' \
-H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJNaWtlIiwiZXhwIjoxNzE2NzUxNjYwfQ.8khfY1H_2VLZPNuxptkEdOstuJlpME6ZAJNGnKZKFd0' \
-H 'Content-Type: application/json' \
-d '{
"username": "Mike",
"role": "Employee"
}'

下面顯示的 HTTP 響應正文成功地將角色更新為 Employee:

{
"username": "Mike",
"first_name": "Mike",
"last_name": "",
"phone_number": "",
"role": "Employee"
}

損壞的對象屬性級別授權修復

要修復此漏洞,建議實施一個新架構,該架構定義用戶可以更新哪些字段。這樣,用戶將無法更新架構中未包含的字段。以下代碼段顯示了不包含 field 的新架構。UserUpdateUserUpdaterole

class UserUpdate(BaseModel):
username: str
first_name: Union[str, None] = None
last_name: Union[str, None] = None
phone_number: Union[str, None] = None

現在,UserUpdate 模式可以在如下所示的功能中使用:update_current_user_details

rom apis.auth.schemas import UserUpdate

...

@router.put("/profile", response_model=UserRead, status_code=status.HTTP_200_OK)
def update_current_user_details(
user: UserUpdate,
current_user: Annotated[User, Depends(get_current_user)],
db: Session = Depends(get_db),
):
db_user = update_user(db, user.username, user)

return current_user

損壞的對象屬性級別授權建議

為了防止此類漏洞,我建議采取以下措施:

建議的單元測試,以確保未經授權的用戶無法修改用戶的角色:

def test_update_role_by_customer_ignores_role_returns_200(test_db, customer_client):
data = {
"username": "customer",
"role": "Employee",
}
response = customer_client.put("/profile", json=data)

assert response.status_code == 200
assert db_customer.role == UserRole.CUSTOMER

破損對象屬性級別授權自動檢測

手動或通過代碼審查檢測此類漏洞可能很有效。此外,靜態應用程序安全測試和動態應用程序安全測試工具可以幫助自動化檢測過程,但它可能需要根據所使用的技術調整自定義規則/工作流程。在撰寫本文時,通過自動化工具檢測此類漏洞具有挑戰性,如果不進行適當的項目特定調整,可能無法提供令人滿意的結果。

在本系列的第一篇文章中,我介紹了如何開發自定義 Semgrep rool 來檢測特定于項目的易受攻擊模式 — Web API Security Champion II: Broken Object Level Authorization

總結

在本文中,我為開發人員和安全工程師介紹了 Broken Object Property Level Authorization 漏洞,并提供了實際示例、修復和建議。這種對檢測和解決此類漏洞的見解將幫助您構建更安全的 API。

如何找到更多同類API?

冪簡集成是國內領先的API集成管理平臺,專注于為開發者提供全面、高效、易用的API集成解決方案。冪簡API平臺可以通過以下兩種方式找到所需API:通過關鍵詞搜索API、或者從API Hub分類頁進入尋找。

原文鏈接:https://medium.com/codex/web-api-security-champion-part-iii-broken-object-property-level-authorization-owasp-top-10-f6246273aef7

上一篇:

使用 FastAPI 和 LangChain 構建生產就緒型 RAG 聊天機器人

下一篇:

在 Apigee API 管理和應用集成中引入 Duet AI
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費