了解为什么在此 SQL 注入示例中使用 UNION

Understanding why UNION is used in this SQL injection example

我想了解更多关于 SQL 注入的信息,所以我从 Red Tiger Labs 找到了 this lesson

根据 the solution,URL 的 cat=1 部分容易受到 SQL 注入攻击。

我可以理解,您可以追加 ORDER BY X# 并不断递增 X 以建立列数,即 4。

不过根据解决方案,下一步要做的是:

cat=1 union select 1,2,3,4 from level1_users #

提供了table名字,没关系。但是我真的很难理解 UNION 的目的。我的猜测是底层代码做了类似的事情:

SELECT * FROM level1_users where cat=1

大概它只期望 0 或 1 个结果。然后它将一些列打印到屏幕上。根据示例,它打印出:

This hackit is cool :)
My cats are sweet.
Miau
3
4

前三行是在没有额外 SQL 注入的情况下打印出来的。那么这是怎么回事,有什么意义呢?

我不希望工会做任何事情,我假设数字指的是列?

所以,我设法弄清楚这里发生了什么。

cat=1 union select 1,2,3,4 from level1_users #

select 部分 select 将数字 1、2、3、4 作为列。您实际上可以在这里使用任何东西,例如 select 'cats', 'fish', 'bread', 42,有时您必须这样做,因为联合 select 必须匹配目标 table 中的列类型。 level1_users table 是整数(或者至少,整数有效),因此 selecting 数字。

我实际上认为它可能 select 按索引排列列,因为通常在 sql 中你可以执行 ORDER BY 1 例如按第一列排序,但事实并非如此.

让我感到震惊的是这个特定的 SQL 注入网站将结果集的全部内容转储到屏幕上,我没想到会这样。如果您考虑一下,虽然它正在寻找类别 ID,因此期望它列出该类别中的所有内容并不是不合理的。

通过执行合并,它首先显示额外的行将打印到屏幕上,并且因为我们已经对列进行了编号,所以它显示 哪个 列,第 3 列和第 4 列.

从那里可以简单地将 select 用户名和密码放入这些列(在这种情况下你必须猜测 table headers 因为虽然你通常可以联合到数据库此练习已禁用它的数据)。