一、实验环境

一台win10电脑,既做服务器端,也是客户端。

二、实验原理

攻击者通过对服务器端注入恶意的SQL命令,破坏SQL查询语句的结构,从而达到执行恶意SQL语句的目的。

三、实验步骤

low级别

(1)登录dvwa,设置等级为low

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

输入1’尝试

提示1周围出现多个单引号

故猜测sql查询语句为:

  1. 猜测sql语句总共查询字段数(利用order by子句)

(1)根据猜测的sql查询语句来构造

注:# 注释掉sql语句后面引号

(2)输入构造语句

输入1’ or 1=1 order by 2

输入1’ or 1=1 order by 3

显示无第三列,所以猜测只有两个字段firstname以及secondname。

  1. 确定字段顺序

输入1’union select 1,2#

得到first_name在前,surname在后

  1. 获取数据库名

注:利用database()函数和联合查询union

输入得:

由此可看得数据库名为dvwa

  1. 获取表名,和字段名

利用mysql自带得表名存储表information_schema.tables

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

注:结果两列利用group_concat合并

同理利用1′union select 1,group_concat(column_name) from information_schema.columns where table_name=’users’#

得:

  1. 获得所有字段数据

输入1′ or 1=1 union select group_concat(user_id,first_name,last_name),group_concat(password) from users #

得到:

分析源码:

medium级别

(2)设置等级为medium

表单变成了可选项,目的是为了让用户在规定范围内选择,防止sql注入,但是我们可以利用burpsuit抓包,修改相应参数来达到sql注入。

  1. 判断是字符型注入还是数字型

修改参数为 2’ or 333=333 #

返回页面,说明存在字符转义函数

试试数字型注入

成功爆出其他行数据,说明存在数字型注入

总结:存在数字型注入且服务器代码存在字符转义

  1. 推出sql语句中字段数,和字段顺序

继续利用order by子句

返回结果:first_name被排序说明第一个字段为first_name

继续以第二列排序,结果显示其surname被排序说明第二列为surname

继续排序第三行,发现无第三行说明只有两行且前字段为first_name,后字段为surname

猜测sql语句为:

SELECT first_name, last_name FROM 表名 WHERE user_id = $id

  1. 获取数据库名,以此获得表名

返回结果显示表名为dvwa

  1. 利用数据库名获取表名

返回结果显示有两个表guestbook,users

  1. 获取表内字段名,因为存在字符转义所以将’users’改为十六进制0x7573657273:

返回界面显示了所有字段名

  1. 获取用户名密码

返回界面成功显示

  1. 源码分析:

high级别

(2).high级别

  1. 分析源码

构造下列语句:

1’ or 1=1#

得到:

user_id = ‘1’ or 1=1#’ LIMIT 1;

成功注释掉limit 1,下面注入步骤和上述相同