摘要DrupageddonCVE-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 还是 highDrupal 站点本身并不会改变。所以这一关的“低中高”更多是指你的利用手法从简单到深入。四、源码分析真正的漏洞在 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 Hack123456参数说明-t目标站点 URL必须带 http://-u自定义新增管理员用户名-p自定义新增管理员密码成功输出示例步骤 3登录 Drupal 后台浏览器访问http://10.0.0.177/drupal账号adminhack密码Hack123456登录后台后你完全控制了整个 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那一行会导致注入。重要声明本教程及文中所有操作仅限于合法授权的安全学习与研究。作者及发布平台不承担因不当使用本教程所引发的任何直接或间接法律责任。请务必遵守中华人民共和国网络安全相关法律法规。如果这篇文章帮你解决了实操上的困惑别忘记点击点赞、分享也可以留言告诉我你遇到的其它问题我会尽快回复。你的关注是我坚持原创和细节共享的力量来源谢谢大家。