web安全—sql注入漏洞

时间:2023-02-02 22:53:09

SQL注入-mysql注入

一.普通的mysql注入

MySQL注入不像注入access数据库那样,不需要猜。从mysql5.0以上的版本,出现一个虚拟的数据库,即:information_schema数据库,该数据库存在放着其他数据库的所有信息,所以mysql注入的原理就是运用information_schema数据库进行实施,接下来我们具体说明怎么运用。

  1. 用order by猜测字段数

在发现有注入点的mysql数据库,首先要确定该数据库的字段数。这时候就要运用一下order by语句了。

Payload:order by +推测的字段数(如果推测的字段数超过该数据库的字段数会报错)

  1. 运用mysql的内置函数和union select联合查询

在推测完字段数后,要对该数据库的信息进行获取,这时MySQL的内置函数起了很大的作用。

常用的函数:

User():查看当前用户

Database():查看当前的数据库

Version():查看当前数据库的版本

例如:这个注入点是数字型的MySQL注入,并且已经爆出一个数据库有3个字段,则可以构造这样的payload: union select 1,2,3 注意这时要使union前面的语句报错,这样才能判断哪个是可显字段。

在可显字段上替换成上面的内置函数,即可查看响应的信息。假设2,3是可显字段。则可以构造这样的payload:union select 1,user(),database() 这条payload可以查看数据库当前的用户是谁和当前的数据

库名。

  1. 运用information_schema函数爆出数据库的信息

首先先对information_schema里的表和字段进行说明一下。我们对MySQL注入就运用了information_schema中的两张表:tables和columns

Tables:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。

Columns:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。

也运用了俩个字段:table_name和column_name,table_name是属于tables里的字段,记录了其他数据库表的信息。Column_name是columns里的字段,记录了其他数据库的表的字段的信息

好了到了最重要的环节了,上面已经对information_schema函数进行了简单的介绍。现在就来实际运用一下吧!!!!!

(1)    爆出数据库的表名

Payload:1.union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=”当前数据库名”

2.union select 1,table_name,3 from information_schema.tables where table_schema=”当前数据库名” limit 0,1

以上俩条payload都上爆出数据库表名的语句,我们来逐个分析一下。Group_concat函数将查询的数据整合到一个字段中, Limit子句可以被用于强制 SELECT 语句返回指定的记录数。limit 0,1:返回查询的第一条数据

第一条payload:意思是从当前的数据库中查询所以的表名。第二条payload:意思是从当前的数据库中查询第一个表名。当前数据库名可以转化成16进制来绕过某些限制,注意不要加双引号了。

(2)爆出表中的字段

Payload:1.union select 1,group_concat(column_name),3 from information_schema.columns where table_name=”要查询的表名”

2.union select 1,column_name,3 from information_schema.columns where table_name=”要查询的表名” limit 0,1

和上面的一样,只不过换了爆出字段的函数

(3)爆出字段内容

Payload:union select 1,字段名,字段名 from 要查询的表名

这条payload和access数据爆出字段内容的一样,这里不再进行说明。

经过上面的操作,对于普通的mysql注入就完成了。当然mysql的注入类型还有很多,例如:基于报错的注入,基于布尔的盲注,基于时间的盲注,post注入等等。将在后面的博客中更新

但是还是那句话sql注入万变不离其中,就只有俩种类型:数字型和字符型。