• 反腐败国际合作"朋友圈"又大了! 2019-07-13
  • 前线 从一面“魔镜” 看苏宁科技集团智能化发展战略 2019-07-13
  • 身份证被盗产生不良记录 网络虚拟账号权属纠纷如何避免 2019-07-07
  • 的确,呆子七窍通了栁窍。[哈哈] 2019-06-20
  • 强国博客首页整合公告 2019-06-08
  • 西海都市报数字报刊平台 2019-05-27
  • 美国反拥枪的孩子很受伤 2019-05-25
  • C罗戴帽单骑救主 葡萄牙33战平西班牙 2019-05-25
  • 证监会去年对外公开监管信息14560条 2019-05-16
  • 中山八路总站调整12公交线 2019-05-16
  • 谢春涛:深刻把握“中国特色社会主义进入新时代”的重大意义 2019-05-09
  • 湖南一博士生举报水利局领导受贿 遭到冒牌纪委约谈 2019-05-09
  • 西安地铁唐风诗韵文化专列将于6月18日首发 2019-04-30
  • 铜梁区旧县街道:全面提升执行力 推动工作落地见效 2019-04-30
  • 上海电影节女性影人大放异彩 中生代女演员不用焦虑 2019-04-29
  • Ruby on?Rails 曝路径穿越与任意文件读取漏洞

    h4cd
     h4cd
    发布于 2019年03月22日
    收藏 4

    开发者 John Hawthorn 公开了 Ruby on Rails 上的一个路径穿越与任意文件读取漏洞。

    John 指出,Action View 中可能存在文件内容泄露漏洞。特制的 accept headers 并调用 render file,可以导致目标服务器上的任意文件被渲染,从而泄露文件内容??刂破髦惺苡跋斓拇肴缟贤妓?。

    广东11选5每期预测:漏洞分析

    广东十一选五推荐号 www.qhysp.com 在控制器中通过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) }
            ...
          end
    end
    

    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)
        end
    end
    

    跳过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,目前补丁已经跟进:https://github.com/rails/rails/commit/f4c70c2222180b8d9d924f00af0c7fd632e26715

    禁止接受未注册的 mime types:

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

    本站文章除注明转载外,均为本站原创或编译?;队魏涡问降淖?,但请务必注明出处,尊重他人劳动共创开源社区。
    转载请注明:文章转载自 OSCHINA 社区 广东十一选五推荐号
    本文标题:Ruby on?Rails 曝路径穿越与任意文件读取漏洞
    加载中
    返回顶部
    顶部
  • 反腐败国际合作"朋友圈"又大了! 2019-07-13
  • 前线 从一面“魔镜” 看苏宁科技集团智能化发展战略 2019-07-13
  • 身份证被盗产生不良记录 网络虚拟账号权属纠纷如何避免 2019-07-07
  • 的确,呆子七窍通了栁窍。[哈哈] 2019-06-20
  • 强国博客首页整合公告 2019-06-08
  • 西海都市报数字报刊平台 2019-05-27
  • 美国反拥枪的孩子很受伤 2019-05-25
  • C罗戴帽单骑救主 葡萄牙33战平西班牙 2019-05-25
  • 证监会去年对外公开监管信息14560条 2019-05-16
  • 中山八路总站调整12公交线 2019-05-16
  • 谢春涛:深刻把握“中国特色社会主义进入新时代”的重大意义 2019-05-09
  • 湖南一博士生举报水利局领导受贿 遭到冒牌纪委约谈 2019-05-09
  • 西安地铁唐风诗韵文化专列将于6月18日首发 2019-04-30
  • 铜梁区旧县街道:全面提升执行力 推动工作落地见效 2019-04-30
  • 上海电影节女性影人大放异彩 中生代女演员不用焦虑 2019-04-29
  • 今晚买三肖中特 欢乐生肖计划 动物总动员投注方法 中国福利彩票官方网站注册 今天nba比分是多少 河北十一选五任三遗漏数据 极速快3历史开奖结果 天津11选5前三直 河北快三网上平台 黑龙江十一选五爱彩乐 白小姐六合彩第130 搜狐彩票表 555游戏通比牛牛技巧 华东15选5哪里买 曾道人内幕玄机1-2