natas27
validUser()
透過回傳資料行數判斷 username
是否已存在於資料庫 (回傳資料行數 > 0),而當使用者不存在時會呼叫 createUser()
,其中先使用 trim()
去除 username
前後的空白等字元,再用 substr()
取 username
、password
的前 64 字元插入資料庫
username
為 varchar(64)
,為求方便我選擇直接將 username
插入 64 個空字元 (URL encode),最後再輸入任意字串避免 trim()
阻擋,構造出 payload 創造新的 natas28
使用者
natas28
和新的 natas28<空字元x57>
兩個使用者同時存在natas28
身分和自訂的密碼登入,成功獲得下題的登入密碼
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
natas28
和 natas28<空字元x57>
可以同時存在,如果以空白來解釋的話,可以直接參考 OverTheWire Wargames :: Natas :: Level 27,是我查到寫最清楚的,也有直接實作例子幫助理解trim()
substr()