Airbnb案例:Ruby on Rails YAML格式化字符串时导致的远程代码执行

Posted MottoIN

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Airbnb案例:Ruby on Rails YAML格式化字符串时导致的远程代码执行相关的知识,希望对你有一定的参考价值。

简介


nahamsec和我在几个月前发现了一个跨站点脚本漏洞,问题出在Rails类型转换请求变量相关的JSON。这导致输出为JSON格式,JSON索引将绕过XSS编码。我们决定利用这个概念进行尝试探索网站的其余部分,看看是否可以使用相同的方法找出其他漏洞。在这段时间内,我们从/api/v1/listings/[id]/update API请求中发现了一个有趣的输出。这导致我们在Airbnb上发现了一个远程代码执行漏洞,它是通过Ruby on Rails字符串插值造成的。


测试


这是API请求的典型外观:


  • https://www.airbnb.com/api/v1/listings/[id]/update

  • POST:{“listing”:{“directions”:“test”}}


这看起来像将字符串转换为数组的样子:


  • https://www.airbnb.com/api/v1/listings/[id]/update

  • POST:{“listing”:{“directions”:[{“test”:“test1”}]}}


他给出这样的输出使其变成了数组

"directions":"---\n- !ruby/hash:ActionDispatch::Http::ParamsHashWithIndifferentAccess\n  test: test1\n"

这不是我们第一次看到这个了,因为还有其他POST请求会导致类似的输出:

--- !

我们不熟悉YAML的格式,直到我们发现了!ruby输出。通过与Jobert交谈,我们意识到这是一个YAML解析器的输入。任何尝试利用该处作为downstream Rail YAML反序列化攻击都会失败。输入中的任何YAML格式化字符串都将被放在引号内或转义。


在我们的模糊测试中,我们搞乱了不同类型的Rails功能。我们最终把目光放在了字符串插值的上。

{"listing":{"directions":[{"test":[{"abc":"#{1+1}"}]}] }}

结果:abc:!'2'\ n


这个发现使我们意识到,即使我们的代码在引号内,我们也能够使用#{}来测试代码。使用%x arg,我们能够执行shell命令。


*来源:buer,MottoIN小编编译发布,转载请注明来自MottoIN


以上是关于Airbnb案例:Ruby on Rails YAML格式化字符串时导致的远程代码执行的主要内容,如果未能解决你的问题,请参考以下文章

让我们构建:使用Ruby on Rails - 博客和评论

Ruby on Rails Switch [重复]

让我们使用 Ruby on Rails 来构建一个Twitter

思考Ruby On Rails的底层代码(Ruby on Rails 開發秘籍 | Ruby on Rails 快速入門)

ruby on rails如何安装

ruby on rails - 问题捆绑安装nokogiri 1.7.2 on ruby on rails 4.x.