DedeCMS文件包含漏洞深度剖析:从LFI到RCE的攻击链与防御实践

📅 2026/8/8 23:04:48
DedeCMS文件包含漏洞深度剖析:从LFI到RCE的攻击链与防御实践
1. 项目概述一次对DedeCMS核心安全机制的深度剖析最近在复盘一些历史漏洞案例时CVE-2023-2928这个编号引起了我的注意。这是一个影响DedeCMS织梦内容管理系统的文件包含漏洞最终可以导致攻击者getshell进而实现远程代码执行RCE。对于从事Web安全研究、渗透测试或者正在维护DedeCMS站点的朋友来说理解这个漏洞的来龙去脉至关重要。它不仅仅是一个简单的漏洞编号更是一次对CMS系统安全设计尤其是对“用户输入绝对不可信”这一铁律的深刻验证。很多开发者甚至是有经验的开发者在处理文件路径、包含逻辑时依然会掉入相似的陷阱。今天我就结合自己的分析过程把这个漏洞的成因、利用条件、限制以及背后的安全逻辑彻底拆解清楚希望能帮你建立起更立体的防御视角。简单来说这个漏洞允许攻击者通过构造特定的请求诱使DedeCMS的某个核心文件包含并执行服务器上的任意文件在一定条件下。一旦成功攻击者就能上传一个Webshell从而完全控制服务器。整个过程涉及对DedeCMS路由机制、文件包含函数安全配置以及过滤逻辑的绕过。下面我们就从漏洞的环境定位开始一步步还原攻击链条。2. 漏洞环境与核心原理深度拆解2.1 漏洞影响范围与前置条件CVE-2023-2928影响的是DedeCMS V5.7.109版本。在开始分析之前我们必须明确一点不是所有DedeCMS站点都触手可及。漏洞的利用依赖于几个关键的前置条件缺一不可。这就像一把锁需要同时凑齐几把钥匙才能打开。首先目标站点必须开启了会员功能。DedeCMS的会员中心是一个相对独立的模块很多漏洞的入口点都藏在这里。其次攻击者需要拥有一个普通的会员账号并成功登录。这意味着漏洞并非一个无需授权的“惊天大洞”它需要攻击者先迈过身份认证这道门槛。最后也是技术上的核心目标服务器的PHP环境配置需要允许包含特定类型的文件。这里主要涉及allow_url_include和allow_url_fopen这两个PHP配置项。在默认情况下allow_url_include通常是关闭的这极大地限制了漏洞的直接利用方式迫使攻击者去寻找其他路径。注意在实际的渗透测试或安全评估中遇到一个同时满足“开启会员系统”、“存在可登录的弱口令或注册漏洞”、“PHP配置宽松”这三个条件的站点概率并非百分之百。因此这个漏洞更偏向于一种“条件组合”的利用理解这些条件有助于我们更准确地评估风险。2.2 漏洞触发点与路由机制分析漏洞的触发点位于会员中心的控制器文件。DedeCMS采用了类似MVC的模式用户访问的URL会被解析并加载对应的PHP文件。例如访问/member/index.php?uidtest这样的链接系统会尝试加载与uid参数对应的功能模块。问题的根源在于DedeCMS在动态加载这些模块文件时对传入的参数过滤不严。具体来说在/member/index.php中存在一段代码用于根据请求参数构造文件路径。攻击者可以通过控制参数注入目录遍历序列例如../../../使程序最终包含一个位于Web目录之外但攻击者可控或已知内容的文件。这里的关键是理解“文件包含”与“文件上传”的区别。文件包含漏洞Local File Inclusion, LFI本身并不直接上传文件而是“读取并执行”服务器上已有的文件。要getshell我们需要让服务器包含一个包含PHP代码的文件。如果allow_url_include为On我们可以尝试包含远程服务器上的文件Remote File Inclusion, RFI。但在默认Off的情况下我们就需要找到一个能将恶意代码写入服务器本地文件的方法。这时漏洞利用链条就常常与“文件上传”功能结合起来了。2.3 从文件包含到Getshell的逻辑跳跃单纯的本地文件包含LFI可能只能用来读取敏感文件如/etc/passwd要实现代码执行我们需要包含一个内容可控的、后缀为.php、.inc等会被PHP解析的文件。在DedeCMS的会员中心通常存在头像上传、附件上传等功能。这些功能本意是允许用户上传图片等资源但如果过滤不严攻击者可以上传一个伪装成图片的Webshell例如在图片末尾附加PHP代码。那么如何让文件包含漏洞去找到这个上传的Webshell呢这就需要利用路径穿越。假设我们通过上传漏洞将一个包含PHP代码的图片文件保存到了/uploads/user/202405/evil.jpg。由于.jpg后缀直接访问这个URL服务器只会把它当作图片输出其中的PHP代码不会被执行。但是通过文件包含漏洞我们可以构造这样的包含路径../../../uploads/user/202405/evil.jpg。当PHP的include或require函数去包含这个.jpg文件时文件内容会被读取并作为PHP代码尝试执行——因为包含操作发生在代码逻辑层不受Web服务器如Nginx/Apache根据后缀名分配处理程序的限制。只要文件内容以?php ... ?包裹代码就能执行。3. 漏洞利用链的实操复现与细节3.1 环境搭建与准备为了清晰地理解整个过程我建议你在本地或隔离的测试环境中搭建靶场。你可以从DedeCMS官网下载V5.7.109的历史版本。安装时记得开启会员系统模块。PHP环境建议使用5.6或7.x版本并确保register_globals为Off现代PHP默认如此同时观察allow_url_include的配置。为了方便测试你可以暂时将其设为On以体验RFI的利用方式但务必记住真实环境中它通常是Off的。准备一个普通的会员账号。如果测试环境允许开放注册直接注册一个即可。此外你还需要一个用于接收shell的连接工具比如一个简单的nc监听或者使用antsword、behinder等Webshell管理工具生成一个PHP马。3.2 关键步骤分解与操作实录第一步信息收集与入口定位登录会员中心后我们需要找到那个存在文件包含漏洞的参数点。通过审计代码或使用模糊测试工具如ffuf、wfuzz对member/index.php的各个参数进行测试。一个常见的测试payload是尝试包含系统已知文件例如?uid../../../../../../etc/passwd。如果页面返回了/etc/passwd的内容或者出现了与包含文件相关的错误如Warning: include()那么漏洞点就基本确定了。在实际测试中参数名可能不是uid也可能是action、do等这需要对DedeCMS的路由逻辑有一定了解。第二步文件上传点的寻找与绕过接下来我们需要一个地方上传我们的“图片Webshell”。会员中心的头像上传、发布文章时的附件上传都是潜在的目标。你需要检查这些上传功能对文件内容、后缀、MIME类型的检查。后缀名绕过如果系统只检查后缀名是否为.jpg/.png我们可以直接制作一个内容为?php eval($_POST[‘cmd’]);?的文件然后将其重命名为shell.jpg。文件头绕过更常见的检查是验证文件头Magic Bytes。我们可以使用copy命令Windows或cat命令Linux将一个正常的图片与Webshell代码合并# Linux/Mac cat normal.jpg shell.php webshell.jpg这样生成的文件拥有合法的JPEG文件头能通过大多数图片验证但当被包含时PHP引擎会从?php标签开始解析执行后面的代码。.htaccess配合在某些特定配置下Apache AllowOverride All如果攻击者能上传.htaccess文件可以强制指定某个目录下的.jpg文件被当作PHP解析但这需要更高的权限和特定的配置环境。第三步构造完整的利用链假设我们通过上传将我们的webshell.jpg文件保存到了/uploads/user/202405/webshell.jpg。同时我们发现了文件包含点参数f其基础路径是/member/。 那么最终的利用URL可能构造如下/member/index.php?f../../uploads/user/202405/webshell.jpg当服务器处理这个请求时代码逻辑会拼接路径/member/../../uploads/user/202405/webshell.jpg最终跳转到Web根目录下的/uploads/user/202405/webshell.jpg并将其包含。此时文件中的PHP代码得以执行攻击者就可以通过Webshell客户端连接使用$_POST[‘cmd’]传递系统命令实现RCE。3.3 利用过程中的难点与技巧绝对路径与相对路径文件包含时使用相对路径../../../的成功率取决于包含点的当前工作目录。有时使用绝对路径如/var/www/html/uploads/...更可靠但这需要攻击者事先知道网站的绝对路径可以通过包含错误日志或利用其他信息泄露漏洞获取。PHP封装协议如果allow_url_include为Off但PHP环境允许使用封装协议可以尝试php://input或php://filter。例如通过php://input并以POST方式发送PHP代码可以直接执行。但这通常需要allow_url_include为On或者有特定的配置。日志文件注入这是一种经典的LFI到RCE的技巧。如果攻击者能控制User-Agent、Referer等HTTP头并且服务器错误日志如/var/log/apache2/access.log可读那么可以将PHP代码注入到日志中然后通过文件包含漏洞去包含这个日志文件。不过包含日志文件通常需要知道其绝对路径并且日志文件体积可能很大包含时容易超时或导致错误。4. 漏洞根因分析与安全编码启示4.1 代码层问题溯源抛开具体的版本和文件这类漏洞的核心成因可以归结为以下几点未验证的用户输入直接用于文件路径操作这是最根本的原因。程序直接将来自$_GET或$_POST的参数未经任何规范化处理和合法性校验拼接进include或require语句中。路径遍历过滤不严或缺失即使程序尝试过滤../也可能存在绕过方式如使用....//、..\Windows、URL编码..%2f等。一个健壮的过滤应当移除所有可能的目录遍历序列并将路径规范化为绝对路径。动态包含逻辑设计缺陷为了灵活性而设计的动态模块加载机制如果没有严格的白名单控制即只允许包含预设的、已知安全的几个文件就会引入巨大的风险。4.2 安全加固建议对于开发者而言修复和预防此类漏洞可以从以下几个层面入手输入验证与白名单对于用于包含文件的参数最安全的做法是使用白名单机制。例如定义一个数组$allowedActions [‘index’, ‘profile’, ‘upload’]然后检查传入的参数是否在这个数组中不在则报错或跳转到默认页。绝对不要基于用户输入动态构造文件路径。路径规范化与过滤如果确实需要动态路径这种情况应尽量避免必须对输入进行严格的过滤。使用realpath()函数可以解析路径中的../符号并返回绝对路径然后检查这个绝对路径是否在允许的目录范围内。$baseDir ‘/var/www/html/member/modules/’; $userInput $_GET[‘f’]; $fullPath realpath($baseDir . $userInput); if ($fullPath false || strpos($fullPath, $baseDir) ! 0) { // 路径非法拒绝访问 die(‘Access Denied’); } include($fullPath);降低PHP配置风险在生产环境中务必确保php.ini中的allow_url_include和allow_url_fopen设置为Off。这可以阻断远程文件包含RFI的攻击向量迫使攻击者必须结合本地文件上传提高了利用门槛。文件上传安全对上传功能实施“防御纵深”。不仅检查文件后缀名还要检查MIME类型、文件头并对图片进行二次渲染压缩、裁剪这能有效破坏隐藏在图片中的恶意代码。将上传目录设置为不可执行脚本通过配置Web服务器禁止该目录解析PHP。5. 实战排查与防御部署指南5.1 如何检测站点是否存在此类漏洞对于运维人员或安全工程师可以通过以下方式检查代码审计重点检查member/、include/目录下的PHP文件搜索include、require、include_once、require_once关键字查看其参数是否有来自$_GET、$_POST、$_REQUEST等用户输入。自动化工具扫描使用像AWVS、Nessus、Xray等漏洞扫描器对网站进行扫描它们通常内置了检测常见文件包含漏洞的Payload。手动渗透测试在授权的前提下尝试使用../../../../etc/passwd、php://filter/convert.base64-encode/resourceindex.php该Payload用于读取源码等作为参数值进行测试观察响应差异。5.2 遭遇攻击后的应急响应如果怀疑站点已被利用此漏洞getshell应立即采取以下步骤隔离与取证立即将服务器断网或置于维护模式防止攻击者持续操作。备份当前的Web目录、日志文件尤其是访问日志和错误日志、以及可能被修改的系统文件用于后续分析。查找Webshell使用find命令结合grep在全站文件中搜索常见的Webshell特征码如eval(、assert(、system(、shell_exec(、base64_decode(等。find /var/www/html -name “*.php” -o -name “*.jpg” -o -name “*.png” | xargs grep -l “eval(” 2/dev/null同时检查最近被修改的文件find /var/www/html -type f -mtime -1漏洞修复根据分析结果定位到存在漏洞的具体代码文件按照前述的“安全加固建议”进行修复。如果暂时无法修复可以考虑在Web服务器Nginx/Apache层面设置规则拦截包含可疑路径遍历序列的请求。清理与恢复删除所有确认的Webshell文件。检查数据库是否有异常数据插入如管理员账号。从干净的备份中恢复被篡改的源码文件。修改所有相关系统的密码数据库、FTP、服务器SSH等。日志分析深入分析攻击时间段的访问日志还原攻击路径确定漏洞入口点并检查是否有其他未发现的入侵痕迹。5.3 长效防御策略最小权限原则运行Web服务的系统用户如www-data、nginx应仅拥有对Web目录的必要读写权限尤其不能有对/etc、/root等系统关键目录的读取权限。定期更新与补丁关注使用中的CMS、框架、插件的安全公告及时更新到最新版本。对于DedeCMS这类已经停止官方维护的系统应评估迁移到更活跃、安全维护更好的替代品。部署Web应用防火墙WAFWAF可以有效拦截常见的攻击Payload包括路径遍历、恶意文件包含请求等为修复漏洞争取时间。安全开发生命周期SDL在开发阶段就引入安全代码规范对开发人员进行安全培训在代码审核环节重点检查文件操作、命令执行、数据库查询等高风险函数的使用。这个漏洞的分析过程再次印证了一个道理安全是一个链条任何一个环节的薄弱都可能被突破。从宽松的PHP配置到有缺陷的上传功能再到最终的文件包含漏洞攻击者正是利用了这环环相扣的弱点。作为防御方我们的工作就是不断加固这个链条上的每一个环节。理解漏洞不仅是为了利用更是为了更好的防御。