iT邦幫忙

2023 iThome 鐵人賽

DAY 28
0

Info

Walkthrough

  • 存取網頁後使用帳號和上關獲取的密碼登入
    • Imgur
  • 點擊 View sourcecode 超連結查看後端 PHP 程式碼
    • Imgur
  • 分析程式碼邏輯後畫成流程圖如下,validUser() 透過回傳資料行數判斷 username 是否已存在於資料庫 (回傳資料行數 > 0),而當使用者不存在時會呼叫 createUser(),其中先使用 trim() 去除 username 前後的空白等字元,再用 substr()usernamepassword 的前 64 字元插入資料庫
    • Imgur
  • 可參考 Day 0x02 Natas Level 0 → Level 1 的方法,透過 Burp Suite 的 Proxy 攔截封包並 Send to Repeater,因為從後端 PHP 程式碼的註解得知 usernamevarchar(64),為求方便我選擇直接將 username 插入 64 個空字元 (URL encode),最後再輸入任意字串避免 trim() 阻擋,構造出 payload 創造新的 natas28 使用者
    • I.e., 嘗試讓原本的 natas28 和新的 natas28<空字元x57> 兩個使用者同時存在
    • Imgur
  • 再透過 natas28 身分和自訂的密碼登入,成功獲得下題的登入密碼
    • Imgur

Note

  • 嗯...這題主打一個神秘,網路上的 Write-up 大多用空白,並且描述考點是 MySQL 的 Truncate issue,仔細對照 sourcecode 會發現其實有些微不同,嘗試詢問官方 Discord 社群,STAFF 的回應是「不知道誰改的,沒紀錄細節」,只有說更新了 MySQL 版本、改用 mysqli,但比對完新、舊版的 sourcecode,我覺得目前反而更像考點是空白 🤔 總之不清楚官方是否在某些使用者看不到的 sourcecode 或其他設定等做出調整,才會替換成現在的解法

    "If strict SQL mode is not enabled and you assign a value to a CHAR or VARCHAR column that exceeds the column's maximum length, the value is truncated to fit and a warning is generated." - MySQL :: MySQL 8.0 Reference Manual :: 11.3.2 The CHAR and VARCHAR Types

  • 至於為什麼 natas28natas28<空字元x57> 可以同時存在,如果以空白來解釋的話,可以直接參考 OverTheWire Wargames :: Natas :: Level 27,是我查到寫最清楚的,也有直接實作例子幫助理解

Summary

  • 相關弱點:
  • 弱點原因:
    • 將未經驗證的使用者輸入,以字串串接的方式動態生成 SQL 查詢語句
  • 修補建議:
    • 更換較安全的認證方式,且建立白名單驗證使用者輸入,透過 API 過濾及轉譯特殊字元,如果評估可行的話,改採用參數化查詢的方式預先構建 SQL 語句,另建議立即更換密碼,以減少資訊洩漏的風險

Reference


上一篇
Day 0x1B Natas Level 25 → Level 26
下一篇
Day 0x1D Natas Level 27 → Level 28
系列文
Natas 網頁安全:從入門到放棄35
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言