sql注入的学习

首先先要判断注入类型

可以按照查询字段分类分为字符型数字型

在get请求中区分这两种类型方法:

image-20240131163426182

如果是字符型闭合,那就接着判断闭合方式

如果有报错文:
可以在输入的参数下+\

例如这样:

image-20240714175539639

我们可以十分清楚的看到\后面的为一个单引号,所以这个题目就为单引号闭合

为什么要知道闭合方式?

因为当我们知道闭合方式之后,我们可以将原先系统内置的sql语句进行闭合。根据mysql的语法,我们在后面在加入一条sql语句,这条我们加的sql语句也是会继续执行的,从而进行sql注入

1.union注入

在前面步骤做完之后,我们需要判断它表中有多少列,要与之对应

因为在union联合查询的时候如果查询的两个列数不同的话,是查询不出结果的。

在我们判断完列数之后要进行显示位判断

image-20240202150301152

因为显示的原因,它只显示第一个查询的内容,我们要看显示位,可以把id改成一个不存在的就行了

在这里我们可以看到显示位是2和3,所以我们可以用查询语句来替换2和3的位置,来显示我们要的查询结果

image-20240202150241086

2.报错注入

image-20240202182917495

有以下几种报错注入相关的函数:

image-20240202183044826

我们通常是在我们union注入代码正确但是却没有回显的时候,这个时候我们就可以考虑报错注入

image-20240202183156878

报错注入有很多种函数,我们先来学习简单的

extractvalue函数:

extractvalue函数包含两个参数,它的本身用途是查询

第一个参数是目标文档,第二个是目标路径

这些并不是很重要,我们要了解的是当我们参数路径写错查找不到内容的时候,它是不会报错的,但是它对参数的格式符号是很敏感的,而且它返回的报错信息是会返回我们输入的参数路径,我们就可以利用这个来获取数据库的信息

image-20240202184135834

我们看它的报错信息,是不是将路径原文返回

所以我们可以将它和括号里面优先查询的原则,将我们需要的信息返回

select extractvalue(1,concat(0x7e,(select database())))

concat 的作用就是将第一个参数跟第二个参数连接起来

0x7e就是~

这个相当于就是我们查询到数据库的名字之后,这个名字又变成了目标路径,然后报错之后进行返回,我们就可以得到想要的信息了