我想更多地了解 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 注入的情况下打印出来的。那么这是怎么回事,又有什么意义呢?
我不希望工会做任何事情,我假设数字指的是列?
所以,我已经设法弄清楚这里发生了什么。
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列。
从那里可以简单地在这些列中选择用户名和密码(在这种情况下你必须猜测表标题,因为虽然你通常可以联合到数据库数据,但在这个练习中它已被禁用)。
显然,我们的查询结果反映到页面上,所以我们必须尽量在结果查询中包含用户的密码。现在,我们该怎么做?联盟。 Union 允许我们执行额外的选择查询并将结果附加到前面的查询。
我们可以假设两个表(level1_users 和 cat 查询的表)都存储在同一个 SQL 数据库中。然后,我们可以使用 union 从 level1_users 表返回密码,得到包含用户密码的结果集.