SQL注入和LIMIT子句

时间:2014-04-05 20:53:52

标签: mysql sql sql-injection

这个问题是为了解决我和同事之间的争论。

假设我们在标准LAMP服务器上执行以下查询。

SELECT field1, field2, field3
FROM some_table
WHERE some_table.field1 = 123
ORDER BY field2 DESC
LIMIT 0, 15

现在让我们假设limit子句易受SQL注入攻击。

LIMIT [insert anything here], [also insert anything here]

我的同事的观点是没有办法利用这种注射,所以没有必要逃避它(因为它需要更多的处理能力和东西)。

我认为她的推理是愚蠢的,但我无法通过寻找一个例子来弄清楚如何证明她的错误。

我无法使用UNION,因为查询使用ORDER BY子句,运行查询的MySQL用户没有FILE权限,所以使用{{1}也是不可能的。

那么,任何人都可以告诉我们这个案件谁是对的吗?

编辑:使用PHP执行查询,因此使用分号添加第二个查询将无效。

5 个答案:

答案 0 :(得分:6)

LIMIT子句 容易受到SQL注入攻击,即使它在今年早些时候ORDER BY mysql> SELECT field FROM user WHERE id >0 ORDER BY id LIMIT 1,1 procedure analyse(extractvalue(rand(),concat(0x3a,version())),1); ERROR 1105 (HY000): XPATH syntax error: ':5.5.41-0ubuntu0.14.04.1' 之后也是如此:

SELECT field FROM table WHERE id > 0 ORDER BY id LIMIT 1,1
PROCEDURE analyse((select extractvalue(rand(),
concat(0x3a,(IF(MID(version(),1,1) LIKE 5, BENCHMARK(5000000,SHA1(1)),1))))),1)
     

瞧!上述解决方案基于所谓的基于错误的注入的已知技术。因此,如果我们易受攻击的Web应用程序公开了数据库引擎的错误(这是一个真正的机会,这种不良做法很常见),我们就能解决问题。如果我们的目标没有显示错误怎么办?我们还能成功利用它吗?

     

事实证明,我们可以将上述方法与另一种众所周知的技术结合起来 - 基于时间的注射。在这种情况下,我们的解决方案如下:

{{1}}
     

有效。有趣的是,在这种情况下使用SLEEP是不可能的。这就是必须有一个基准的原因。

答案 1 :(得分:1)

我会插入这个:

1; DELETE FROM some_table WHERE 1; --

在限制之后,将从some_table中选择1行,然后删除所有some_table行。然后其余的将被视为评论。

答案 2 :(得分:1)

如果“externally-influenced input […] could modify the intended SQL command”发生SQL注入。在这种情况下,很明显用户输入可以修改预期的SQL命令。

然而,可利用性是另一个问题。 可能无法利用今天。但也许有一天有人能够利用它,因为:

  • 数据库连接层已更改,可以一次执行多个语句。
  • 声明已更改,可以使用UNION
  • 用户权限已更改,可以使用INTO OUTFILE / INTO DUMPFILE
  • 有人找到了一种你可能没有想过的方法。你注意到你可以store the result in variables and/or execute a stored procedure吗?

答案 3 :(得分:0)

如果您是从用户输入创建SQL查询,那么它将是易受攻击的,除非您在生成查询之前使用强类型 way 。在这种情况下,例如,你无法使整数成为放弃表格的文本。

永远不要信任用户输入,并始终执行边界检查。例如,如果限制值为负,请不要打扰查询。

答案 4 :(得分:0)

您应该提供编码示例,而不是现在的查询示例。她是对的,你不能真正改变一个陈述,因为按功能的顺序总是“最后”。所以,是的,当您在SQL服务器上手动输入这些查询时,您根本无法更改查询以输出不同的内容而不是错误消息。然而,当你只是添加一个其他查询..你可以:)

将最后一个用户输入作为真值完成,让第一个查询成功运行,并添加“;”。现在您可以开始自己的查询了。

我刚刚在我的本地mysql服务器上完成了这个:

SELECT * FROM city order by ID desc limit 0,15; SELECT * FROM city

即便如此,在强有力的情况下,有人可能会改变声明的绝对0%,你根本不想接收可能的改变数据。应该有一个动态使用LIMIT的原因。一旦一个人改变了你的理由,你就已经失败了。它甚至没有冒险损坏,丢失数据或者什么都没有。你不希望以任何方式进行任何操纵。