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

问题描述 投票:0回答:2

我想更多地了解 SQL 注入,所以我从 Red Tiger Labs 找到了this lesson

根据解决方案,URL的

cat=1
部分存在SQL注入漏洞。

我可以理解,您可以附加

ORDER BY X#
并不断递增X以建立列数,即4.

然而根据解决方案,下一步要做的是:

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

提供了表名,这样就可以了。但是我真的很难理解 UNION 的目的。我的猜测是底层代码做了类似的事情:

SELECT * FROM level1_users where cat=1

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

这个 hackit 很酷 :)
我的猫很可爱。

3
4

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

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

sql sql-injection
2个回答
0
投票

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

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

选择部分选择数字1、2、3、4作为列。你实际上可以在这里使用任何东西,比如

select 'cats', 'fish', 'bread', 42
,有时你必须这样做,因为 union select 必须匹配目标表中的列类型。
level1_users
表是整数(或者至少,整数有效),因此选择数字。

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

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

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

从那里可以简单地在这些列中选择用户名和密码(在这种情况下你必须猜测表标题,因为虽然你通常可以联合到数据库数据,但在这个练习中它已被禁用)。


0
投票

显然,我们的查询结果反映到页面上,所以我们必须尽量在结果查询中包含用户的密码。现在,我们该怎么做?联盟。 Union 允许我们执行额外的选择查询并将结果附加到前面的查询。

我们可以假设两个表(level1_users 和 cat 查询的表)都存储在同一个 SQL 数据库中。然后,我们可以使用 union 从 level1_users 表返回密码,得到包含用户密码的结果集.

© www.soinside.com 2019 - 2024. All rights reserved.