博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Ruby on Rails 曝路径穿越与任意文件读取漏洞
阅读量:7046 次
发布时间:2019-06-28

本文共 3233 字,大约阅读时间需要 10 分钟。

  hot3.png

开发者  公开了 Ruby on Rails 上的一个。

John 指出,Action View 中可能存在文件内容泄露漏洞。特制的 accept headers 并调用 render file,可以导致目标服务器上的任意文件被渲染,从而泄露文件内容。控制器中受影响的代码如上图所示。

漏洞分析

在控制器中通过render file形式来渲染应用之外的视图,因此在 actionview-5.2.1/lib/action_view/renderer/template_renderer.rb:22 中会根据 options.key?(:file),调用find_file来寻找视图。

module ActionView  class TemplateRenderer < AbstractRenderer #:nodoc:    # Determine the template to be rendered using the given options.      def determine_template(options)        keys = options.has_key?(:locals) ? options[:locals].keys : []        if options.key?(:body)          ...        elsif options.key?(:file)          with_fallbacks { find_file(options[:file], nil, false, keys, @details) }        ...      endend

find_file代码如下:

def find_file(name, prefixes = [], partial = false, keys = [], options = {})    @view_paths.find_file(*args_for_lookup(name, prefixes, partial, keys, options))end

用于生成查找文件参数的args_for_lookup函数,最终返回时会把 payload 保存在details[formats]中:

它会执行位于 actionview-5.2.1/lib/action_view/path_set.rb 中的 @view_paths.find_file

class PathSet #:nodoc:    def find_file(path, prefixes = [], *args)      _find_all(path, prefixes, args, true).first || raise(MissingTemplate.new(self, path, prefixes, *args))    end    private    # 注,这里的 args 即前面args_for_lookup生成的details        def _find_all(path, prefixes, args, outside_app)            prefixes = [prefixes] if String === prefixes            prefixes.each do |prefix|            paths.each do |resolver|                if outside_app                templates = resolver.find_all_anywhere(path, prefix, *args)                else                templates = resolver.find_all(path, prefix, *args)                end                return templates unless templates.empty?            end            end            []        end

因为视图在应用之外,所以 outside_app equals == True,并调用 find_all_anywhere:

def find_all_anywhere(name, prefix, partial = false, details = {}, key = nil, locals = [])    cached(key, [name, prefix, partial], details, locals) do    find_templates(name, prefix, partial, details, true)    endend

跳过cached部分,find_templates将根据选项查找要呈现的模板:

# An abstract class that implements a Resolver with path semantics.class PathResolver < Resolver #:nodoc:    EXTENSIONS = { locale: ".", formats: ".", variants: "+", handlers: "." }    DEFAULT_PATTERN = ":prefix/:action{.:locale,}{.:formats,}{+:variants,}{.:handlers,}"    ...    private        def find_templates(name, prefix, partial, details, outside_app_allowed = false)            path = Path.build(name, prefix, partial)            # 注意 details 与 details[:formats] 的传入            query(path, details, details[:formats], outside_app_allowed)        end        def query(path, details, formats, outside_app_allowed)            query = build_query(path, details)            template_paths = find_template_paths(query)            ...            end        end

build_query 后的值如下:

利用../与前缀组合造成路径穿越,利用最后的{

{
完成闭合,经过 File.expand_path 解析后组成的 query 如下:

/etc/passwd{
{},}{+{},}{.{raw,erb,html,builder,ruby,coffee,jbuilder},}

最后/etc/passwd被当成模板文件进行渲染,造成了任意文件读取。

该漏洞已被 CVE 收录,编号 CVE-2019-5418、CVE-2019-5419,目前补丁已经跟进:

禁止接受未注册的 mime types:7fa8ecbb93ae11eee4da753e30fd9ddaf77.jpg

详情查看漏洞报告:https://github.com/mpgn/CVE-2019-5418#cve-2019-5418---file-content-disclosure-on-rails

转载地址:http://vpkol.baihongyu.com/

你可能感兴趣的文章
【Spring实战】—— 13 AspectJ注解切面
查看>>
Java 集合并交补
查看>>
16.4. jstat - Java Virtual Machine Statistics Monitoring Tool
查看>>
一脸懵逼学习KafKa集群的安装搭建--(一种高吞吐量的分布式发布订阅消息系统)...
查看>>
[Everyday Mathematics]20150209
查看>>
Python图片处理库之PIL
查看>>
(转)基于深度学习的物体检测
查看>>
利用java代码和web拦截器轻松实现一个app抓包工具
查看>>
数制系统
查看>>
cmd连接mysql操作命令
查看>>
“2017最受欢迎中国开源软件”奖TOP 20揭晓 阿里中间件4大项目连续霸榜!
查看>>
Log4j 配置 的webAppRootKey参数问题
查看>>
第 14 章 MyBatis
查看>>
176.6. git-svn - Bidirectional operation between a single Subversion branch and git
查看>>
linux中授予普通用户root权限
查看>>
我的架构之路 — 配置中心(二)— 在已有项目中实际应用
查看>>
分布式监控系统Zabbix3.2对数据库的连接数预警
查看>>
undo表空间文件丢失恢复(1)--有备份
查看>>
[20151017]lsnrctl servcices.txt
查看>>
使用JustDecompile修改程序集
查看>>