当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(4) 关注此漏洞

缺陷编号: WooYun-2011-02648

漏洞标题: Smarty3远程代码执行漏洞

相关厂商: Smarty

漏洞作者: BNE

提交时间: 2011-08-08

公开时间: 2011-08-08

漏洞类型: 网络设计缺陷/逻辑错误

危害等级: 高

自评Rank: 15

漏洞状态: 未联系到厂商或者厂商积极忽略

漏洞来源: http://www.wooyun.org

Tags标签: 第三方框架 盲目信任用户数据 远程代码执行 smarty


漏洞详情

披露状态:

2011-08-08: 积极联系厂商并且等待厂商认领中,细节不对外公开
2011-08-08: 厂商已经主动忽略漏洞,细节向公众公开

简要描述:

Smarty是PHP下广泛使用的前端模板框架。但由于Smarty3引入了新的特性,导致在某些情况下,可以利用特性组合直接远程执行任意代码。

详细说明:

此漏洞原作者:cly,我代为发布而已:)

由于Smarty3中引入了两个特性:
1、如果display,fetch等方法的模板路径参数接受到的模板文件名是以“string:”或者“eval:”开头的,smarty3就会将此后的字符串值作为模板文件内容,重新编译并执行之。参考连接:http://www.smarty.net/docs/en/template.resources.tpl#templates.from.string
2、smarty3的模板语言中,可以利用{phpfunction()}等方式直接在smarty tag中执行php表达式。而smarty2中则不支持。参考连接:http://www.smarty.net/docs/en/language.syntax.variables.tpl

因此,利用以上两个特性相结合,如果用户可以控制模板文件名,即可执行任意php表达式。

同样的,利用smarty3的resource特性,还可以直接利用“file:”协议直接远程包含任意文件。因为底层是使用fopen函数实现的文件打开,而默认的php配置中,虽然禁止了remote_file_include,但是对于remote_file_open却是允许的。利用这一个特性,让早已消失已久的RFI经典漏洞类型重见天日了。:)

漏洞证明:

1、如果在编写代码的过程中存在如下逻辑的代码,即将用户输入带入代码逻辑获取:

$smarty->display($_REQUEST['tpl'].”.tpl”);


2、用户可以在访问脚本时,在URL中指定特定参数,如“?tpl=string:{phpinfo()}”,即可执行phpinfo代码。

修复方案:

去除所有使用用户输入作为模板名进行渲染的代码,使用白名单方式限制只允许载入已知的tpl文件。

版权声明:转载请注明来源 BNE@乌云


漏洞回应

厂商回应:

未能联系到厂商或者厂商积极拒绝


漏洞评价:

对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值

漏洞评价(共0人评价):
登陆后才能进行评分

评论

  1. 2011-08-08 16:58 | Meck ( 实习白帽子 | Rank:4 漏洞数:2 | phper)
    0

    这种不该算是smarty的漏洞吧。。。。

  2. 2011-08-10 13:34 | tenzy ( 普通白帽子 | Rank:53 漏洞数:9 | 尼玛死亡节奏技术小组的有木有,恶灵战队的...)
    0

    首现,一般情况下,display的模版文件名不会通过提交来获取, 其次,这是程序员编码失误,不是smarty问题。如果它不允许执行PHP语句,那模版就不好用了。。

  3. 2011-08-12 16:39 | xsser (核心白帽子 | Rank:249 漏洞数:17 | 你说这个城市很脏,我觉得你挺有思想)
    0

    仔细看看哦 楼上

登录后才能发表评论,请先 登录