# Hacker101 CTF Web—Postbook writeup ### 目的 #### 近來我開始深入探索資訊安全領域,尤其對 CTF(Capture The Flag)的各種挑戰特別感興趣。因此決定參與 Hacker101 的 CTF 挑戰,並將解題過程與思路記錄下來,作為學習紀錄和日後參考的資料。 # 解題過程 ### 初步分析 打開 Postbook 網站後,首先檢查了網頁的基本結構和功能。主要包括用戶註冊、登入、發佈貼文等基本功能。這些功能通常是 Web CTF 中常見的攻擊目標,因此需要特別注意。 ![image](https://hackmd.io/_uploads/r1Vx6f2pR.png) ### 檢查各種網頁上的資訊 看完所有網頁功能後,我先註冊了一個帳號並登入看看網頁內容,登入後映入眼簾的是歡迎訊息和兩篇貼文。 ![image](https://hackmd.io/_uploads/SkY-0M260.png) 我點入兩篇貼文查看詳細內容時,發現貼文的請求是使用 **GET 方法**,並且 id 作為參數傳遞給 ==view.php==。這種 URL 結構如下: ```view.php?id=<ID>``` ### 潛在安全風險 如果網站在權限控制上存在缺陷,攻擊者可能通過直接修改 id 參數來訪問其他用戶的貼文或私密內容,這就是典型的**水平權限提升(Horizontal Privilege Escalation)** 的問題。這種漏洞主要是因為系統未對 id 參數進行充分驗證,導致用戶可以非法訪問未授權的資源。 在嘗試後發現,當id=2時有一個藏有SECRET的網站。 ![image](https://hackmd.io/_uploads/rJPp4QhTR.png) 第一個==flag== #### 當我嘗試更改貼文時 ![image](https://hackmd.io/_uploads/B1VCje6T0.png) 第二個==flag== 在我看發文的HTML時發現。 ![image](https://hackmd.io/_uploads/ryITal66A.png) 發貼文居然不用身分驗證? ![image](https://hackmd.io/_uploads/SJxYAgppR.png) 我嘗試竄改後發文。 ![image](https://hackmd.io/_uploads/HJ32CgpTA.png) 第三個==flag== ## 題外話 ![image](https://hackmd.io/_uploads/Skpk1-p6R.png) 一下子就三個了! 好開心 ( \^ω\^) ## 在我檢查登入的地方時,嘗試更改用來辨識用戶的cookie ![image](https://hackmd.io/_uploads/HJrkB-6TR.png) 很意外的是網頁沒有因為沒有這個用戶而重新跳轉, 而沒有因註冊帳號被分配的id,就不會有用戶名和密碼。 ![image](https://hackmd.io/_uploads/BJNhBWa6A.png) 所以我用這個帳號發貼文,但發完後profile卻沒有貼文,由此推測貼文很有可能附屬帳號名。 ![image](https://hackmd.io/_uploads/B1SDubapR.png) ![image](https://hackmd.io/_uploads/HJGgY-6pC.png) 帳號無法被設定,可能只能通過==sign_up.php==創建帳號。 ![image](https://hackmd.io/_uploads/r1nB9-apC.png) 但通過創建和admin同名帳號確定了,貼文並不是附屬帳號名。 ## 另外,我還測試了==delete.php==能不能在跨帳號或是無帳號下越權刪除。 ![image](https://hackmd.io/_uploads/r1hqRST6R.png) 結果和==view.php==沒有身份驗證,屬於**水平權限提升** ![image](https://hackmd.io/_uploads/ryxh0S6p0.png) 第四個==flag== ## payload 再來我用網路上找的payload檢查了網站最有可能出現[XSS](https://github.com/payloadbox/xss-payload-list/blob/master/Intruder/xss-payload-list.txt#L22),[SQL injection](https://stackoverflow.com/questions/24396712/how-to-get-id-from-url-using-phphttps://github.com/payloadbox/sql-injection-payload-list)的多個地方。 ### 1. URL ![image](https://hackmd.io/_uploads/HknCSgp6R.png) 一系列測試後無果 ### 2. 貼文 由於貼文測試無果,大小於符號都會以```&lt;``` ```&gt;```替換,所以先從用戶名入手。 ![image](https://hackmd.io/_uploads/SyCicE66C.png) 這裡的"Usernames should be lowercase characters only." 只有使用前端HTML ```disable```,而不是後端處理。 ![image](https://hackmd.io/_uploads/By5Y5NT6A.png) 創建貼文測試 ![image](https://hackmd.io/_uploads/r1htjVTTC.png) ![image](https://hackmd.io/_uploads/HJpsTEaTR.png) 刷新後成功觸發alert(1),但並沒有拿到flag,所以只能找找其他地方。 ## 在找用戶id和用戶cookie的id有沒有關聯性時,發現用戶id MD5後就是用戶cookie。 ![image](https://hackmd.io/_uploads/H1SiBq0TC.png) 所以我將admin的id使用MD5進行雜湊計算。 ![image](https://hackmd.io/_uploads/Hk2yLcATC.png) ![image](https://hackmd.io/_uploads/SyLmu9Aa0.png) 第五個==flag== 順帶看了他的密碼 ![image](https://hackmd.io/_uploads/rkLOKqR6R.png) ## 最後 在此次挑戰中,通過發現 URL 權限提升漏洞、貼文功能未經身份驗證的漏洞 後面還有兩個flag我找了很久看了提示才發現,分別是: 1.user帳號用的是弱密碼```password``` 2.id=945還有一篇貼文 若筆記內容有誤,歡迎留言指點,謝謝。 ## 查閱資料 https://developer.mozilla.org/zh-TW/docs/Web/API/Document_Object_Model https://www.securityverse.tw/index.php/2023/05/30/elementor-1044/ https://zh.wikipedia.org/zh-tw/%E7%89%B9%E6%AC%8A%E6%8F%90%E5%8D%87 https://tech-blog.cymetrics.io/posts/jo/zerobased-cross-site-scripting/ https://stackoverflow.com/questions/24396712/how-to-get-id-from-url-using-phphttps://github.com/payloadbox/sql-injection-payload-list https://github.com/payloadbox/xss-payload-list/blob/master/Intruder/xss-payload-list.txt#L22 https://zh.wikipedia.org/zh-tw/MD5 https://www.ez2o.com/App/Coder/MD5