SQL注入(3):一次简单的注入过程
一次简单的注入过程
上个笔记我们提及了闭合方式如何判断和判断之后有什么用。这里我们使用union联合注入来演示一次简单的注入,union联合注入就是闭合后可以添加使得原查询和第二个查询同时执行。继续使用less-1来作演示。
根据之前的笔记,我们已经判断出less-1使用的是字符型闭合,然后我们又判断出闭合的方式是使用单引号闭合,然后我们可以使用--+
将末尾多余的单引号提出。
判断列数
接下来,我们在'
和--+
之间可以加入我们想要注入的第二个查询了。union查询我们需要满足一个条件,前面查询的列数与后面查询的列数一致。因此我们还需要判断列,有以下几种方法可以判断列数
-
group by
二分法查询,由于分组不能超过列数,我们可以通过尝试分组数量来判断列数-
首先我们尝试一个比较大的列数,发现无法正常返回结果
-
接着我们尝试其一半的列数
-
继续尝试一半的列数,发现可以正常
-
然后我们往后加大列数来测试,发现4不行,3可以,则3为列数
-
-
order by
也可以通过类似的方法来判断,但group by
不可用或者出现一些奇怪的问题的时候,我们可以尝试使用。
查询回显位
找到列数之后,我们就可以使用联合查询了。我们可以使用随便一些数字或者字符作为占列符,填充足够3列,然后再加入我们想要查询的内容。
但是我们发现,页面它只能显示出第一行的内容。因此我们需要让原查询为空,让我们的页面实现出我们的代码,一般来说,我们让原查询结果为空即可,这里我们让id=-1
![image-20230402162944014](https://image.icewindy.cn/202304021629041.png)
查询所需数据
到现在我们就可以注入我们想要的查询,例如我们想查询一个database()和version(),我们只需要将这两个方法填入2, 3位即可
![image-20230402163358087](https://image.icewindy.cn/202304021633119.png)
至此,注入完成。
总结
一个简单的SQL注入有以下步骤
- 查找注入点
- 判断是字符型还是数字型注入
and 1=1、and 1=2
或者2-1
- 如果是字符型,判断闭合方式
'"
- 判断查询列数
group by
或order by
- 查询回显位置
id=-1
- SQL注入查询数据库