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()