CTF-flask模板注入學習


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

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

我們做題的,需要知道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’]}}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM