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)) {
// ...
}
}
关键点:
$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处理,并确保所有文件上传操作都有严格的验证机制。