【问题标题】:Explain how order clause can be exploited in Rails解释如何在 Rails 中利用 order 子句
【发布时间】:2015-04-22 05:09:11
【问题描述】:

我很难理解this website on Rails SQL Injections 的这一部分是如何工作的。

在 ORDER BY 子句中利用 SQL 注入很棘手,但可以使用 CASE 语句测试其他字段,将排序列切换为真或假。虽然它可能需要多次查询,但攻击者可以确定该字段的值。

谁能解释一下?他们说“将排序列切换为真或假”这一点很难理解,因为我不明白这将如何使攻击者能够揭示另一个字段的值。

【问题讨论】:

  • switching the sort column for true or false,意味着假设您正在调用像User.order(condition) 这样的用户模型,条件是您可以说CASE password WHEN 's' THEN 0 else 1 END,在这里您正在检查真假。您的密码案例将失败,但其他部分将返回 true 并且条件将通过并获取记录。大多数情况下,密码被保存为password 字段,然后这将返回带有密码的用户对象数组。

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


【解决方案1】:

如果您正在尝试确定您知道在表中的字段的值,但未在选择中返回,您可以按顺序对其进行迭代,直到获得该值:

 ORDER BY CASE WHEN variableIdLikeToDiscover < 'N' then 1 else 0 end

然后看它是大于还是小于'N'。如果小于,接下来你可以试试:

 ORDER BY CASE WHEN variableIdLikeToDiscover < 'F' then 1 else 0 end

依此类推,直到你(最终)确定了价值。

【讨论】:

  • 'N' 和 'F' 是特殊值还是你说它是一个简单的字符比较?
  • 这是一个简单的字符比较。您可以将问题集一分为二。基本上,您可以问任何布尔问题,并使用结果排序来确定答案。所以你可以问“CASE WHEN LEN(thingToDiscover)
  • 啊,太棒了。谢谢比尔。我正在编写代码来缓解将用户输入直接用于 order 子句的一般情况,因此我应该期望能够描述攻击向量。这很棒。
【解决方案2】:

该示例显示 :order 参数将放在语句的末尾,因此如果在末尾添加始终为 true 的比较,它将更新所有行。

例如,如果您下一个非恶意订单,它将是这样的:

params[:order] = "name"
User.update_all("admin = 1", "name LIKE 'B%'" , { :order => params[:order] })

生成的 SQL 将是:

UPDATE "users" SET admin = 1 WHERE "users"."id" IN (SELECT "users"."id" FROM "users" WHERE (name LIKE 'B%') ORDER BY name))

因此,将对名称为 LIKE 'B%' 的用户进行更新。

但是,当参数设置为:

params[:order] = "name) OR 1=1;"

生成的 SQL 将是:

UPDATE "users" SET admin = 1 WHERE "users"."id" IN (SELECT "users"."id" FROM "users" WHERE (name LIKE 'B%') ORDER BY name) OR 1=1;)

基本上,OR 比较将添加到原始 WHERE,比较将是:更新名称为 LIKE 'B%' 或 1=1 的用户。这将导致所有用户更新为 admin=1(在给定的示例中)。

然后攻击者可以使用任何具有管理员权限的用户登录。

希望对你有帮助...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    相关资源
    最近更新 更多