DedeCMS文件包含漏洞深度剖析:为什么一个‘无害’的txt文件能让你getshell?

张开发
2026/4/6 7:45:58 15 分钟阅读

分享文章

DedeCMS文件包含漏洞深度剖析:为什么一个‘无害’的txt文件能让你getshell?
DedeCMS文件包含漏洞技术解析从文本文件到系统沦陷的连锁反应在内容管理系统CMS的安全领域最危险的漏洞往往藏匿于最平凡的功能之中。DedeCMS作为国内广泛使用的开源CMS其文件包含漏洞CVE-2023-2928的触发路径令人警醒——一个用于保存超链接的普通文本文件allowurl.txt如何成为攻击者获取服务器控制权的跳板本文将深入剖析漏洞形成的技术链条揭示防御思维中的盲点。1. 漏洞技术背景与攻击路径还原1.1 文件包含漏洞的本质特征文件包含File Inclusion漏洞的本质是程序未能正确校验用户控制的文件路径参数导致攻击者可以包含并执行非预期的文件。在PHP环境中这类漏洞通常表现为// 危险示例直接包含用户输入的参数 include($_GET[template] . .php);DedeCMS的漏洞特殊之处在于它通过两个看似独立的组件形成了攻击链超链接保存功能article_allowurl_edit.php将用户提交的URL数据写入allowurl.txt文件管理功能file_manage_control.php通过构造特殊请求实现文件包含1.2 攻击步骤的技术拆解攻击者实际利用过程可分为三个阶段阶段操作关键点1. 写入恶意代码向article_allowurl_edit.php提交含PHP代码的超链接利用stripslashes仅过滤XSS的局限2. 构造包含请求创建调用allowurl.txt的PHP文件绕过直接执行检测3. 触发代码执行访问构造的PHP文件通过包含机制激活恶意代码# 典型攻击流量特征简化版 POST /dede/file_manage_control.php HTTP/1.1 Content-Type: application/x-www-form-urlencoded fmdoeditfilenamemalicious.phpstr?php include(./data/admin/allowurl.txt);?2. 关键代码逻辑缺陷分析2.1 输入过滤机制的失效article_allowurl_edit.php中的过滤逻辑存在根本性缺陷// 原始过滤代码简化版 $allurls stripslashes($_POST[allurls]); file_put_contents($allowurl_file, $allurls);stripslashes()函数仅用于防止SQL注入和XSS但未检测或过滤PHP代码标记?php ?未限制文件内容类型纯文本应禁止代码标记无内容编码或转义处理2.2 文件管理接口的设计失误file_manage_control.php暴露了三个致命问题权限控制缺失未验证文件操作请求的合法性路径校验不足允许用户指定任意包含路径功能耦合过度文件编辑与包含逻辑未隔离// 危险的文件包含实现模拟代码 if ($fmdo edit) { file_put_contents($filename, $str); include($filename); // 致命操作 }3. 安全防御的多维度解决方案3.1 代码层修复方案针对此类漏洞需实施纵深防御策略输入验证// 安全的超链接过滤示例 function validateUrls($input) { $urls explode(\n, strip_tags($input)); foreach ($urls as $url) { if (!filter_var(trim($url), FILTER_VALIDATE_URL)) { throw new Exception(Invalid URL format); } } return implode(\n, $urls); }文件操作防护禁用危险函数php.ini中设置disable_functionsinclude,require使用安全包含方式$allowed [header.php, footer.php]; if (in_array(basename($file), $allowed)) { include(__DIR__ . /templates/ . $file); }3.2 系统配置加固建议对于使用CMS的运维人员应立即实施文件权限控制# 关键目录权限设置 chmod 750 /path/to/dede/data/admin/ chattr i /path/to/dede/data/admin/allowurl.txtWeb服务器防护Nginx配置限制PHP文件解析location ~* ^/uploads/.*\.(txt|log)$ { deny all; }入侵检测规则# ModSecurity规则示例 SecRule ARGS contains ?php id:1001,deny,msg:PHP code injection attempt4. 安全开发的最佳实践4.1 文件处理的安全范式开发涉及文件操作的功能时必须遵循最小权限原则运行账户仅具有必要目录的读写权白名单校验严格限制可操作的文件类型和路径内容消毒对写入文件的数据进行转义或编码// 安全的文件写入示例 function safeWrite($path, $content) { $base /approved/directory/; $realPath realpath($base . ltrim($path, /)); if (strpos($realPath, $base) ! 0) { throw new Exception(Path traversal attempt); } if (preg_match(/\?php/i, $content)) { throw new Exception(PHP code detected); } file_put_contents($realPath, htmlspecialchars($content)); }4.2 CMS安全运维检查清单对于CMS维护者建议建立定期检查机制补丁管理订阅官方安全通告建立测试环境的补丁验证流程文件监控使用inotify监控关键文件变更定期校验系统文件哈希值渗透测试每季度执行授权安全测试重点检测文件上传/包含功能# 简单的文件完整性检查脚本 #!/bin/bash find /var/www/html -type f -name *.php -exec md5sum {} \; /opt/checksums.txt diff /opt/checksums.txt /opt/baseline.txt在真实环境中我们曾遇到攻击者通过类似漏洞植入的挖矿脚本。由于攻击者精心构造的请求与正常管理操作流量混合传统WAF规则未能及时报警。这提醒我们防御此类漏洞需要代码审计、配置加固和流量监控的多重配合。

更多文章