漏洞核心原理:404页面被“劫持”执行PHP代码
这个漏洞的本质,并不是404页面本身有问题,而是DEDECMS处理404页面的逻辑存在缺陷,导致黑客可以构造一个特殊的URL,让服务器错误地将这个URL当作一个PHP文件来执行。

让我们一步步拆解这个过程:
正常的404流程
- 用户访问一个不存在的页面,
http://your-site.com/xxxxx.html - Web服务器(如Apache或Nginx)发现这个文件不存在,于是触发404错误。
- DEDECMS的
php页面被调用,向用户显示一个友好的“页面不存在”的提示。
黑客攻击流程(漏洞利用)
这个漏洞利用了DEDECMS一个叫做"安全模式"的机制,以及服务器的一个配置特性。
-
前提条件A:DEDECMS开启了“安全模式” 在DEDECMS后台,有一个“系统” -> “系统基本参数” -> “核心设置” -> “是否开启防黑客入侵”的选项,开启后,DEDECMS会检查
HTTP_REFERER(来路)信息,如果请求的来源不是本站,系统会进行拦截或重定向。 -
前提条件B:Web服务器(Apache)的
mod_rewrite和MultiViews特性 很多网站为了美化URL,会开启mod_rewrite(URL重写),而MultiViews是一个特性,它允许服务器在没有精确匹配文件时,尝试根据文件扩展名进行模糊匹配。
(图片来源网络,侵删)
漏洞攻击步骤:
-
构造恶意URL: 黑客会构造一个看起来像图片、CSS或JS文件,但实际包含PHP代码的URL。
http://your-site.com/plus/404.php?url=a.jpg -
绕过“安全模式”: 黑客在请求这个URL时,会伪造
HTTP_REFERER头部,将其设置为当前网站的域名,Referer: http://your-site.com/。 这样,DEDECMS的“安全模式”检查就会认为这是一个“来自本站”的合法请求,从而放行。 -
触发服务器漏洞:
- 服务器收到对
plus/404.php?url=a.jpg的请求。 - 它首先会检查
php是否存在,存在则执行。 - 在
php文件中,DEDECMS会获取url参数的值,即a.jpg。 - 关键漏洞点:DEDECMS的代码会尝试包含这个文件:
@include(DEDEROOT.'/'.$url); - 由于服务器开启了
MultiViews,当它找不到a.jpg时,会尝试寻找a.jpg.php,如果这个文件不存在,服务器会将其作为404请求,并最终交由php处理。 - 如果黑客的URL是
http://your-site.com/plus/404.php?url=/../../shell.php,情况就完全不同了,这里的 是目录遍历,/../../shell.php会尝试从网站根目录向上找,然后向下进入plus目录,找到shell.php。 - 更常见的攻击方式是:黑客会先通过其他漏洞(如文件上传漏洞)向你的网站上传一个包含恶意PHP代码的文件,
images/shell.jpg(虽然后缀是jpg,但内容是PHP代码)。 - 他就可以构造如下URL来执行这个木马:
http://your-site.com/plus/404.php?url=images/shell.jpg
- 服务器收到对
-
执行恶意代码: 当
php执行@include('images/shell.jpg');时,因为images/shell.jpg的内容是PHP代码,所以这段代码就会被服务器当作PHP脚本执行。
(图片来源网络,侵删)
一句话总结漏洞原理:通过伪造Referer绕过DEDECMS的安全检查,再利用php文件包含机制,执行黑客预先上传到服务器上的任意PHP文件。
攻击后果(黑客能做什么?)
一旦黑客通过这个漏洞成功执行了PHP代码(即所谓的“Webshell”),你的网站就完全沦陷了,他们可以:
- 网站挂马:在你的网站上植入恶意代码,访问你网站的用户可能会被跳转到色情、赌博等恶意网站,导致网站被搜索引擎降权或封禁。
- 数据窃取:轻松获取网站的数据库信息,包括网站后台管理员的用户名和密码、网站用户的注册信息、订单数据等敏感信息。
- 服务器权限获取:如果Web服务器权限配置不当,黑客可能利用Webshell进一步提权,获取服务器的最高控制权,从而控制整个服务器,攻击同服务器上的其他网站。
- 发送垃圾邮件:利用你的服务器资源发送大量垃圾邮件,导致你的IP被列入黑名单。
- 植入后门:在网站中留下永久性的后门,即使你修复了404漏洞,黑客也能通过其他方式重新控制网站。
解决方案与修复方法
如果你怀疑或确认网站被此漏洞攻击,请立即按以下步骤操作:
紧急响应:隔离与清除
- 立即断网:如果情况严重,暂时关闭网站或从服务器上拔掉网线,防止损失扩大。
- 查找并删除Webshell:通过FTP或服务器文件管理器,全面搜索网站目录下所有可疑文件,特别注意文件名怪异、文件大小异常(通常很小,几KB)、最后修改时间不合理的文件,黑客上传的Webshell文件可能伪装成图片、CSS等,如
shell.jpg,config.bak,201x.php等。 - 清理数据库:检查数据库中是否有被篡改的数据,如被添加的广告链接、恶意内容等。
根本修复:堵上漏洞
-
官方升级(推荐) 这是最彻底的解决方法,访问DEDECMS官方网站,下载并安装最新版本的CMS,新版本已经修复了这个逻辑漏洞。
-
修改404.php文件(适用于无法立即升级的用户) 打开
/plus/404.php文件,找到类似下面这行代码:// ... 其他代码 ... if($typeid > 0 && $action == 'index') { include(DEDEROOT."/index.php"); exit(); } else { // 这里是漏洞的关键点 @include(DEDEROOT.'/'.$url); } // ... 其他代码 ...将
@include(DEDEROOT.'/'.$url);这一行删除或注释掉(在行首加 )。 修改后,你的404页面将不再尝试包含任何文件,只会显示固定的错误信息。 这虽然修复了漏洞,但也失去了DEDECMS原有的智能404跳转功能,这是一个权衡。 -
修改服务器配置(从根源上杜绝) 在Apache的配置文件(
httpd.conf)或虚拟主机配置中,找到你的网站配置部分,添加或修改以下内容,以禁用MultiViews特性:<Directory "你的网站根目录"> Options -MultiViews # ... 其他配置 ... </Directory>然后重启Apache服务,这可以防止服务器进行文件扩展名的模糊匹配,从而堵住文件包含的路径。
长期安全加固
- 及时更新:保持CMS程序、插件、主题都更新到最新版本。
- 使用强密码:后台管理密码、数据库密码必须是复杂且唯一的。
- 限制后台登录IP:如果条件允许,在服务器层面或使用插件,只允许特定IP地址访问后台登录页面。
- 定期备份:定期备份网站文件和数据库,并将备份文件保存在安全的地方。
- 安装安全插件:可以考虑安装一些专业的网站安全防护插件,它们可以拦截恶意请求、扫描Webshell等。
如何判断网站是否被攻击?
- 查看服务器日志:这是最直接的方法,登录你的服务器,查看网站访问日志(通常在
/var/log/apache2/或/var/log/nginx/目录下,文件名如access.log),搜索包含php的请求,看Referer和url参数是否可疑。 - 文件时间检查:在FTP工具中,按“最后修改时间”排序,查看近期是否有不寻常的文件被创建或修改。
- 网站行为异常:发现网站打开速度变慢、页面被篡改、浏览器弹出安全警告、被百度/谷歌标为“危险网站”等。
- 使用安全扫描工具:使用D盾、安全狗等工具对网站进行全面的扫描,可以发现可疑的Webshell文件和后门。
DEDECMS 404漏洞是一个深刻的教训,它提醒我们:网站的任何一个细节,尤其是错误处理和用户输入,都可能成为黑客的突破口。 安全意识和技术防范必须时刻保持。
