原理:

需满足条件:

1.参数条件可控,前端传给后端的参数内容是用户可以控制的。

2.参数代入数据库查询:传入的参数拼接到SQL语句,且带入数据库查询。

当传入ID参数为1’时,数据库执行代码如下所示

select * from user where id = 1'

这不符合数据库语法规范,所以会报错。当传入ID值为and 1=1时,执行的SQL语句如下所示

select * from user where id = 1 and 1=1

因为1=1为真,且where语句中id=1也为真,所以页面会返回与id=1相同的结果。当传入的ID参数为and 1=2时,由于1=2不成立,所以返回假,页面则返回与id=1不同的结果。

由此可以判断ID参数存在SQL注入漏洞。


相关知识点

MYSQL5.0版本之后,MYSQL默认在数据库中存放一个“information schema”的数据库,在该库中,三个重要的表名,SCHEMATA、TABLES、COLUMES。

SCHEMATA表存储该用户创建的所有数据库的库名。

image-20200404172925519.png

图1 SCHEMATA表

TABLES表存储该用户创建的所有数据库的库名和表名,其对应的字段名分别为TABLE_SCHEMA和TABLE_NAME。

image-20200404172827963.png

图2 TABLES表

COLUMNS表存储该用户创建的所有数据库的库名、表名和字段名,其对应的字段名分别为TABLE_SCHEMA、TABLE_NAME和COLUMN_NAME。

image-20200404173407370.png

图3 COLUMNS表
MYSQL查询语句

在不知道任何条件时,语句如下所示。

SELECT 要查询的字段名 FROM 库名,表名

在知道一条已知条件时,语句如下所示。

SELECT 要查询的字段名 FROM 库名,表名 WHERE 已知条件的字段名='已知条件的值'

在知道两条已知条件时,语句如下所示。

SELECT 要查询的字段名 FROM 库名,表名 WHERE 已知条件1的字段名='已知条件1的值' AND 已知条件2的字段名='已知条件2的值'
LIMIT的用法

limit使用格式为limit m,n,其中m指记录开始的位置,从0开始,表示第一条记录,n指取n条记录。例如limit 0,1指从第一条记录开始,取一条记录。

几个重要的函数
  • database():当前网站使用的数据库。
  • version():当前MYSQL的版本。
  • user():当前MYSQL的用户。
注释符

在MYSQL中,常见注释符有:#或- -空格或/**/。

内联注释

内联注释的形式:/*! code */。内联注释可以用于整个SQL语句中,用来执行我们的SQL语句。

index.php?id=-15 /*!UNION*/ /*!SELECT*/ 1,2,3