[WesternCTF2018]shrine
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/<path: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)
flask引擎-jinja2模板注入
利用tplmap这个工具进行检测是否有模板注入漏洞
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZEXLJHkq-1588052755103)(C:\Users\honor\AppData\Roaming\Typora\typora-user-images\1588051929946.png)]](https://i-blog.csdnimg.cn/blog_migrate/69ff98f7ae3eec33df6f4c464330ec46.png)
Automatic Server-Side Template Injection Detection and Expleion tool [checks] Tested parameters appear to be not injectable
翻译:
服务器端模板自动注入检测和删除离子工具!][检查经过测试的参数似乎无法注入
模板渲染接受的参数需要用两个大括号括起来{{}}
模板注入也在大括号里构造
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1p10nrIi-1588052731868)(C:\Users\honor\AppData\Roaming\Typora\typora-user-images\1588052033551.png)]](https://i-blog.csdnimg.cn/blog_migrate/c0519c6fc31143435aa8eae7a19b2df4.png)
在shrine路径下 ssti注入能运行
回头看下源码
app.config[‘FLAG’] = os.environ.pop(‘FLAG’)
注册了一个名为FLAG的config,猜测这就是flag,
如果没有过滤可以直接{{config}}即可查看所有app.config内容
推测{{config}}可查看所有app.config内容,但是这题设了黑名单[‘config’,‘self’]并且过滤了括号
不过python还有一些内置函数,比如url_for和get_flashed_messages
/shrine/{{url_for.globals}}
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JuZplCkN-1588052731869)(C:\Users\honor\AppData\Roaming\Typora\typora-user-images\1588052314046.png)]](https://i-blog.csdnimg.cn/blog_migrate/0b513a5663e724f91488b6f0794fc4cf.png)
current_app-当前app,查看当下app中的config
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VMnUNcw0-1588052731876)(C:\Users\honor\AppData\Roaming\Typora\typora-user-images\1588052397235.png)]](https://i-blog.csdnimg.cn/blog_migrate/e1b790667c7775c2ccac4ed67a9c1aed.png)
得到flag
知识点:
SSTI模板注入:

模板注入涉及的是服务端Web应用使用模板引擎渲染用户请求的过程
服务端把用户输入的内容渲染成模板就可能造成SSTI(Server-Side Template Injection)
引擎有不同的测试以及注入方式:
flask/jinja2模板注入
PHP/模版引擎Twig注入
本文深入解析了服务器端模板注入(SSTI)的概念,通过WesternCTF2018的shrine挑战实例,展示了如何利用flask/jinja2模板引擎的漏洞,绕过黑名单过滤,最终获取FLAG。介绍了SSTI的检测工具tplmap的使用方法。
630





