Smarty SSTI

这几天碰到俩Smarty模板注入的题,记录一下

Smarty简介

Smarty是一个PHP的模板引擎,它提供了一种易于管理和使用的办法,用来将原本与HTML代码混杂在一起的PHP代码逻辑分离

漏洞确认

在可能出现模板注入的输入点,输入以下POC进行判断:

查看Smarty版本:

{$smarty.version}

注释:

1
{#xxx#}

漏洞利用

不同版本可以利用的方式不同,常用的有以下三种方法:

1.旧版Smarty支持使用{php}{/php}标签来执行被包裹其中的php指令。

Smarty3的官方手册描述:

Smarty已经废弃{php}标签,强烈建议不要使用。在Smarty 3.1,{php}仅在SmartyBC中可用

2.旧版Smarty可以通过self获取Smarty类再调用其静态方法实现文件读写

3.PHP函数都可以在模板中使用,因此注入时,可以直接使用:

{system('ls')}

便可随意执行命令;执行多条语句的话可以使用下面的形式:

{system('ls')}{system('cat index.php')}

题目分析

两道题其中一道是[BJDCTF2020] The mystery of ip,另一道是[CISCN2019 华东南赛区]Web11(这道题攻防世界上有道升级版的,原版无限制,而攻防世界上添加了个open_basedir限制和disable_functions),在buu上都有复现

这两道题目注入点都在X-Forwarded-For上,开始页面会显示你的ip,添加XFF后就变成了你的XFF后面的值;用一个大括号便可测出存在模板注入

攻防世界上的尝试绕过open_basedir,不过发现绕不过去…发现函数并没有禁用完全,可以用mail+putenv,使用LD_PRELOAD突破,getshell后直接:

cmd=cat /flag&outpath=/tmp/xx

其他

发现一个检测并利用SSTI的工具,挺厉害的:

https://github.com/epinna/tplmap

拿buu上Real分类中的Flask SSTI测试:

./tplmap.py -u 'http://node3.buuoj.cn:25892/?name=a' --os-shell

可直接检测出来并获得shell