今天又看到了一道這樣的題,之前一直都學不明白的東西
反反復復給你看的時候,就想搞明白了。
我們做題的,需要知道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() 傳入的信息列表。
再找到可以利用的內置函數,直接沖就行了。