正如本題所說,腦洞有點大。考點還很多,不過最核心的還是python的pickle反序列化漏洞
題目中暗示了要6級號,找了很多頁都沒看到,於是寫了腳本
在第180頁有6級號,但是價格出奇的高,明顯買不起。bp抓包發現有疑似折扣的參數,把值改低后提交,重定向到了后台頁面,但是需要admin才行。
這時一早就發現的JWT便派上了用場。在https://jwt.io/在線解析jwt。data段有我們的用戶名,可以偽造成admin,但還需要有密鑰。
可以使用工具破解。詳情見:https://github.com/brendan-rius/c-jwt-cracker
破解出的密碼是”1Kun“。把它寫入下圖箭頭所示位置並偽造身份后通過bp發送。
發現源碼。下載后在settings.py中發現unicode編碼的hint
提示說有后門。在Admin.py中發現了序列化操作
接下來就是盲區了。。。。。
參考了很多資料和大佬的wp,
原理其實和php的差不多。只不過python的序列化不夠直觀,看起來費勁。
become參數存在反序列化漏洞,參數可控.。pickle.loads()進行了反序列化操作。我們利用的是__reduce__魔術方法。反序列化后產生的對象會在結束時觸發reduce從而執行我們構造的代碼。
這里采用通用的exp寫法
#!/usr/bin/python import pickle import urllib class payload(object): def __reduce__(self): return (eval, ("open('/flag.txt','r').read()",)) a = pickle.dumps(payload()) a = urllib.quote(a) print a
運行后得到payload,把箭頭指向的hidden屬性刪除。這樣就能利用網頁隱藏的post框提交,將become替換成payload。
參考博客:https://xz.aliyun.com/t/2289
https://www.freebuf.com/column/187567.html
https://www.sohu.com/a/274879579_729271