是否可以使用Active Record的SQL注入来修改数据库

时间:2015-08-30 21:02:49

标签: ruby-on-rails activerecord sql-injection

使用Rails 4.0我有一个控制器动作,它在活动记录查询中使用请求参数:

@clients = Client.where(params[:where]).order(params[:order]).limit(params[:limit])

使用sql注入的用户是否可以修改数据库,或者从客户端表中未包含的数据库中获取信息?

如果是这样的例子将非常感激,以及一种防止这种可能性的简单方法(我知道占位符或哈希参数会消除漏洞,但我不知道如何使用它们创建相同的功能)

提前致谢。

修改

据我所知,这些方法存在漏洞。我的问题涉及脆弱程度。我无法在导轨指南中找到我的具体问题的答案。

2 个答案:

答案 0 :(得分:2)

where方法假设它的参数是一个SQL片段,如果它是一个字符串。

接下来发生的事情可能取决于所使用的数据库,例如在mysql上 Active Record会关闭查询包含多个语句的能力,因此不仅仅是使用'注入where子句的情况。'。

当前版本的rails在postgres上使用预处理语句,这也禁止注入多个语句。

总的来说,依赖于此似乎风险极大,并且可能因其他数据库而异。即使不能进行数据修改/盗窃,拒绝服务也是微不足道的。

还可以窃取表单的信息"是否有用户使用电子邮件地址xyz"通过使用使用EXISTS的子查询。有一点时间耐心你也可以提取价值,例如,如果我知道用户的ID并想要提取他们的电子邮件地址,我可以运行表格的子选择

SELECT * from users where id = 123 and email_address like 'A%'

如果我得到结果,那么我知道电子邮件地址以A开头,我可以转到下一个字母。如果没有,那么我检查电子邮件地址是否以B开头,依此类推。一旦我获得了第一个字符,然后查询表单

SELECT * from users where id = 123 and email_address like 'FA%'
SELECT * from users where id = 123 and email_address like 'FB%'
SELECT * from users where id = 123 and email_address like 'FC%'

允许我提取电子邮件地址的第二个字符。只需几千个查询,您就可以获得整个电子邮件地址。

另一种方法是在mysql上使用sleep函数 - 它允许根据页面加载的时间长度一次提取一个字节

答案 1 :(得分:1)

您可以在此处找到您的回复:http://rails-sqli.org/

此网站列出了ActiveRecord中的许多查询方法和选项,这些方法和选项不会清理原始SQL参数,也不打算使用不安全的用户输入进行调用