前言
这题主要考的是ssti注入,与以前不同的是这是我第一次遇到Smarty的ssti注入题。
确定漏洞
- 打开题目后发现右上方有个
Current IP:127.0.0.1
很明显这是我用xxf伪造的ip。猜测ssti。 - 抓包,按照下图的判断可以知道是 Smarty 框架。
- 然后一般情况下输入{$smarty.version}就可以看到返回的smarty的版本号。该题目的Smarty版本是3.1.30
常用利用方式
{php} 标签
Smarty支持使用{php}{/php}标签来执行被包裹其中的php指令,最常规的思路自然是先测试该标签。但就该题目而言无效,因为3.1.30已废除这个{php}标签。
{literal} 标签
{literal}可以让块中间的内容忽略Smarty的解析。我们可以使用
1 | {literal}<script language="php">phpinfo();</script>{/literal} |
但是php7已经不支持<script language="php">
这种写法了。
{if} 标签 (牛掰)
每个{if}必须有一个配对的{/if}. 也可以使用{else} 和 {elseif}. 全部的PHP条件表达式和函数都可以在if内使用。
也就是说我们把php代码写在{if PHP代码}{/if}
就可以了,PHP代码可以被执行。
题解 payload
我们使用如下payload 放再 xxf位置:
1 | {if system('cat /flag')}{/if} |