natas20
 
 
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 中 (包含使用者輸入)
 
Cookie,網站會產生新的 Session ID 並 Set-Cookie (可使用 ?debug 輔助)
 
 
\n 夾帶使用者惡意輸入 admin 1,使 mywrite() 寫入來控制 SESSION 內容,構造 Payload <anything>\nadmin 1 (前面名稱隨意;encode 時需注意 \n 是代表不可視字元) 並 URL encode 成 CHA%0Aadmin%201,最後套用同樣的 PHPSESSID 送出請求
 
PHPSESSID,觸發 myread() 讀取使用者惡意輸入,成功獲得下題的登入密碼
 
PHPSESSID 導致無法預期,但因為沒有任何使用者輸入驗證,導致可透過特殊字元控制 SESSION 內容myread() 就有可能一直找不到對應的 Session ID 檔案session_set_save_handler()
strspn()
explode()
ksort()
file_get_contents()
file_put_contents()