题目 — Web_python_template_injection
考点:SSTI(服务器模板注入)
一、知识点
1. 何为模板注入
- 模板引擎可以让(网站)程序实现 界面 与 数据 分离,业务代码 与 逻辑代码 的分离,这大大提升了开发效率,良好的设计也使得代码重用变得更加容易。
- 但是模板引擎也拓宽了我们的攻击面。注入到模板中的代码可能会引发 RCE 或者 XSS
2. flask基础
(1)路由
from flask import flask
@app.route('/index/')
def hello_world():
reutrn 'hello world'
# route装饰器的作用是将 函数 和 URL 绑定起来,
# 代码的作用就是当你访问http://127.0.0.1:5000/index的时候,flask会返回hello word
(2)渲染方法
- flask的渲染方法有:render_template() 和 render_template_string()
- render_template(index.html) ---- 渲染指定的文件
- render_template_string(html) ---- 渲染一个字符串,html是一个字符串。SSTI 的产生和这个方法密切相关
(3)模板
- flask 使用 Jinja2 (Jinja2 是基于 python 的模板引擎)(模板引擎:为了使 用户界面 与 业务数据 分离而产生的)作为渲染的引擎
- 在网站根目录下新建 templates文件夹(它下面有一个index.html文件) ,用来存放html文件。也就是模板文件。
- 这里有一个 test.py文件
from flask import Flask,redirect,render_template,render_template_string
@app.route('/index/')
def user_login():
return render_template('index.html')
# 用户访问 http://127.0.0.1/index/ ,flask 就会渲染出 index.html 文件(/templates/index.html)
- 模板文件不是单纯的html代码,模板文件中是可以传参的。比如下面的例子
from flask import Flask,redirect,render_template,render_template_string
@app.route('/index/')
def user_login():
return render_template('index.html',content='This is index page.')
# content 就是给模板文件中传入的参数。模板文件中是这样接收参数的:<h1>{
{conte