Smarty是PHP下广泛使用的前端模板框架。但由于Smarty3引入了新的特性,导致在某些情况下,可以利用特性组合直接远程执行任意代码。 由于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经典漏洞类型重见天日了。:) Smarty3 去除所有使用用户输入作为模板名进行渲染的代码,使用白名单方式限制只允许载入已知的tpl文件。
Smarty是PHP下广泛使用的前端模板框架。但由于Smarty3引入了新的特性,导致在某些情况下,可以利用特性组合直接远程执行任意代码。 由于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经典漏洞类型重见天日了。:) Smarty3 去除所有使用用户输入作为模板名进行渲染的代码,使用白名单方式限制只允许载入已知的tpl文件。