是否可以使用 SQL Active Record 注入来修改数据库
Is it possible to modify database using SQL injection with Active Record
使用 Rails 4.0 我有一个控制器操作,它在活动记录查询中使用请求参数:
@clients = Client.where(params[:where]).order(params[:order]).limit(params[:limit])
用户是否可以使用 sql 注入修改数据库,或从数据库中获取客户端 table 中未包含的信息?
如果是这样,将不胜感激一个例子,以及一个简单的方法来防止这种可能性(我知道占位符或散列参数会消除漏洞,但我不知道如何使用它们创建相同的功能)
提前致谢。
编辑
我了解这些方法存在漏洞。我的问题涉及漏洞的程度。我无法在 rails 指南中找到我的具体问题的答案。
您可以在此处找到您的回复:http://rails-sqli.org/
本网站列出了 ActiveRecord 中的许多查询方法和选项,这些方法和选项不会清理原始 SQL 参数,并且不打算使用不安全的用户输入进行调用
where
方法假设它的参数是一个 SQL 片段,如果它是一个字符串。
接下来会发生什么可能取决于所使用的数据库,例如 mysql
Active Record 关闭了一个查询包含多个语句的能力,所以这不仅仅是注入一个带';'的where子句的情况。
当前版本的 rails 在 postgres 上使用准备好的语句,这也禁止注入多个语句。
总的来说,依赖这个似乎非常危险,并且可能因其他数据库而异。即使数据修改/盗窃是不可能的,拒绝服务也是微不足道的。
也可以通过使用 EXISTS
的子查询窃取 "is there a user with email address xyz" 形式的信息。如果有一点耐心,您还可以提取值,例如,如果我知道用户的 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
函数 - 它允许根据页面加载的时间,一次提取一个字节的变量
使用 Rails 4.0 我有一个控制器操作,它在活动记录查询中使用请求参数:
@clients = Client.where(params[:where]).order(params[:order]).limit(params[:limit])
用户是否可以使用 sql 注入修改数据库,或从数据库中获取客户端 table 中未包含的信息?
如果是这样,将不胜感激一个例子,以及一个简单的方法来防止这种可能性(我知道占位符或散列参数会消除漏洞,但我不知道如何使用它们创建相同的功能)
提前致谢。
编辑
我了解这些方法存在漏洞。我的问题涉及漏洞的程度。我无法在 rails 指南中找到我的具体问题的答案。
您可以在此处找到您的回复:http://rails-sqli.org/
本网站列出了 ActiveRecord 中的许多查询方法和选项,这些方法和选项不会清理原始 SQL 参数,并且不打算使用不安全的用户输入进行调用
where
方法假设它的参数是一个 SQL 片段,如果它是一个字符串。
接下来会发生什么可能取决于所使用的数据库,例如 mysql Active Record 关闭了一个查询包含多个语句的能力,所以这不仅仅是注入一个带';'的where子句的情况。
当前版本的 rails 在 postgres 上使用准备好的语句,这也禁止注入多个语句。
总的来说,依赖这个似乎非常危险,并且可能因其他数据库而异。即使数据修改/盗窃是不可能的,拒绝服务也是微不足道的。
也可以通过使用 EXISTS
的子查询窃取 "is there a user with email address xyz" 形式的信息。如果有一点耐心,您还可以提取值,例如,如果我知道用户的 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
函数 - 它允许根据页面加载的时间,一次提取一个字节的变量