作者 Lobsiinvok 2016-03-09 10:20:00
被查看了5264次 , 本文转载自:乌云知识库

Rails Security (上)

Author: Lobsiinvok

0x00 前言

Rails是Ruby广泛应用方式之一,在Rails平台上设计出一套独特的MVC开发架构,采取模型(Model)、外观(View)、控制器(Controller)分离的开发方式,不但减少了开发中的问题,更简化了许多繁复的动作。

此篇讲稿分为上下部份,因为最近在开发Rails,需要针对安全问题做把关,便借此机会针对历史上Rails发生过的安全问题进行归纳与整理。

这篇讲稿承蒙安全领域研究上的先进,在自行吸收转​​换后,如有笔误或理解错误的地方还望各位见谅并纠正我,感谢 :D

快速跳转

0x01 Mass assignment

0x02 Unsafe Query Generation

  • Rake在处理params时,有时候会产生Unsafe的query

    p3

  • 透过伪造params[:token]成[], [nil], [nil, nil, ...]或['foo', nil],都能够通过.nil?的检查,使得SQL语句被安插IS NULL or IN ('foo', NULL)造成非预期的结果

  • 在Rails 3.2.8增加deep_munge方法来消除掉Hash里的nil

  • commit中可看到类似的检查

    p4

Code for Testing

p5

Rails 3.1.0: 成功绕过nil?的检查

p6

Rails 4.2.5: 被拦截,直接替换成nil

p7

0x03 Content_tag

Rails提供content_tag方便产生HTML

Why?

  • Content_tag回传html_safe的字串,代表此字串在后续输出时不再做escape
  • 建立在attacker无法构建html_safe型的字串(等价于raw)
  • 丢给button_to时因为不再做escape导致XSS问题

0x04 YAML.load

难得一见的RCE漏洞(CVE-2013-0156)

p12

p13

Ref: Rails 3.2

Proof

Rails 3.1: 成功执行指令

p14

难得一见的RCE漏洞(CVE-2013-0333)

  • CVE-2013-0333问题一样发生在YAML.load
  • 在rails 3.0.19(含)前,rails3.0.x的JSON Parser竟然是使用YAML作为Backend
  • 问题发生在YAML backend中的convert_json_to_yaml
  • 这篇讲得很详细
  • Patch for CVE-2013-0333

p15

Rails 3.0.20

0x05 Dynamic Render Path

Render是处理request的一连串过程

  • 除了Insecure Direct Object Reference的安全问题,DEVCORE也在进行渗透测试时发现潜在的RCE问题
  • rails目前最新版本4.2.5预设也是用ERB去做样板处理,但在rails5开发过程中已经加入此次commit
  • 动态样板间接变成LFI问题,搭配上面所述的default_template_handler为ERB,只要找到有调用ruby code的样板或是可自行写入的档案,就能够造成RCE

    p16

    p17

  • 真实环境下发生的问题可以前往DEVCORE查看

  • 如果有类似开发环境应立即处理,default_template_handler要到rails5才转换成RAW

  • 改以白名单的方式限制template名称或是根据commit的内容手动Patch

0x06 Reference

本文转载自:乌云知识库