Ruby On Rails 路径穿越漏洞(CVE-2018-3760)

本文详细分析了Ruby On Rails路径穿越漏洞(CVE-2018-3760)。介绍了Sprockets中受影响的版本,阐述了漏洞分析过程,包括从get获得的路径到主机路径的解析流程,指出因二次解码可利用漏洞穿越到根目录读取任意文件,还给出了复现步骤。

Ruby On Rails 路径穿越漏洞(CVE-2018-3760)

前言:
这个漏洞作为路径穿越的典型例子,比较经典,18年跟着文档分析了一遍,最近又重新理了一遍,捎带着写了一遍源码跟踪分析的过程,个人感觉整个跟入调用的思想还是比较清晰的,分析的过程写的比较详细,有兴趣的萌新们也可以跟着分析一遍。

背景:
Sprockets中存在信息泄露漏洞。 受影响的版本:4.0.0.beta7及更低版本,3.7.1及更低版本,2.12.4及更低版本。 在生产中使用Sprockets服务器时,可以使用特制的请求来访问存在于应用程序根目录之外的文件系统上的文件。 运行受影响版本的所有用户应立即升级或使用其中一种解决方法。

前方高能预警,前文别被各种调用绕晕了~

漏洞分析:
先看一下漏洞爆出以后打的补丁
在这里插入图片描述
Test_server在测试环境下使用,这里不去关注,着重看看server.rb(下图是已经patch过的)
在这里插入图片描述
Forbidden_request是在哪儿被调用的呢?
往前找
可以看到是在call函数中被调用
在这里插入图片描述
Forbidden_request返回forbidden_response(env)信息后会进入find_asset
在这里插入图片描述
跟进去
在这里插入图片描述
在find_asset中又跟入load()
在这里插入图片描述
传入的url此时已经被自动解码过一次,这是第一次
跟入unloadedasset.new
在这里插入图片描述
在其中可以看到访问filename时会调用load_file_params
在这里插入图片描述
继续跟进去
在这里插入图片描述
跟入URIUtils找到parse_asset_uri
在这里插入图片描述
跟入split_file_uri
在这里插入图片描述
第48行进行了第二次解码
至此,便完成了从get获得的路径到主机路径的解析流程
根据“在find_asset中又跟入load()”这一步的代码逻辑,解析完成后调用load_from_unloaded
在这里插入图片描述
由两个raise可以看出,函数主要功能是检查文件是否存在和文件是否在指定路径下
在这里插入图片描述
以利用漏洞读取/etc/passwd为例,文件是一定存在的,关键是判断文件是否在指定路径下
影响这个判断的关键的地方在上图的第114行,跟入path_split
在这里插入图片描述
然后跟入split_subpath
在这里插入图片描述
165行的判断看出如果是以path开头,则检查通过
这儿检查通过之后,还是回到load_from_unloaded进行后续的读取操作。
这么一个判断本身是没有什么问题的,但是在这一系列的调用过程中,不知不觉间将传入的路径进行了二次解码,所以作为攻击做就可以利用%2525%252e即…/…/穿越到根目录再读取任意文件,接下来的复现中的第三步利用成功最关键的地方也在这儿。

复现:
环境搭好后的主界面
在这里插入图片描述
构造payload尝试目录穿越
http://your-ip:3000/assets/file:///etc/passwd
其中将//URL编码为%2f
http://your-ip:3000/assets/file:%2F%2F/etc/passwd
此时会报错
在这里插入图片描述
因为/etc/passwd不在允许的目录中
但是在报错页面中给出了允许的目录列表,随意选中一个,然后使用…/…/的办法向上跳转,最后读取/etc/passwd
这里…/…/需url编码为%2e,然后二次编码为%252e
最后得payload:
http://111.230.225.189: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
在这里插入图片描述

参考:
1.https://seclists.org/oss-sec/2018/q2/210
2.https://medium.com/@Bakku1505/ruby-start-with-end-with-vs-regular-expressions-59728be0859e
3.https://xz.aliyun.com/t/25421
4.https://github.com/vulhub/vulhub/blob/master/rails/CVE-2018-3760/README.zh-cn.md

### CVE-2020-8163 漏洞概述 CVE-2020-8163 是 Ruby on Rails 中的一个漏洞,主要涉及 Sprockets 库的路径遍历问题。该漏洞允许攻击者通过精心构造的请求访问或读取服务器上的任意文件[^3]。此问题的根本原因在于 Sprockets 的文件路径处理逻辑中未正确验证用户输入,导致可能被利用进行路径穿越攻击。 ### 漏洞影响范围 此漏洞影响以下版本的 Sprockets: - Sprockets < 4.0.2 - Sprockets-Rails < 3.2.2 ### 修复方案 为了解决 CVE-2020-8163 漏洞,建议采取以下措施: #### 1. 升级受影响的库 升级到不受影响的版本是解决此问题的最佳方法。确保将 Sprockets 和 Sprockets-Rails 升级到以下版本或更高版本[^4]: - Sprockets >= 4.0.2 - Sprockets-Rails >= 3.2.2 在 `Gemfile` 中指定正确的版本号: ```ruby gem 'sprockets', '~> 4.0.2' gem 'sprockets-rails', '~> 3.2.2' ``` 然后运行以下命令以安装更新的依赖项: ```bash bundle update sprockets sprockets-rails ``` #### 2. 配置额外的安全防护 即使升级了库,仍建议实施额外的安全措施来防止类似攻击: - **限制文件访问权限**:确保静态文件目录之外的文件无法被直接访问。 - **启用严格的 Content Security Policy (CSP)**:通过配置 CSP,可以进一步限制潜在的恶意脚本执行。 - **监控日志**:定期检查应用程序的日志文件,寻找可疑的路径遍历尝试。 #### 3. 使用防火墙或 WAF 部署 Web 应用程序防火墙(WAF)可以帮助拦截恶意请求。例如,ModSecurity 或其他基于规则的 WAF 可以配置为阻止包含路径遍历模式(如 `%2e%2e%2f` 或 `..//`)的请求[^5]。 ### 示例代码:检测路径遍历攻击 以下是一个简单的示例代码,用于检测并阻止路径遍历尝试: ```ruby def sanitize_path(path) # 确保路径不包含路径遍历字符 raise "Invalid path" if path =~ /(\.\.\/|\/\.\.)/ File.join(Rails.root, 'public', path) end ``` ### 关于 flag 的注意事项 如果关注的是与漏洞相关的 flag,通常指在安全测试或 CTF(夺旗竞赛)中使用的特定标识符。对于 CVE-2020-8163,flag 可能出现在以下场景中: -漏洞复现过程中,成功访问受限文件后返回的内容中可能包含 flag。 - 如果是 CTF 题目,flag 通常隐藏在敏感文件(如 `/flag.txt` 或 `/home/ctf/flag`)中。 确保在合法授权的情况下进行任何漏洞测试或复现活动。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值