CTF-flask模板注入學習

任意俠氣徐鳳年發表於2021-08-23

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

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

我們做題的,需要知道flask是怎麼執行的就行了。
image
這個就是一個最簡單的flask應用,當我們訪問的時候,就會顯示hello world的字樣。

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

大的不用懂,我們這樣理解,寫一個py檔案,來帶動html來顯示頁面就行。
和正常的html不同的是,這個頁面是靠py檔案來驅使的。
image
但這個時候,我們就又迷糊了,如果html要傳個引數什麼的,該怎麼寫?
image
就是這樣。

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

模板注入

不正確的使用flask中的render_template_string方法會引發SSTI。
image
這個code是使用者可控的,那就可以傳入xss程式碼和後面的html程式碼拼接,造成xss。
image

但是我們改一下

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

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

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

image

再看看這道題

image

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

一個個看吧。
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’]}}

相關文章