本文也是分析t00ls表哥的文章后,无意中发现的另一处代码执行漏洞。版本是phpcms v9.5.8 现在官方已经修复了。
根据poc代码所在的url连接,我们可以定位到是phpcms/modules/content/content.php文件中的public_categorys函数,
这段代码是在构造categorys数组,并为下面的操作做准备
从这段代码中可以看出,如果$categorys不为空,则进入if条件语句中,在这里switch语句中,$from无论是什么值,$strs将会一定存在$_GET['menuid’]这个变量的值。并且$tree->get_treeview函数的参数,也就是phpcms/libs/classes/tree.class.php中的get_treeview函数,我们跟入这个函数
上面的是这个函数的介绍,下面是这个函数所存在漏洞的地方
if($this->get_child($id)){
eval("\$nstr = \"$str2\";");
$this->str .= $nstr;
if($showlevel == 0 || ($showlevel > 0 && $showlevel > $currentlevel)) {
$this->get_treeview($id, $effected_id, $str, $str2, $showlevel, $style, $currentlevel+1, TRUE);
} elseif($showlevel > 0 && $showlevel == $currentlevel) {
$this->str .= $placeholder;
}
} else {
eval("\$nstr = \"$str\";");
$this->str .= $nstr;
}
在这里,首先判断一下是不是子样式表,如果不是将会通过eval去执行$str2,如果是子样式表,则会执行$str,也就是一定会执行包含恶意代码的字符串。
$_GET['menuid'] = intval($_GET['menuid’]);
即可修复漏洞