Web - notepad+++
solve: 54
100 points
會出這題 是因為看到 php 的 tmp
想要做一個類似的東西出來
先看到 dockerfile這些只要少了一行 都有可能破壞他微妙的權限控管
1 | FROM python |
反正簡言之 他就是一個安全的 dockerfile 用來跑 python 的 app.py
接著看到 app.py
會發現在多個地方 都有很多用 g.session 開檔的狀況
1 | with open(f'./tmp/{g.session}', mode='a+', encoding='utf8') as f: |
所以我們可以試著去控制 g.session 的值
我們可以發現
在 before_request 的部分
1 |
|
如果沒有叫做 session 的 cookie
那他就會用 md5 隨機生成 session
但是
如果有的話
1 | g.session = request.cookies.get('session') |
他就會把 cookie 中的值直接的賦值給 g.session
所以我們可以將 cookie 的值改成../flag.txt
就能取得 flag題外話 會看到很多
1 | with open(f'./tmp/{g.session}', mode='r', encoding='utf8') as f: |
也是為了保持他微妙的平衡 我已經改不出更好的code了 或是原本架構就寫得不好
但是沒有關係 更精彩的題目 就在下一次的THJCC !!
Web - cr4ck the w0rd13
solve: 3
480 points
前言:
這題其實有點鬧而且我忘記講flag有unicode :(
會出這題是因為我那時候在寫 Vue然而這題的Vue source已經被我搞丟了:(
然後我原本隨便放一個api上去
結果到一半他突然掛掉 靠邀
只能自己寫一個出來
然後一個偷天換日把 container 馬上砍掉再復活
喔還有 那時候剛開始
有人開 ticket 說他把 cookie 的 jwt decode
然後送出 對了 但什麼都沒發生
我當下其實很矇 因為我根本沒有印象我有寫 jwt
但是上去之後 蛤 真的有 :O
正文:
進來可以先看到幾個 route
/api 會告訴你那些有哪些api能call 以及他們的用途
/api/new 刷新挑戰
/api/check 檢查你送出的答案是否正確
可能有人真的認真在打 wordle 然後送出
五個全對了 結果發現沒有flag 這是正常的
我們可以注意到
1 |
|
flag會在
1 | if guess==SPECIALWORD: |
被回傳
但是我們可以注意到SPECIALWORD並不是指題目的正確答案
我們必須想辦法找到他
那我們可以把焦點放到js上
先看到 app.8b8315e5.js
往下滑一點點 就會看到
1 | const n = [["Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P"], ["A", "S", "D", "F", "G", "H", "J", "K", "L"], ["ENTER", "Z", "X", "C", "V", "B", "N", "M", "⌫"]] |
稍微判斷一下之後
發現 n 就是螢幕上的keyboard
那接著看到 t
把它念出來之後發現 上上下下左左右右BABA !
看起來就超怪的
把他在鍵盤上打一次之後就會發現
他使用了上上下下左左右右BABA去對 /api/check請求
就能成功得到 flag