這個延伸題的 HINT 一模一樣沒用處,難度高的題目想投降都沒 Walkthrough 可點擊啊...
Well done, Agent 513! Our sources say Evil Empire Co is passing secrets around when you log in: https://2019shell1.picoctf.com/problem/8675/ (link), can you help us find it? or http://2019shell1.picoctf.com:8675
探員513,幹得好! 根據我方消息指出,當你登入網站時邪惡帝國公司就會傳遞出秘密了,你能幫我們找出來嗎? 網址在 https://2019shell1.picoctf.com/problem/8675/ (link)或是 http://2019shell1.picoctf.com:8675
Pay attention to the feedback you get
There is very limited filtering in place - this to stop you from breaking the challenge for yourself, not for you to bypass.
The database gets reverted every 2 hours if you do break it, just come back later
按照上次 ##10. Empire1 題目的注入法輸入的話
' || ( SELECT tbl_name FROM sqlite_master WHERE type='table' and tbl_name NOT like 'sqlite_%' limit 1 offset 0 ) || '
直接被正確輸入到項目中...
一口氣全部輸入特殊符號 `~!@#$%^&*()_}{":?>< 也是照輸出,沒輒。
如果題目給的是提示的話,flag 應該藏在自己建立帳號中的secret 欄位?
那麼回頭來查看之前的題目,丟出 table 看看有沒有什麼頭緖
依照這些欄位查詢欄位的實際資料,是否有使用者為 admin
'|| ( SELECT admin FROM user LIMIT 1 OFFSET 0 ) || '
Very Urgent: 0
Very Urgent: 0
失敗...
查詢密碼
'|| ( SELECT password_hash FROM user LIMIT 1 OFFSET 0 ) || '
Very Urgent: deadbeef
Very Urgent: deadbeef
Very Urgent: pbkdf2:sha256:150000$kPyJo4Iy$27978e30d768b45678f29f2ae3dc5dd385d062a94182fe9a21eee501a0721be8
預設的兩位使用者居然是奇怪的文字”deadbeef”,不過自行建立的使用者倒是正常,是加密過後的資料。看來過去的題目一點幫助都沒有...
p.s. deadbeef 代表的意思
p.s2. 這裡其實是有幫助的,加密的格式暗示了後端使用的程式語言及框架!
回到原來的題目再看看 token:
session 與前幾題一樣,在登入前很正常,而且可以使用jwt.io 解出來
{
"csrf_token": "424d9e115aa1fe13740e3e0892d751824d99af2e"
}
但是呢,登入後就是個帶 “.” 無法解出來的 jwt
其他過程出現的 cookie 更是無法了解
csrftoken:
IjUyYTFmZmYyMjFmYmE5NTQ4YWE2YjZiYjEyMGU5NmIzNzhkNGFlN2Ui.X41DxQ.C7dkemh55Q2AJ-cU8VI2WW4PZnc
remember_token
3|28e887b730113245e9f7a67471bcdebe7f619ba7f1ed7bb57f3038e618d5fc064931338c15766e86711fe2f9802f5a081040426d24cfd9db3450f3d3c9ea0ddd
至此...放棄!偷看網路上的答案,
一看到 python flask 的字眼有點遺憾,這是當初在查詢使用者密碼時,加密資料有透露出來的 flask 特殊加密啊!
知道關鍵字後馬上 google “python flask injectio”,得知 flask 這個模版有特殊的語法,使用”{{}}” 包覆資料,先嘗試輸入 {{ 7*7 }} 果然查詢出來是 49。
接著再查詢 flask 本身的一些預設參數,過程中如果有錯誤的話會顯示:
這時候要記得重新註冊一個使用者,否則接下來的 {{}} 語法都會無法成功!
試到 {{config.items()}} 參數時可成功提取資訊:
可以看到其中的 secret key 提示 picoCTF{your_flag_is_in_another_castle12345678},可惜,還差一步!
改查詢別的關鍵字 google “python flask decode session”,發現原來以為”.” 開頭無法解碼的 session ,居然有線上 flask 解碼器。
丟上去之後即可得到正確的答案。
後記: 網站上的解答有提到本題”正確”的解法更為複雜一點,應該是用一開始得到的錯誤 token 當做 secret key 再去解出 session。
另外本題更簡單的解題是直接輸入 {{session}} 就能直接解碼了!
picoCTF{its_a_me_your_flag89d6ce82}