iT邦幫忙

2023 iThome 鐵人賽

DAY 21
0

Info

Walkthrough

  • 存取網頁後使用帳號和上關獲取的密碼登入,相較 Day 0x13 Natas Level 17 → Level 18Day 0x14 Natas Level 18 → Level 19,只有 name 輸入框
    • Imgur
  • 點擊 View sourcecode 超連結查看後端 PHP 程式碼
    • Imgur
  • 分析程式碼邏輯後畫成流程圖如下,網站使用 session_set_save_handler() 自定義 mywrite()myread() 函式,註解描述 "$data contains the serialized version of $_SESSION but our encoding is better",當請求中存在 name 時會放進 SESSION 中改變使用者名稱 (應該是網頁預期目的),腳本結束時呼叫 mywrite() 將所有 key-value (包含使用者輸入的 name) 串接成 "key value\n" 的形式並寫入 SESSION 檔案中儲存;而 myread() 使用 explode() 切割 \n" " (空白) 讀取檔案中所有 key-value 放進 SESSION 中 (包含使用者輸入)
    • Imgur
  • 可參考 Day 0x02 Natas Level 0 → Level 1 的方法,透過 Burp Suite 的 Proxy 攔截封包並 Send to Repeater,初始請求網頁時沒有 Cookie,網站會產生新的 Session ID 並 Set-Cookie (可使用 ?debug 輔助)
    • Imgur
    • Imgur
  • 透過 \n 夾帶使用者惡意輸入 admin 1,使 mywrite() 寫入來控制 SESSION 內容,構造 Payload <anything>\nadmin 1 (前面名稱隨意;encode 時需注意 \n 是代表不可視字元) 並 URL encode 成 CHA%0Aadmin%201,最後套用同樣的 PHPSESSID 送出請求
    • Imgur
  • 重新請求網頁且夾帶同樣的 PHPSESSID,觸發 myread() 讀取使用者惡意輸入,成功獲得下題的登入密碼
    • Imgur

Note

  • 雖然 Session ID 採用 PHPSESSID 導致無法預期,但因為沒有任何使用者輸入驗證,導致可透過特殊字元控制 SESSION 內容
  • 我一開始使用 Burp Suite 時發現有機率失敗,查過網路上其他人的 Write-up 會發現通常是使用腳本 (明明不用枚舉等需要程式輔助的行為🤔),於是我也改變方式發現都會成功,嘗試求助官方 Discord 社群無果,後來經過一些嘗試,我猜測網站可能會在固定的短時間內清除 SESSION 檔案,所以 myread() 就有可能一直找不到對應的 Session ID 檔案

Summary

  • 相關弱點:
  • 弱點原因:
    • 未經驗證的使用者輸入可控制 SESSION 內容,進而獲得權限存取敏感資料
  • 修補建議:
    • 取消 debug 參數等開發者的功能,避免洩漏可用資訊給攻擊者,並建立白名單驗證使用者輸入,改採用 API 而非自定義函式,另建議立即更換密碼,以減少資訊洩漏的風險

Reference


上一篇
Day 0x14 Natas Level 18 → Level 19
下一篇
Day 0x16 Natas Level 20 → Level 21
系列文
Natas 網頁安全:從入門到放棄35
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言