Drupal SA-CORE-2019-010 .开头文件名(如.htaccess) 文件上传
字数 1352 2025-08-26 22:11:52

Drupal SA-CORE-2019-010 漏洞分析与利用教学

漏洞概述

Drupal SA-CORE-2019-010 是一个文件上传漏洞,允许攻击者上传以点号(.)开头的文件(如.htaccess),可能导致服务器配置被篡改或敏感信息泄露。该漏洞影响Drupal核心文件模块,同时某些第三方模块(如IMCE)的特定配置也可能导致此漏洞。

漏洞分析

核心漏洞点

漏洞位于core/modules/file/file.module中的_file_save_upload_single函数:

function _file_save_upload_single(\SplFileInfo $file_info, $form_field_name, $validators = [], $destination = FALSE, $replace = FileSystemInterface::EXISTS_REPLACE) {
    // Begin building file entity.
    $values = [
        'uid' => $user->id(),
        'status' => 0,
        'filename' => $file_info->getClientOriginalName(), // 漏洞关键点
        'uri' => $file_info->getRealPath(),
        'filesize' => $file_info->getSize(),
    ];
    $values['filemime'] = \Drupal::service('file.mime_type.guesser')->guess($values['filename']);
    $file = File::create($values);
    
    // If we made it this far it's safe to record this file in the database.
    $file->save();
    // ...
    return $file;
}

关键问题在于直接使用了getClientOriginalName()获取的文件名,而没有对以点号开头的文件名进行过滤。

补丁分析

Drupal 8.8.1的补丁在core/modules/file/file.module中修复了此问题,主要修改是对文件名进行了trim操作:

// 修复后的代码
'filename' => trim($file_info->getClientOriginalName(), '.'),

漏洞利用路径分析

1. 核心模块利用尝试

首先分析核心模块中调用file_save_upload()的地方:

Update模块 (UpdateManagerInstall.php)

public function submitForm(array &$form, FormStateInterface $form_state) {
    $validators = ['file_validate_extensions' => [$this->archiverManager->getExtensions()]];
    if (!($finfo = file_save_upload('project_upload', $validators, NULL, 0, FileSystemInterface::EXISTS_REPLACE))) {
        // Failed to upload the file.
        return;
    }
    $local_cache = $finfo->getFileUri();
}

通过调试发现$this->archiverManager->getExtensions()限制了特定后缀名,无法上传.htaccess文件。

Image模块 (QuickEditImageController.php)

public function upload(EntityInterface $entity, $field_name, $langcode, $view_mode_id) {
    $field = $this->getField($entity, $field_name, $langcode);
    $field_validators = $field->getUploadValidators();
    $result = file_save_upload('image', $field_validators, $destination);
    // ...
}

$field_validators从数据库配置中获取,通常也限制了文件扩展名。

2. 第三方模块利用 - IMCE模块

IMCE模块是一个文件/图片上传和管理模块,存在可利用的配置:

public function opUpload(ImceFM $fm) {
    // Extension validator
    $exts = $fm->getConf('extensions', '');
    $validators['file_validate_extensions'] = [$exts ?: NULL];
    
    // Save files
    if ($files = file_save_upload('imce', $validators, $destination, NULL, $replace)) {
        // ...
    }
}

关键点:

  1. $fm->getConf('extensions', '')从配置中获取允许的扩展名
  2. 如果配置为空或为*,则表示允许所有扩展名

利用步骤:

  1. 访问IMCE管理界面:/imce/public
  2. 尝试上传.htaccess文件
  3. 前端可能会阻止,但可以通过抓包修改文件名绕过
  4. 如果IMCE配置中extensions设置为*或空,上传将成功

漏洞复现步骤

环境要求

  • Drupal 8.x 版本(8.8.1之前)
  • 安装IMCE模块(可选,用于第三方模块利用)

复现过程

  1. 通过IMCE模块上传

    • 访问/imce/public
    • 选择上传文件
    • 使用Burp Suite等工具拦截请求,修改文件名为.htaccess
    • 如果IMCE配置允许(extensions=*),上传将成功
  2. 验证上传

    • 检查上传目录是否存在.htaccess文件
    • 确认文件内容未被修改

防御措施

  1. 升级到Drupal 8.8.1或更高版本
  2. 如果使用IMCE模块:
    • 设置合理的extensions配置,不要使用*
    • 更新到最新版本的IMCE模块
  3. 对所有文件上传操作实施严格的文件名验证:
    • 禁止以点号开头的文件名
    • 使用白名单限制允许的文件扩展名
    • 对文件名进行规范化处理

总结

Drupal SA-CORE-2019-010漏洞的核心问题在于对以点号开头的文件名处理不当,结合某些第三方模块(如IMCE)的宽松配置,可能导致恶意文件(如.htaccess)上传。修复方案包括对文件名进行trim处理,并确保所有文件上传操作都有严格的验证机制。

Drupal SA-CORE-2019-010 漏洞分析与利用教学 漏洞概述 Drupal SA-CORE-2019-010 是一个文件上传漏洞,允许攻击者上传以点号(.)开头的文件(如.htaccess),可能导致服务器配置被篡改或敏感信息泄露。该漏洞影响Drupal核心文件模块,同时某些第三方模块(如IMCE)的特定配置也可能导致此漏洞。 漏洞分析 核心漏洞点 漏洞位于 core/modules/file/file.module 中的 _file_save_upload_single 函数: 关键问题在于直接使用了 getClientOriginalName() 获取的文件名,而没有对以点号开头的文件名进行过滤。 补丁分析 Drupal 8.8.1的补丁在 core/modules/file/file.module 中修复了此问题,主要修改是对文件名进行了trim操作: 漏洞利用路径分析 1. 核心模块利用尝试 首先分析核心模块中调用 file_save_upload() 的地方: Update模块 (UpdateManagerInstall.php) 通过调试发现 $this->archiverManager->getExtensions() 限制了特定后缀名,无法上传.htaccess文件。 Image模块 (QuickEditImageController.php) $field_validators 从数据库配置中获取,通常也限制了文件扩展名。 2. 第三方模块利用 - IMCE模块 IMCE模块是一个文件/图片上传和管理模块,存在可利用的配置: 关键点: $fm->getConf('extensions', '') 从配置中获取允许的扩展名 如果配置为空或为 * ,则表示允许所有扩展名 利用步骤: 访问IMCE管理界面: /imce/public 尝试上传.htaccess文件 前端可能会阻止,但可以通过抓包修改文件名绕过 如果IMCE配置中 extensions 设置为 * 或空,上传将成功 漏洞复现步骤 环境要求 Drupal 8.x 版本(8.8.1之前) 安装IMCE模块(可选,用于第三方模块利用) 复现过程 通过IMCE模块上传 访问 /imce/public 选择上传文件 使用Burp Suite等工具拦截请求,修改文件名为 .htaccess 如果IMCE配置允许(extensions=* ),上传将成功 验证上传 检查上传目录是否存在 .htaccess 文件 确认文件内容未被修改 防御措施 升级到Drupal 8.8.1或更高版本 如果使用IMCE模块: 设置合理的 extensions 配置,不要使用 * 更新到最新版本的IMCE模块 对所有文件上传操作实施严格的文件名验证: 禁止以点号开头的文件名 使用白名单限制允许的文件扩展名 对文件名进行规范化处理 总结 Drupal SA-CORE-2019-010漏洞的核心问题在于对以点号开头的文件名处理不当,结合某些第三方模块(如IMCE)的宽松配置,可能导致恶意文件(如.htaccess)上传。修复方案包括对文件名进行trim处理,并确保所有文件上传操作都有严格的验证机制。