今天又看到了一道這樣的題,之前一直都學不明白的東西

反反覆覆給你看的時候,就想搞明白了。

我們做題的,需要知道flask是怎麼執行的就行了。



這個就是一個最簡單的flask應用,當我們訪問的時候,就會顯示hello world的字樣。

flask之所以安全是因為他是靠渲染的flask的渲染方法有render_template和render_template_string兩種。

大的不用懂,我們這樣理解,寫一個py檔案,來帶動html來顯示頁面就行。

和正常的html不同的是,這個頁面是靠py檔案來驅使的。



但這個時候,我們就又迷糊了,如果html要傳個引數什麼的,該怎麼寫?



就是這樣。

重點就是{{}}在Jinja2中作為變數包裹識別符號。

模板注入

不正確的使用flask中的render_template_string方法會引發SSTI。



這個code是使用者可控的,那就可以傳入xss程式碼和後面的html程式碼拼接,造成xss。

但是我們改一下



這樣把我們傳的引數放入 render_template_string中。就會被預設轉義了。

瞭解了漏洞形成的原因,但是我們怎麼在CTF利用中。

遇到ssti就先傳參,看看什麼模板

再看看這道題

我去。。拉了拉了,看不明白了。

一個個看吧。

app.config[‘FLAG’] = os.environ.pop(‘FLAG’),這樣的話{{config}}可檢視所有app.config內容,但是config被加入了黑名單,但是在Flask中,有一些特殊的變數和方法是可以在模板檔案中直接訪問的。

程式碼將 () 替換為空字元,還把config和self加入了黑名單。

return返回的就是你的引數給你做了一些限制後的引數

config 物件:

config 物件就是Flask的config物件,也就是 app.config 物件。

{{ config.SQLALCHEMY_DATABASE_URI }}

雖然有過濾但python還有一些內建函式,比如url_for和get_flashed_messages

url_for()作用:

(1)給指定的函式構造 URL。

(2)訪問靜態檔案(CSS / JavaScript 等)。 只要在你的包中或是模組的所在目錄中建立一個名為 static 的資料夾,在應用中使用 /static 即可訪問。

get_flashed_messages方法: 返回之前在Flask中通過 flash() 傳入的資訊列表。

再找到可以利用的內建函式,直接衝就行了。

payload:

{{url_for.globals[‘current_app’].config[‘FLAG’]}}

{{get_flashed_messages.globals[‘current_app’].config[‘FLAG’]}}