看我如何利用Drupal漏洞并通过恶意图片实现一键RCE
字数 1761 2025-08-18 11:38:41
Drupal漏洞利用分析:通过恶意图片实现一键RCE
漏洞概述
本文详细分析Drupal CMS中两个关键漏洞的组合利用方法,攻击者可以通过上传恶意图片实现远程代码执行(RCE)。这两个漏洞编号为:
- ZDI-19-130:PHP反序列化漏洞
- ZDI-19-291:持久型XSS漏洞
组合利用这两个漏洞,攻击者可以实现"一键式"代码执行。
受影响版本
- Drupal 7.x
- Drupal 8.x
漏洞背景
Drupal发布了针对这两个漏洞的修复补丁。攻击流程需要:
- 上传恶意图片到远程服务器
- 通过伪造链接欺骗已认证的网站管理员
- 最终实现代码执行
注意:已禁用用户注册和用户评论功能的Drupal网站不受此攻击影响。
漏洞详细分析
ZDI-19-291:持久型XSS漏洞
漏洞原理
Drupal在处理上传文件的文件名时存在缺陷,与PCRE(Perl兼容的正则表达式)处理有关。当多次上传文件时,Drupal会删除文件扩展名,导致攻击者可上传任意HTML文件。
技术细节
- Drupal使用PCRE修改文件名以避免重复
- 上传包含特殊字符的文件名时:
\xFF字节失效\x80字节没有有效起始字节- PHP抛出"PREG_BAD_UTF8_ERROR"错误
$basename变量被设置为NULL
- Drupal未对
preg_replace()进行错误检查 - 当带有无效UTF-8字符文件名的图片上传两次时:
- 函数使用
$basename变量值(视为空字符串) - 返回
$destination即'_'.$counter++的结果
- 函数使用
攻击方法
-
通过用户注册功能上传GIF图片:
- 实际存储路径:
/sites/default/files/pictures/<YYYY-MM>/_0 - 而非正常路径:
/sites/default/files/pictures/<YYYY-MM>/profile_pic.gif
- 实际存储路径:
-
通过评论编辑器上传恶意GIF文件:
- 存储路径:
/sites/default/files/inline-images/_0
- 存储路径:
-
欺骗浏览器将文件以HTML页面呈现,实现持久化XSS攻击
ZDI-19-130:PHP反序列化漏洞
漏洞原理
通过Phar文件触发PHP反序列化漏洞的新方法:
- PHP Phar文件的元数据以PHP序列化对象形式存储
- 针对Phar文件的文件操作会触发服务器在已存储的元数据上执行反序列化操作
- 最终导致远程代码执行
触发点
通过/admin/config/media/file-system节点的file_temporary_path请求参数触发:
- 使用"phar://"流封装器
- 使
file_temporary_path指向攻击者上传的恶意Phar文档 system_check_directory()函数中的!is_dir($directory)触发反序列化
利用方法
- 上传JPEG/Phar Polyglot文件作为用户头像
- 基于TAR的Phar文档存储在JPEG文件开头的JPEG注释域中
- 需要修复TAR文件的校验码以避免崩溃
完整攻击流程
-
第一阶段:利用ZDI-19-291
- 上传恶意GIF/HTML文件
- 绕过文件名处理机制
- 实现持久化XSS攻击
- 欺骗管理员发送恶意请求
-
第二阶段:利用ZDI-19-130
- 上传JPEG/Phar Polyglot文件
- 通过XSS触发管理员访问特定URL
- 触发反序列化操作
- 实现任意代码执行
防御措施
- 立即升级到Drupal最新版本
- 禁用不必要的用户注册功能
- 禁用用户评论功能(如果不需要)
- 实施严格的文件上传策略
- 监控异常文件上传行为
技术验证
测试代码片段
// 测试Drupal文件名处理漏洞的代码片段
$basename = preg_replace('/[\x00-\x1F\x7F\/]/u', '_', $filename);
Polyglot文件创建
- 选择JPEG图片作为载体
- 将基于TAR的恶意Phar文档存储在JPEG注释域中
- 修复TAR文件校验码
参考资源
- ZDI官方公告
- Thomas在Black Hat上的演讲内容
- BSidesMCR演讲内容
- Drupal安全公告
总结
这两个漏洞的组合利用展示了现代Web应用攻击的复杂性:
- 利用文件处理漏洞实现持久化存储
- 通过XSS提升权限
- 最终利用反序列化漏洞实现代码执行
网站管理员应立即采取行动修补这些漏洞,防止潜在的攻击。