一次简单的注入过程

上个笔记我们提及了闭合方式如何判断和判断之后有什么用。这里我们使用union联合注入来演示一次简单的注入,union联合注入就是闭合后可以添加使得原查询和第二个查询同时执行。继续使用less-1来作演示。

根据之前的笔记,我们已经判断出less-1使用的是字符型闭合,然后我们又判断出闭合的方式是使用单引号闭合,然后我们可以使用--+将末尾多余的单引号提出。

判断列数

接下来,我们在'--+之间可以加入我们想要注入的第二个查询了。union查询我们需要满足一个条件,前面查询的列数与后面查询的列数一致。因此我们还需要判断列,有以下几种方法可以判断列数

  • group by二分法查询,由于分组不能超过列数,我们可以通过尝试分组数量来判断列数

    1. 首先我们尝试一个比较大的列数,发现无法正常返回结果

      image-20230402132649462
    2. 接着我们尝试其一半的列数

      image-20230402132745861
    3. 继续尝试一半的列数,发现可以正常

      image-20230402162825661
    4. 然后我们往后加大列数来测试,发现4不行,3可以,则3为列数

  • order by也可以通过类似的方法来判断,但group by不可用或者出现一些奇怪的问题的时候,我们可以尝试使用。

查询回显位

找到列数之后,我们就可以使用联合查询了。我们可以使用随便一些数字或者字符作为占列符,填充足够3列,然后再加入我们想要查询的内容。

但是我们发现,页面它只能显示出第一行的内容。因此我们需要让原查询为空,让我们的页面实现出我们的代码,一般来说,我们让原查询结果为空即可,这里我们让id=-1

image-20230402162944014

查询所需数据

到现在我们就可以注入我们想要的查询,例如我们想查询一个database()和version(),我们只需要将这两个方法填入2, 3位即可

image-20230402163358087

至此,注入完成。

总结

一个简单的SQL注入有以下步骤

  1. 查找注入点
  2. 判断是字符型还是数字型注入 and 1=1、and 1=2或者2-1
  3. 如果是字符型,判断闭合方式 '"
  4. 判断查询列数 group byorder by
  5. 查询回显位置 id=-1
  6. SQL注入查询数据库