2020 OI 遊記
阿新 • • 發佈:2020-12-24
有兩種解法①session偽造②unicode欺騙
在註冊時發現admin已經被註冊了,我用的admie註冊進入,f12看到註釋提示不是管理員、
接著在change password頁面看到提示
在index.html發現要將session與admin的session進行比較,相同則輸出flag
先用指令碼看看session有什麼內容
import sys import zlib from base64 import b64decode from flask.sessions import session_json_serializerfrom itsdangerous import base64_decode def decryption(payload): payload, sig = payload.rsplit(b'.', 1) payload, timestamp = payload.rsplit(b'.', 1) decompress = False if payload.startswith(b'.'): payload = payload[1:] decompress = True try: payload = base64_decode(payload) except Exceptionas e: raise Exception('Could not base64 decode the payload because of ' 'an exception') if decompress: try: payload = zlib.decompress(payload) except Exception as e: raise Exception('Could not zlib decompress the payload before' 'decoding the payload') return session_json_serializer.loads(payload) if __name__ == '__main__': print(decryption(sys.argv[1].encode()))
我們將name
的admie
改成admin
就可以了,利用指令碼https://github.com/noraj/flask-session-cookie-manager可以進行偽造。
再次嘗試,成功
將偽造成功的session用burp改包傳送後,成功以admin身份登入
2.unicode欺騙
原題WP對於這個做法沒看太懂,簡單寫一下大致思路
在註冊環節,網站會對username進行大小寫轉換,原始碼為
def strlower(username): username = nodeprep.prepare(username) return username
假如你註冊ADMIN,那麼它會轉換成admin,然後判斷該使用者名稱已被註冊。但是用一些特殊字元進行替換,比如ᴀʙᴄᴅᴇꜰɢʜɪᴊᴋʟᴍɴᴏᴘʀꜱᴛᴜᴠᴡʏᴢ
,則是先轉換為大寫,在轉換為小寫。
-
註冊ᴀdmin
-
ᴀdmin被替換為Admin
-
Admin修改密碼,並被替換為admin
-
登入admin,獲取flag