Drupal SA-CORE-2019-010 .开头文件名(如.htaccess) 文件上传

2023-12-25 17:18

本文主要是介绍Drupal SA-CORE-2019-010 .开头文件名(如.htaccess) 文件上传,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • drupal .开头文件名 文件上传
  • 原生模块分析
  • 第三方模块分析
  • 补丁
  • 参考

drupal .开头文件名 文件上传

小说网 https://www.198200.com

1077935-20200126135426315-2082193786.png

通过diff 8.8.1的补丁,很容易发现修复点,位于core\modules\file\file.module

1077935-20200126135442979-1857026228.png

补丁在文件名两侧进行了trim(..., '.'),结合漏洞通告可以知道应该是文件名过滤不严导致.开头的文件上传。

原生模块分析

漏洞点位于_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;
}

全局搜索调用本函数的地方,发现只在core/modules/file/file.module:file_save_upload()中被调用。

由于此处不是控制器,无法直接调用,因此继续反向追踪调用此函数的位置。在多处找到调用,比如位于core/modules/update/src/Form/UpdateManagerInstall.php:submitForm(),这是update模块的updatemanagerinstall表单。

public function submitForm(array &$form, FormStateInterface $form_state) {$local_cache = NULL;$all_files = $this->getRequest()->files->get('files', []);if ($form_state->getValue('project_url')) {...}elseif (!empty($all_files['project_upload'])) {$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. file_save_upload() calls// \Drupal\Core\Messenger\MessengerInterface::addError() on failure.return;}$local_cache = $finfo->getFileUri();}

这里的$validators通过$this->archiverManager->getExtensions()调用archiver管理器进行取值,由于这里设计很多内部成员变量,因此通过调试的方式来分析会快一些。下面就开始尝试构造路由到这个update模块。

通过在update模块根目录下的update.routing.yml路由文件可以发现相应的路由:

1077935-20200126135506827-462171736.png

1077935-20200126135521722-882303831.png

尝试上传.htaccess

1077935-20200126135537980-652002193.png

果然受到了限制,下面调试跟进这个$validators是如何取值的。最终跟进core/lib/Drupal/Component/Annotation/Plugin/Discovery/AnnotatedClassDiscovery.php:getDefinitions()方法,这里通过遍历所有module目录下的src/plugin/archiver/下的所有php文件,然后解析这个php文件的annotation。调试后发现只有system模块下存在这个目录:

1077935-20200126135550458-353069893.png

可以看到这里的annotation中限定了后缀名为{"tar", "tgz", "tar.gz", "tar.bz2"}

到这里就可以停止调试了,这个update模块由于限制了后缀名,无法满足我们的条件。下面再找一些$validators的值不是$this->archiverManager->getExtensions()的模块。

发现core/modules/image/src/Controller/QuickEditImageController.php:upload()

  public function upload(EntityInterface $entity, $field_name, $langcode, $view_mode_id) {$field = $this->getField($entity, $field_name, $langcode);$field_validators = $field->getUploadValidators();$field_settings = $field->getFieldDefinition()->getSettings();$destination = $field->getUploadLocation();// Add upload resolution validation.if ($field_settings['max_resolution'] || $field_settings['min_resolution']) {$field_validators['file_validate_image_resolution'] = [$field_settings['max_resolution'], $field_settings['min_resolution']];}// Create the destination directory if it does not already exist.if (isset($destination) && !$this->fileSystem->prepareDirectory($destination, FileSystemInterface::CREATE_DIRECTORY)) {return new JsonResponse(['main_error' => $this->t('The destination directory could not be created.'), 'errors' => '']);}// Attempt to save the image given the field's constraints.$result = file_save_upload('image', $field_validators, $destination);...

这里的$validators是通过$field->getUploadValidators()来取值的,跟之前的module同样的思路,先构造路由然后进行调试跟进。

访问quickedit/image/upload/node/1/field_image/en/full映射到本控制器,然后跟进getUploadValidators()。经过一系列跟进之后发现配置在config表中,sql语句大概是SELECT name, data FROM config WHERE collection = '' AND name ='field.field.node.article.field_image';

1077935-20200126135611084-2052744781.png

剩下的调用file_save_upload的地方也都做了验证,没有可以利用的地方,都限制了文件后缀名。

第三方模块分析

看完所有调用点之后有点怀疑人生,会不会是类似于CVE-2018-7600那样,durpal6中虽然有漏洞,但是没找到错误的写法从而无法利用?通过再次阅读官方通告之后发现也许真是这样,但是幸运的是...

1077935-20200126135625633-836619609.png

意思大概是通过第三方contributed模块可能导致.htaccess文件上传?

然后我尝试在第三方模块中寻找与文件上传相关的模块,找到了一个名为imce的文件/图片管理模块

IMCE is an image/file uploader and browser that supports personal directories and quota.

安装完毕之后直接访问路径/imce/public即可获得一个管理界面(后台)。

上传.php文件会自动在后面加上.txt后缀。尝试上传.htaccess

1077935-20200126135645338-734454980.png

然而这只是个前端过滤而已,通过抓包修改文件名即可成功上传。

1077935-20200126135706315-406294112.png

通过阅读源码发现opUpload()方法调用了file_save_upload()进行文件上传。

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

其中后缀名$validators从$fm->getConf('extensions','')获取。跟踪源码后发现,也是从config表中找到imce 模块的一些配置

1077935-20200126135720203-1458089766.png

由于$validators是*,即为不限制后缀名,从而造成.htaccess文件上传。

补丁

通过diff 8.8.1的补丁,很容易发现修复点,位于core\modules\file\file.module

1077935-20200126135731296-1521850903.png

补丁在文件名两侧进行了trim(..., '.')。

上传之后变成

1077935-20200126135741403-1018031497.png

参考

https://www.drupal.org/sa-core-2019-010

这篇关于Drupal SA-CORE-2019-010 .开头文件名(如.htaccess) 文件上传的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/536295

相关文章

Java应用如何防止恶意文件上传

《Java应用如何防止恶意文件上传》恶意文件上传可能导致服务器被入侵,数据泄露甚至服务瘫痪,因此我们必须采取全面且有效的防范措施来保护Java应用的安全,下面我们就来看看具体的实现方法吧... 目录恶意文件上传的潜在风险常见的恶意文件上传手段防范恶意文件上传的关键策略严格验证文件类型检查文件内容控制文件存储

Java如何根据文件名前缀自动分组图片文件

《Java如何根据文件名前缀自动分组图片文件》一大堆文件(比如图片)堆在一个目录下,它们的命名规则遵循一定的格式,混在一起很难管理,所以本文小编就和大家介绍一下如何使用Java根据文件名前缀自动分组图... 目录需求背景分析思路实现代码输出结果知识扩展需求一大堆文件(比如图片)堆在一个目录下,它们的命名规

Java实现MinIO文件上传的加解密操作

《Java实现MinIO文件上传的加解密操作》在云存储场景中,数据安全是核心需求之一,MinIO作为高性能对象存储服务,支持通过客户端加密(CSE)在数据上传前完成加密,下面我们来看看如何通过Java... 目录一、背景与需求二、技术选型与原理1. 加密方案对比2. 核心算法选择三、完整代码实现1. 加密上

在React聊天应用中实现图片上传功能

《在React聊天应用中实现图片上传功能》在现代聊天应用中,除了文字和表情,图片分享也是一个重要的功能,本文将详细介绍如何在基于React的聊天应用中实现图片上传和预览功能,感兴趣的小伙伴跟着小编一起... 目录技术栈实现步骤1. 消息组件改造2. 图片预览组件3. 聊天输入组件改造功能特点使用说明注意事项

springboot上传zip包并解压至服务器nginx目录方式

《springboot上传zip包并解压至服务器nginx目录方式》:本文主要介绍springboot上传zip包并解压至服务器nginx目录方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录springboot上传zip包并解压至服务器nginx目录1.首先需要引入zip相关jar包2.然

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

Linux文件名修改方法大全

《Linux文件名修改方法大全》在Linux系统中,文件名修改是一个常见且重要的操作,文件名修改可以更好地管理文件和文件夹,使其更具可读性和有序性,本文将介绍三种在Linux系统下常用的文件名修改方法... 目录一、引言二、使用mv命令修改文件名三、使用rename命令修改文件名四、mv命令和rename命

Java实现数据库图片上传与存储功能

《Java实现数据库图片上传与存储功能》在现代的Web开发中,上传图片并将其存储在数据库中是常见的需求之一,本文将介绍如何通过Java实现图片上传,存储到数据库的完整过程,希望对大家有所帮助... 目录1. 项目结构2. 数据库表设计3. 实现图片上传功能3.1 文件上传控制器3.2 图片上传服务4. 实现

使用mvn deploy命令上传jar包的实现

《使用mvndeploy命令上传jar包的实现》本文介绍了使用mvndeploy:deploy-file命令将本地仓库中的JAR包重新发布到Maven私服,文中通过示例代码介绍的非常详细,对大家的学... 目录一、背景二、环境三、配置nexus上传账号四、执行deploy命令上传包1. 首先需要把本地仓中要

Java实现数据库图片上传功能详解

《Java实现数据库图片上传功能详解》这篇文章主要为大家详细介绍了如何使用Java实现数据库图片上传功能,包含从数据库拿图片传递前端渲染,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、前言2、数据库搭建&nbsChina编程p; 3、后端实现将图片存储进数据库4、后端实现从数据库取出图片给前端5、前端拿到