浅谈SQL注入

浅谈SQL注入

SQL注入漏洞的产生需要满足的两个条件:

1、参数用户可控:前端传给后端的参数内容是用户可以控制的
2、参数带入数据库查询:传入的参数拼接到SQL语句,且带入数据库查询

当传入参数为1‘时数据库执行的代码如下所示,这不符合数据库语法规范,所以会报错(可控)

select * from users where id = 1'

当传入参数为and 1=1 时执行的SQL语句如下,id=1为真,1=1也为真,所以页面会返回与id=1相同的结果
当传入的id参数为and 1=2时,由于1=2不成立,所以返回假,页面就会返回与id=1不同的结果(已带入并且返回)

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

在实际环境中凡是满足上述两个条件的皆可能存在SQL漏洞

与MySql注入相关的知识点

MySQL默认在数据库中存放一个“information_scheme”该库中需要记住三个表名SCHEMEATA、TABLES、COLUMNS

SCHEMATA表存储该用户创建的所有数据库的库名,我们需要记住的数据库名的字段名为SCHEMA_NAME

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

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

几个函数

database():当前网站使用的数据库

version():当前mysql的版本

user():当前mysql的用户

注释

注释符:# -- 空格 /**/

内联注释:/*! code */

sql注入类型判断

数字型判断

当输入的参 x 为整型时,Sql 语句类型大致如下:

select * from <表名> where id = x

这种类型可以使用经典的 and 1=1 和 and 1=2 来判断:

url地址中输入 id= x and 1=1

页面依旧运行正常,继续进行下一步。

url 地址中继续输入 id= x and 1=2

页面运行错误,则说明此 Sql 注入为数字型注入。

原因如下:

当输入 and 1=1时,后台执行 Sql 语句:

select * from <表名> where id = x and 1=1

没有语法错误且逻辑判断为正确,所以返回正常。

当输入 and 1=2时,后台执行 Sql 语句:

select * from <表名> where id = x and 1=2

没有语法错误但是逻辑判断为假,所以返回错误。

我们再使用假设法:

如果这是字符型注入的话,我们输入以上语句之后应该出现如下情况:

select * from <表名> where id = 'x and 1=1'
select * from <表名> where id = 'x and 1=2'

查询语句将 and 语句全部转换为了字符串,并没有进行 and 的逻辑判断,所以不会出现以上结果,故假设是不成立的。

字符型判断

当输入的参 x 为字符型时,通常 abc.php 中 SQL 语句类型大致如下

select * from <表名> where id = 'x'

这种类型我们同样可以使用 and '1'='1 和 and '1'='2来判断:

url地址中输入 id= x' and '1'='1

页面运行正常,继续进行下一步。

url地址中继续输入 id= x' and '1'='2

页面运行错误,则说明此 Sql 注入为字符型注入。

原因如下:

当输入 and '1'='1时,后台执行 Sql 语句:

select * from <表名> where id = 'x' and '1'='1'

语法正确,逻辑判断正确,所以返回正确。

当输入 and '1'='2时,后台执行 sql语句:

select * from where id = 'x' and '1'='2'

语法正确,但逻辑判断错误,所以返回正确。

posted @ 2021-08-14 20:02  知己呀  阅读(92)  评论(0编辑  收藏  举报