1. 程式人生 > 實用技巧 >2020 OI 遊記

2020 OI 遊記

有兩種解法①session偽造②unicode欺騙

1.session偽造

在註冊時發現admin已經被註冊了,我用的admie註冊進入,f12看到註釋提示不是管理員、

接著在change password頁面看到提示

在index.html發現要將session與admin的session進行比較,相同則輸出flag

於是我們要進行session偽造,將我們的session偽造成admin的session

先用指令碼看看session有什麼內容

import sys
import zlib
from base64 import b64decode
from flask.sessions import session_json_serializer
from 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 Exception
as 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()))

我們將nameadmie改成admin就可以了,利用指令碼https://github.com/noraj/flask-session-cookie-manager可以進行偽造。

構造過程中 提示缺少secret key ,在原始碼config中可以找到secret key為ckj123

再次嘗試,成功

將偽造成功的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