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])

 

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

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

相关文章

吃透底层:从路由到前缀树

前言 今天学到关于路由相关文章&#xff0c;发现动态路由中有一个很常见的实现方式是前缀树&#xff0c;很感兴趣这个算法&#xff0c;故进行记录。 前缀树 Trie&#xff08;又被叫做字典树&#xff09;可以看作是一个确定有限状态自动机&#xff0c;尽管边上的符号一般是隐含…

Netty通信在中间件组件中的广泛使用-Dubbo3举例

Netty是一个高性能异步IO通信框架&#xff0c;封装了NIO&#xff0c;对各种bug做了很好的优化解决。所以很多中间件底层的通信都会使用Netty&#xff0c;比如说&#xff1a;Dubbo3&#xff0c;rocketmq&#xff0c;ElasticSearch等。 比方说&#xff0c;我们使用dubbo作为rpc跨…

基于SSM线上课程管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

C++构造函数

在本文中&#xff0c;您将学习C 中的构造函数。您将学习什么是构造函数&#xff0c;如何创建它以及C 中的构造函数类型。 构造函数是成员函数的一种特殊类型&#xff0c;它在创建对象时会自动对其进行初始化。编译器通过其名称和返回类型将给定的成员函数标识为构造函数。构造函…

各报文段格式集合

数据链路层-- MAC帧 前导码8B&#xff1a;数据链路层将封装好的MAC帧交付给物理层进行发送&#xff0c;物理层在发送MAC帧前&#xff0c;还要在前面添加8字节的前导码&#xff08;分为7字节的前同步码1字节的帧开始定界符&#xff09;MAC地址长度6B数据长度46&#xff5e;1500B…

爬取微博热榜并将其存储为csv文件

&#x1f64c;秋名山码民的主页 &#x1f602;oi退役选手&#xff0c;Java、大数据、单片机、IoT均有所涉猎&#xff0c;热爱技术&#xff0c;技术无罪 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 获取源码&#xff0c;添加WX 目录 前言1.…

防止SQL注入攻击的综合解决方案

文章目录 摘要背景和危害性防御措施示例代码&#xff08;Java&#xff09;示例代码&#xff08;PHP&#xff09;示例MySQL命令示例代码&#xff08;Python&#xff09;示例代码&#xff08;C#&#xff0c;使用Entity Framework&#xff09; 进一步防御SQL注入攻击的措施使用ORM…

【Linux】Git使用

一、Git简介 Git 是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理很小或非常大的项目。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 Git 与常用的版本控制工具 CVS, Subversion 等不同&#xff0c;它采用了分布…

Kafka 简介之(学习之路)

正文 一、简介 1.1 概述 Kafka是最初由Linkedin公司开发&#xff0c;是一个分布式、分区的、多副本的、多订阅者&#xff0c;基于zookeeper协调的分布式日志系统&#xff08;也可以当做MQ系统&#xff09;&#xff0c;常见可以用于web/nginx日志、访问日志&#xff0c;消息服务…

原生JS-鼠标拖动

原生JS-鼠标拖动 通过鼠标的点击事件通过h5的属性 通过鼠标的点击事件 步骤&#xff1a; 1. 鼠标按下div。 2. 鼠标移动&#xff0c;div跟着移动 原生js&#xff0c;实现拖拽效果。1. 给被拖拽的div加上 onmousedown 鼠标【按下事件】。鼠标按下的时候&#xff0c;开始监听鼠标…

【Spring框架学习3】Spring Bean的作用域 及 生命周期

一、Spring Bean的作用域有哪些&#xff1f; Spring框架支持以下五种Bean的作用域&#xff1a; Singleton&#xff1a;这是默认的作用域&#xff0c;在每个Spring IoC容器中只有一个Bean的实例(IoC初始化后)。Spring 中的 bean 默认都是单例的&#xff0c;是对单例设计模式的…

cesium图标漂移分析与解决

漂移现象如下 什么是图标漂移&#xff1f; 随着视野改变&#xff0c;图标相对于地面发生了相对位置的变化 让人感觉到图标有飘忽不定的感觉 原因分析 图标是静止的&#xff0c;它的位置在世界坐标系中是绝对的、静止的。 漂移大部分的原因是&#xff1a; 透视关系发生了错…

新华三辅导笔记 2023/10/9-2023/10/13

新华三辅导笔记 一、需要用到的软件二、计算机网络概述1、计算机网络的定义和基本功能&#xff08;1&#xff09;什么是计算机网络&#xff08;2&#xff09;计算机网络的基本功能 2、&#xff08;1&#xff09;局域网、城域网和广域网&#xff08;范围划分&#xff09;&#x…

OpenCV防抖实践及代码解析笔记

视频防抖是指用于减少摄像机运动对最终视频的影响的一系列方法。摄像机的运动可以是平移&#xff08;比如沿着x、y、z方向上的运动&#xff09;或旋转&#xff08;偏航、俯仰、翻滚&#xff09;。 正如你在上面的图片中看到的&#xff0c;在欧几里得运动模型中&#xff0c;图像…

leetcode:190. 颠倒二进制位

一、题目&#xff1a; 函数原型&#xff1a; uint32_t reverseBits(uint32_t n) 解释&#xff1a;uint32是无符号int或short的别称&#xff0c;传入的参数是一个32位二进制串&#xff0c;返回值是该32位二进制串逆序后的十进制值 二、思路&#xff1a; 实际上并不需要真的去逆…

移动应用-Android-开发指南

Android-UI开发指南 Android Studio调试UI设计UI框架布局Layout文本框 android的活动Activity基本概念Activity的生命周期Activity栈创建Activity管理ActivityActivity间传递数据 FragmentAdapterRecyclerViewRecyclerView Adapter&#xff08;适配器&#xff09;事件setOnItem…

Can 通信-协议

概述 CAN 是 Controller Area Network 的缩写&#xff08;以下称为 CAN&#xff09;&#xff0c;是 ISO国际标准化的串行通信协议。 在当前的汽车产业中&#xff0c;出于对安全性、舒适性、方便性、低公害、低成本的要求&#xff0c;各种各样的电子控制系统 被开发了出来。由于…

uniapp快速入门系列(3)- CSS技巧与布局

章节三&#xff1a;CSS技巧与布局 1. uniapp中的样式编写2. 常见布局技巧与实例解析2.1 水平居中布局2.2 垂直居中布局2.3 等高布局2.4 响应式布局 3. CSS动画与过渡效果 在uniapp中&#xff0c;我们使用CSS来设置页面的样式和布局。本章将介绍一些在uniapp中常用的CSS技巧和布…

IDEA的使用(一)代码模块的导入、快捷使用、自定义 (IntelliJ IDEA 2022.1.3版本)

目录 1. IDEA项目结构 2. 模块的导入操作 2.1 正规操作 2.2 取巧操作 2.3 出现乱码 2.4 模块改名 3. 代码模板的使用 后缀补全&#xff08;Postfix Completion&#xff09;、实时模板&#xff08;Live Templates&#xff09;菜单里面什么介绍都有&#xff0c;可以自学&a…

4.02 用户中心-上传头像功能开发

详细内容请看下面地址&#xff1a; 地址&#xff1a;http://www.gxcode.top/code