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 来构建一个Twitter
思考Ruby On Rails的底层代码(Ruby on Rails 開發秘籍 | Ruby on Rails 快速入門)