Ruby On Rails find_by_* SQL Injection (CVE-2012-6496)

GaRY | 2013-01-05 11:51

详情分析链接在此:http://blog.phusion.nl/2013/01/03/rails-sql-injection-vulnerability-hold-your-horses-here-are-the-facts/

RoR,著名的Web开发框架,众所周知的Github,javaeye,csdn部分站点都是使用这个框架开发的。注意这个漏洞是出现在框架的Active Record模式操作数据库模块中的,因此是全框架都中招。

主要攻击模式是,当程序中用到User.find_by_something(params[:id])这种模式的代码时(实际上所有数据库查询操作基本都是这模式的),如果使用类似的代码就会产生注入:

User.find_by_name("kotori", :select => "id, name FROM users; DROP TABLE users; --")

而这个:select是可以和前面的字符串通过一个字典传入的。因此这个就变得可利用了。

但是利用场景很有限,由于需要你带入的字典key也就是:select必须是symbol格式的,而不像是PHP之类都是string。所以必须要找个有序列化字符串可以注入,且反序列化后有被find_by_xxx查询的场景(具体可以看文中给出的EXP链接。思路很yd,我很喜欢。利用的是RoR session会有这个过程。)。因为只有这样,你注入的代码才能被Ruby解释为他的Object,然后才能把你的string的key变成symbol的。

所以,虽然这个漏洞贴出来的时候名头很大,全版本RoR收到影响,但实际上,估计也就开源程序可以被找到类似的苛刻场景吧。

和php unserialize漏洞有异曲同工之妙,不是么? :)