数字型SQL注入学习

以MYSQL为例子说明,SQL注入的形成原理是没有对用户输入的数据进行过滤和转义,使得用户的数据被SQL解释器执行。

数字型的注入特征是当输入的参数为整型时,如:ID,年龄,页码等,若存在注入漏洞,则可认为是数字型注入。数字型的注入多存在ASP与PHP等弱类型中。

一、有回显的SQL注入(报错注入)

1.判断是否存在注入点

判断是否存在注入点最常见的做法是利用单引号,即“ ' ”。因为当你在网页上进行查询操作的时候,在后台提交的语句实际上是

SELECT * FROM database_name WHERE id='$id'

所以当你查询的时候键入单引号的时候,因为单引号不匹配,则会报错。然后可以测试是否存在SQL注入点。

1.1 and语句

在参数处输入 1 and 1=1、1 and 1=2。当出现前者返回页数为1的页面,而后者没有返回数据的时候,可以认为是存在注入点。当然也可以使用or语句进行测试。

1.2 or语句

在参数处输入 6 or 1 = 1,当前者6为不存在的数字时,即假 or 真,返回页面时,存在注入点。

1.3 加法

可以在参数处输入 1 + 1,若返回的是第2个页面,则存在注入点,同时需要注意的是“+”号需要进行url的转码,转码为%2b

1.4 减法

和加法类似,在参数处输入 4-2,若返回的是第二个页面,则存在注入点。

2.判断数据库权限

判断数据库的权限是非常有必要的,毕竟SQL注入的目的就是要获取大量的数据,很多的时候会出现权限不足的情况。

and ord(mid(user(),1,1))=114

在上述语句中,mid函数的作用是选取user()函数中的1第一个字符,ord()函数的作用是把字符转化为数字,整个字段的意思是判断user()中的第一个字符是否为ASCII码114,即r。如果返回正确,则可能拥有root权限。

and (select count(*) from mysql.user)>0

而上述语句,利用select语句,如果返回正确,则可能有读写权限。

3.判断字段数

3.1 联合查询,union select

union select 可以用于一个或多个select结果集,而他有一个条件,就是两个select查询语句必须有相同的列才可以查询。可以利用这个特性去猜测查询语句的列数

and 1=1 union select 1,2,3,4,5.....

当列数不正确的时候,不会返回正确的页面,直到页数正确(多或者少都不行)。

3.2 order by 查询

在SQL语句中,order by 语句的作用是对结果集的指定列进行排序。

order by 1,2,3,4...

上述语句的意思是按照,第一列,第二列,第三列,第四列排序,如果在递增的过程中出现了错误,则说明可能只有这么多的列,比如到第七列,没有返回正确的页面,则说明可能该表只有7个字段。当然也有可能是管理员并没有用递增的数列去表示,而使用了哈希函数去乱序。

猜你喜欢

转载自blog.csdn.net/weixin_38608231/article/details/81487010