【DVWA靶场通关教程】

DVWA靶场通关教程


概述
DVWA(Damn Vulnerable Web Application)一个用来进行安全脆弱性鉴定的PHP/MySQL Web 应用,旨在为安全专业人员测试自己的专业技能和工具提供合法的环境,帮助web开发者更好的理解web应用安全防范的过程。
DVWA 还可以手动调整靶机源码的安全级别,分别为 Low,Medium,High,Impossible,级别越高,安全防护越严格,渗透难度越大。
一般 Low 级别基本没有做防护或者只是最简单的防护,很容易就能够渗透成功;而 Medium 会使用到一些非常粗糙的防护,需要使用者懂得如何去绕过防护措施;High 级别的防护则会大大提高防护级别,一般 High 级别的防护需要经验非常丰富才能成功渗透;
最后 Impossible 基本是不可能渗透成功的,所以 Impossible 的源码一般可以被参考作为生产环境 Web 防护的最佳手段。

Brute Force(暴力(破解))

Low

1.随便在登录框输入用户名和密码
2.开启代理,打开burpsuite工具,点击login并拦截包
在这里插入图片描述
在这里插入图片描述
在页面内右键把包放到intrude测试器模块
点击测试器,点击位置
在这里插入图片描述
1.点击清除把所有变量清除
2.分别双击输入的用户名和密码,点击添加,变为有效载荷
3.选择攻击类型,攻击类型有四种,这里出于实际情况,我们选择第四种集束炸弹的模式

Sniper: 单参数爆破,多参数时使用同一个字典按顺序替换各参数,只有一个数据会被替换
Battering ram: 多参数同时爆破,但用的是同一个字典,每个参数数据都是一致的
Pichfork: 多参数同时爆破,但用的是不同的字典,不同字典间数据逐行匹配
Cluster bamb: 多参数做笛卡尔乘积模式爆破
在这里插入图片描述
点击有效载荷,设置参数字典
设置用户名字典
在这里插入图片描述
在这里插入图片描述
设置密码字典并开始攻击
在这里插入图片描述
字典跑完后,点击“长”使其按顺序或逆序排列,查看返回的数字,发现有数字和其他大多数数字不同即代表攻击成功
在这里插入图片描述
查看响应,显示攻击成功
在这里插入图片描述
源码分析:low等级只是把输入的用户名和密码放到数据库去查询并返回结果,并没有做任何的限制,只要字典够强大,很容易就跑出来

Medium

Medium步骤和low等级完全一样,主要是源码多了一点东西导致难度会提高一点,但无伤大雅,low等级能跑出来的Medium也能跑出来,接下来就让我们分析一下Medium等级的源码吧

源码分析:Medium等级中分别对用户名和密码进行了查询,提高了安全性,主要区别是在登录失败后会执行sleep(2)函数,即程序休眠两秒,这两秒内不能再登录,这延长了我们爆破的时间但并不影响结果
在这里插入图片描述

High

源码分析:high等级相较于Medium的变化是sleep(rand(0,3))函数随机休眠0到3秒,重点是增加了token值,这增加了难度,接下来看看我们怎么在有token验证的情况下获得正确的用户名和密码

在这里插入图片描述
为了测试方便,这里我假设知道用户名就是admin,只爆破密码(带token),实际情况中可以考虑先找到正确的用户名或密码再针对性的爆破,不然工作量太大
爆破阶段:
1.输入用户名admin,密码任意
2.开启代理,使用burpsuite抓包
在这里插入图片描述
转到测试器模块——位置
1.清除所有变量
2.选中密码变量和token变量并添加为载荷
3.选择第三种攻击类型——音叉攻击,表示使用两个字典,密码和token的值进行逐行匹配
在这里插入图片描述
转到有效载荷
设置密码参数,添加字典
在这里插入图片描述
设置token参数
跳转到options选项页面
1.修改线程为1,大于1可能会有问题,因为token是每次验证完后才会新生成token,所以不能使用多线程进行爆破
在这里插入图片描述
2.下拉找到Grep——extract(这里是为了从我们的请求中提取到token,分辨特征,以便为每个密码找到对应的token)
3.勾选“从响应中提取以下项目”,点击添加
在这里插入图片描述
在弹出的界面里点击获取回复,从回复的数据里找到token的值,双击选中,上半部分的页面会自动分辨填值,得到token的特征,方便从回复中找到token,这里的token要复制一遍,方便在后面直接填充
在这里插入图片描述
在这里插入图片描述
回到有效载荷页面
设置第二个参数——token,有效载荷类型改为递归搜索,英文为recursive grep。
在第一个请求的初始有效负载部分把我们复制的token粘贴上去
在这里插入图片描述
在这里插入图片描述
设置完毕,开始爆破!
爆破时发现有两个返回的数字不一样,发现密码为password时返回的html页面提示登录成功
在这里插入图片描述

Command Injection(命令行注入)

Low

1.网站提示我们输入ip地址
在这里插入图片描述
尝试输入本机ip地址,127.0.0.1,点击提交,发现返回的数据和我们在cmd命令行里面执行ping 127.0.0.1的结果相似。网页端由于编码的问题所以有些是乱码
在这里插入图片描述
在这里插入图片描述
2.乱码解决办法:
在(D:\phpstudy_pro\WWW\DVWA\dvwa\includes)目录下有个dvwaPage.ini.php文件,双击打开(这个路径根据自己电脑上dvwa的安装位置自行调整)。
在这里插入图片描述
3.在文件中ctrl+f,用搜索栏查找utf-8,将UTF-8改为GBK或者GB2312即可
在这里插入图片描述
再进行一次测试,输入127.0.0.1,结果与在本机使用ping命令完全一致,说明这里可以让我们执行ping命令。
在这里插入图片描述
源码分析:对输入的ip地址进行ping操作,源码只让我们进行ping操作,没有其他动作,但它给了我们一个利用系统命令的平台。我们能不能在执行ping命令操作的同时执行其他命令呢?
在这里插入图片描述
这里我们要说一下命令连接符
& :前面一个命令无论是否执行,后面的命令都能执行,两个命令都执行
&&:前面一个命令执行成功后,才能执行后面一个命令,两个命令都执行
|:前面一个命令无论是否执行,后面的命令都能执行且只执行后面一个
||:前面一个命令不能正常执行后,才能执行后面一个命令

我们使用“|”符号作为连接符让计算机做出除ping以外的操作实现命令注入
结果显示注入成功!
命令:127.0.0.1 | dir
在这里插入图片描述

Medium

直接分析源码看看和Low等级有什么区别
源码分析:发现在Low等级源码的基础上添加了一个黑名单,把‘&&’字符和‘;’字符过滤掉了,但我们可以使用黑名单之外的命令连接符继续命令注入
使用‘&’命令连接符注入
在这里插入图片描述
命令:127.0.0.1 & dir
在这里插入图片描述

High

源码分析:发现还是一样的套路,也是过滤字符但过滤得更多了。但仔细观察发现有一个过滤是’| ‘,注意这个过滤是加了空格的,说明这个过滤其实是没用的,只需要’|’后面直接加入参数,不保留空格,我们依然可以用这个命令连接符进行命令注入
在这里插入图片描述
使用’|’连接符进行注入
命令:127.0.0.1 |dir
在这里插入图片描述

CSRF(跨站请求伪造)

Low

网站的本意是让我们在网站里更改密码
在这里插入图片描述
但是能够主要到当我们更改密码成功后url栏的参数是这样的
http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change#
可以分析出password_new是我输入的密码,password_conf是我确认的密码,说明我们在网站上输入的信息是会在url栏这里进行一个传输执行
在这里插入图片描述
抓个包看看,发现url栏的信息和请求的信息是一致的
在这里插入图片描述
那是不是说明如果我能控制url栏里传入的参数,就能够不在网站内执行更改密码的操作呢?
更改url的参数:
http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=456789&password_conf=456789&Change=Change#
只需要在原来的url基础上该新密码和确认密码的参数即可
在这里插入图片描述
在新标签内放入设置好的url,点击执行
在这里插入图片描述
页面跳转到了dvwa的更改密码界面,csrf攻击成功
在这里插入图片描述
网站的本意是在网站内更改密码,而我通过控制url的传参就能使我能在网站之外执行更改密码的操作,那么当我知道一个网站有csrf漏洞后也可以通过构造url的方式让别人点击执行他意想之外的行为

源码分析:源码中只对传入的密码和确认密码进行比较,两者一致则执行更改密码命令成功返回Password Change,不一致则返回Passwords did not match,没有任何过滤,所以能轻易执行csrf漏洞
在这里插入图片描述

Medium

源码分析:和Low等级比较发现,只有一处改变,即在传入密码和确认密码参数前先进行了一个if语句的判断,判断里面的内容主要是验证这个访问请求是否是从dwva网站本身发起的,若不是就不执行后面的操作
在这里插入图片描述
这里Medium级别的代码增加了referer的判断。这里的意思HTTP_REFERER和SERVER_NAME如果不是来自同一个域环境的话就无法进行到内部的循环,以及修改密码操作。
在这里插入图片描述
源码是通过referrer这个字段的参数进行判断的,通常情况下在增加referrer验证时就是网站本身当前页面的ip地址,我们通过抓包看看信息
在这里插入图片描述
Referer的值即网站的。
构造一个页面,里面放一个a标签,链接为更改密码的url,当受害者点击时就会触发更改密码的操作,我们只需要把这个html页面的位置放在和网站同一个目录下,即在自己的电脑上构造一个访问目标网站域名的html文件
这种情况就可以绕过,实现改密码。
    首先我们在攻击的时候一样的先在网页根目录的DVWA文件中放一个命名为“ip地址.html”,然后写入:
在这里插入图片描述
写好之后用IP地址命名,比如“192.168.1.70.html”然后放入网页根目录的DVWA文件中。
然后我们打开burp suite,对CSRF界面进行抓包,然后发送至Repeater地址改为http://攻击者服务器地址/dvwa/被攻击者IP地址.html格式,如下:
在这里插入图片描述
点击“Send”我们可以看见返回“Password Changed.”,证明修改成功,攻击成功。
在这里插入图片描述
 最后我们测试登录成功,证明攻击成功。

High

代码分析:
在这里插入图片描述
在这里插入图片描述
这次在Medium的基础上有了token值,所以我们需要在攻击者的服务器上获取被攻击者的token值。

CSRF攻击的本质是重要操作的所有参数,都可以被攻击者猜测到,所以token值是必须的。观察以下源码,这里是添加了Anti-CSRF token机制,用户每次到改密页面的时候,服务器会返回一个随机token,向服务器发起请求需要提交token参数,而在服务器收到请求的时候,会优先检查token,只有token正确才会处理客户端请求。 在这里插入图片描述
在观察得到以上的信息后,可以利用XSS,先用XSS执行代码获取token。“”。可以得到以下token信息:
在这里插入图片描述

- File Inclusion(文件包含)

Low

1.访问页面,显示allow_url_include 没有开启,我们可以在配置里面开启

allow_url_include参数表示可以远程利用文件包含漏洞
在这里插入图片描述
在这里插入图片描述
修改为On,并且重启服务

再次访问则没有此信息
在这里插入图片描述
2、通过访问1.php,2.php, 3.php会返回不通的内容,同时会将文件名传参给page参数
在这里插入图片描述
3、对page传参为http://127.0.0.1/1.php
在这里插入图片描述
在这里插入图片描述
成功解析

Medium

1、通过访问1.php,2.php, 3.php会返回不通的内容,同时会将文件名传参给page参数
在这里插入图片描述
2、对page传参为http://127.0.0.1/1.php
在这里插入图片描述
进行了报错
3、查看源码
在这里插入图片描述
如果传参值中有http:// https:// …/ …\都将替换为空

4、如果传入的是htthttp://p://127.0.0.1/123.php
在这里插入图片描述

High

1、直接看后端源代码
在这里插入图片描述
关键代码为 使用fnmatch()函数对page参数进行过滤,要求page必须以“file”开头,服务器才会包含相应的文件。
在这里插入图片描述
构造相应的payload:http://127.0.0.1/DVWA/vulnerabilities/fi/?page=file://D:\phpstudy_pro\WWW\123.php
2、可利用file协议进行读文件变成“file://[绝对路径]”的格式进行攻击,得到相应的phpinfo。

File Upload(文件上传)

Low

首先我们准备一个一句话木马文件
在这里插入图片描述
1、访问页面有一个文件上传点
在这里插入图片描述
2、直接上传123.php
在这里插入图片描述
3、访问文件。
在这里插入图片描述
在这里插入图片描述

Medium

1.分析代码:
在这里插入图片描述
对文件上传的类型做了大小限制,要求必须是image/jpeg或者image/png类型的。
2.直接上传123.php文件
修改为456.php避免冲突,然后进行抓包的操作,得到下面这个包进行修改就可以了。
在这里插入图片描述
将红色部分修改为image/jpeg。
这里显示成功了,就说明上传成功
在这里插入图片描述
在这里插入图片描述

High

代码分析;
在这里插入图片描述
可以看见这里又添加一个getimagesize(string filename)函数,它会通过读取文件头,返回图片的长、宽等信息,如果没有相关图片文件头,函数会报错。这里读取的文件名中最后一个“.”后的字符串,期望通过文件名来限制文件类型,因此要求文件名形式必须是“.jpg”“.jpeg”“.png”之一。同时,getimagesize函数更像是限制了上传文件的文件头必须为图像类型。
  首先新建一个文件夹,将准备好的一句话木马和图片放入文件夹,在路径栏目输入“CMD”打开此文件夹的CMD命令窗口。
在这里插入图片描述
输入如下指令“copy [一句话木马名称]/b+[图片名称]/a [新图片名称]”,显示如下即为成功。
在这里插入图片描述
上传显示如下即为成功上传,我们得到路径“…/…/hackable/uploads/111.jpg”,访问路径,得到如下的图片。
在这里插入图片描述
获取111.jpg的链接地址
在这里插入图片描述4、使用文件包含漏洞模块中的low关, 进行加载图片,成功解析

Insecure CAPTCHA (不安全的验证码)

Low

在这里插入图片描述
查看源码
可以看到,服务器将改密操作分成了两步,第一步检查用户输入的验证码,验证通过后,服务器返回表单,第二步客户端提交post请求,服务器完成更改密码的操作。但是,这其中存在明显的逻辑漏洞,服务器仅仅通过检查Change、step 参数来判断用户是否已经输入了正确的验证码。
漏洞利用
输入密码
在这里插入图片描述
抓包查看,将step的值改为2后再次发送即可校验通过,
在这里插入图片描述
密码修改成功
在这里插入图片描述

Medium

代码分析:
 我们可以看出基于Low级别,在第二步增加了第一步是否通过的验证,即判断参数passed_captcha是否为真。Passed_captcha参数是通过POST提交的,整个请求也就是POST请求,故可以人为加上此参数。
 接下来我们开始攻击,一共也是分两步,但是不同于Low,我们这次使用Burpsuite开始修改报文,将步骤直接调整到第二步,第二步的验证伪造为已验证。然后我们直接加入passed_captcha参数,混入POST参数提交。将“step=1”改为“step=2”,然后加上“&passed_capcha=true”即可。
在这里插入图片描述
放包以后,我们可以观察到页面显示“Password Change”成功即是完成。
在这里插入图片描述

High

代码分析:
High级别将验证流程合并,通过连续的判断将两个步骤相同的部分合并,避免第一步验证的直接改参绕过。加入了token机制,有效防止了CSRF漏洞攻击,下面不再做攻击页面。

我们开始攻击,看到了后端代码发现了,及时不验证也有机会绕过验证,于是针对g-recaptcha-response和HTTP_USER_AGENT操作。

同样不验证,直接提交请求对相关参数进行抓包修改。修改参数 $_POST[ ‘g-recaptcha-response’ ] == ‘hidd3n_valu3’ $_SERVER[ ‘HTTP_USER_AGENT’ == ‘reCAPTCHA’
在这里插入图片描述
修改成功。
在这里插入图片描述

SQL Injection(SQL注入)

通过把恶意的sql命令插入web表单递交给服务器,或者输入域名或页面请求的查询字符串递交到服务器,达到欺骗服务器,让服务器执行这些恶意的sql命令,从而让攻击者,可以绕过一些机制,达到直接访问数据库的一种攻击手段。

SQL注入(SQLi)是一种注入攻击,可以执行恶意SQL语句。它通过将任意SQL代码插入数据库查询,使攻击者能够完全控制Web应用程序后面的数据库服务器。攻击者可以使用SQL注入漏洞绕过应用程序安全措施;可以绕过网页或Web应用程序的身份验证和授权,并检索整个SQL数据库的内容;还可以使用SQL注入来添加,修改和删除数据库中的记录。

6.1 SQL注入分类
1.数字型注入
2.字符型注入
3.报错注入
4.Boollean注入
5.时间注入
6.2 SQL注入思路
1.判断是否存在注入,注入是字符型还是数字型
2.猜解SQL查询语句中的字段数
3.确定回显位置
4.获取当前数据库
5.获取数据库中的表
6.获取表中的字段名
7.得到数据
6.3 SQL注入绕过方法
1.注释符号绕过
2.大小写绕过
3.内联注释绕过
4.特殊编码绕过
5.空格过滤绕过
6.过滤or and xor not 绕过
前面我写的文章就有提到sql注入

Low

1.查看源码:
2.判断注入类型,是数字型注入,还是字符型注入。字符型和数字型最大的一个区别在于,数字型不需要单引号来闭合,而字符串一般需要通过单引号来闭合的。前面我的文章提到具体方法这里就不具体介绍了。
经判断存在注入且为单引号闭合且字段数为2。
在这里插入图片描述
即成功。
在这里插入图片描述

Medium

代码分析:
在这里插入图片描述
使用POST提交方式,还使用了转义预防SQL注入。

我们开始攻击,首先我们打开BP进行截包,得到如下的数据包。并将其发送到“Repeater”,方便接下来的注入回显操作。
在这里插入图片描述
  我们同样利用“1 and 1=1”和“1 and 1=2”来判断,是否这里为注入点,观察两者的有差异且页面未报错,就说明这里是注入点。
  在这里插入图片描述
  这里我们可以看到,同样是在“3”的时候,我们这里用“order by 3”查询返回报错,所以我们这里判断前面只查询两列。利用语句“1 union select 1,2#”来进行验证,返回正确,验证成功。
在这里插入图片描述
在这里插入图片描述
此时同样判断完列数后,我们同时对版本和数据库名称进行查询,利用语句“1 union select database(),version()#”。此时观察回显,发现同时回显了数据库名称和数据库版本dvwa和5.7.26。
在这里插入图片描述
在查询完数据库后,我们先查询表名,然后查询列名,利用语句1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#
在这里插入图片描述
此处发现是对单引号进行了转义。所以我们将单引号连同users一起写为16进制表示为“0x75736572”。利用语句1 union select 1,group_concat(column_name)from information_schema.columns where table_schema=database() and table_schema=0x75736572#得到关键列名“user”和“password”。
在这里插入图片描述
最后我们利用,1 union select user,password from users#得到结果。
在这里插入图片描述

High

代码分析:
在这里插入图片描述
使用了session 获取id 值,闭合方式单引号闭合。
虽然用了session来获取id值,但是同样也是数字型注入,利用同样的方法,然后最后用“-1’ union select user,password from users#”,即可得到答案。
在这里插入图片描述

SQL Injection(Blind)(SQL盲注)

Low

1.判断注入类型
输入1,显示存在
在这里插入图片描述
输入1 and 1=1,显示存在
在这里插入图片描述
输入1 and 1=2,也显示存在,由此说明不是数字型注入
在这里插入图片描述
输入1’ and 1=1#,显示存在
在这里插入图片描述
输入1’ and 1=3#,显示不存在,由此发现应该是字符型漏洞
在这里插入图片描述
输入1" and 1=1#,显示存在
在这里插入图片描述
输入1" and 1=3#,也显示存在,说明不是双引号注入
在这里插入图片描述
只有真假两种情况下回显不一样才能判别。

综上可以看出是字符串单引号注入
2.确定数据库名字的长度
在这里插入图片描述
3.确定数据库名字
ASCII查询对照表

(猜测数据库名的第一个字符ASCII的取值范围由于是DVWA靶场,所以合理猜测数据库名为dvwa(如果是其他场景下,需要不断修改数值,缩小取值范围,最终确定一个取值)
在这里插入图片描述
综上,数据库的名字可以确定为dvwa。
4.确定dvwa数据库中表的数量
在这里插入图片描述
5.确定dvwa数据库中表名的长度
输入语句分布解析:

1.查询列出当前连接数据库下的所有表名称
select table_name from information_schema.tables where table_schema=database()

2.列出当前连接数据库中的第1个表名称
select table_name from information_schema.tables where table_schema=database() limit 0,1
PS:limit 结果编号(从0开始),返回结果数量

3.计算当前连接数据库第1个表名的字符串长度值
length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))

4.将当前连接数据库第1个表名称长度与某个值比较作为判断条件,联合and逻辑构造特定的sql语句进行查询,根据查询返回结果猜解表名称的长度值
1’ and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))>10 #
在这里插入图片描述
同理可以对第二个表的长度进行猜测:
在这里插入图片描述
6.确定dvwa数据库中表的名字
与确定数据库名字类似,用到ascii()和substr()两个函数。
substr(str,1,1):从str的第一个字符开始,截取长度1 == 取str的第一个字符
limit 0,1:0-查询结果的第一个;1-返回一条查询结果。 eg: limit 3,5 就是返回第4-8条数据。
在这里插入图片描述
7.确定users表中的字段数目
在这里插入图片描述
8.确定users表中的8个字段长度
在这里插入图片描述
同理可以获取其他7个字段的长度
9.确定users表中的8个字段名字
由于表中的字段数目比较多,长度比较长,如果采用之前的按字符猜测,会很耗时间。根据我们的需要,判断users表中是否含有用户名和密码字段即可。

根据经验猜测用户名和密码的字段名字如下:

用户名:username/user_name/uname/u_name/user/…

密码:password/pass_word/pwd/pass/…

猜用户名
1’ and (select count() from information_schema.columns where table_schema=database() and table_name=‘users’ and column_name=‘username’)=1 #
显示不存在,更换字段名再尝试,发现user显示存在
猜密码
1’ and (select count(
) from information_schema.columns where table_schema=database() and table_name=‘users’ and column_name=‘password’)=1 #
显示存在
综上可知,users表中的用户名和密码字段分别为user和password。
10.获取user和password的字段值
password在存储的时候进行了MD5加密。
同样先进行猜测碰撞,如果不行再逐个筛选。
1’ and (select count() from users where user=‘admin’)=1 #
显示存在
1’ and (select count(
) from users where user=‘admin’ and password=‘5f4dcc3b5aa765d61d8327deb882cf99’)=1 #
显示存在
综上可知一组用户名-密码:admin-password。

Medium

在这里插入图片描述
流程和上一个SQL差不多,不过多赘述了,基本上就是Low的步骤然后在BP中截包修改,然后放到repeater中发送。
注入类型是整数型:1 and 1=1 #

High

代码分析:
在这里插入图片描述
可以看到,High级别的代码利用cookie传递参数id,当SQL查询结果为空时,会执行函数sleep(seconds),目的是为了扰乱基于时间的盲注。同时在SQL查询语句中添加了LIMIT1,希望以此控制只输出一个结果。
  虽然添加了LIMIT1,但是我们可以通过#将其注释掉。但由于服务器端执行sleep函数,会使得基于时间盲注的准确性受到影响,这里用上面两种方法任意一种即可进行爆破。这里就不再一一说明步骤了。
使用字符型注入:1’ and 1=1 #
同样使用上面的代码

  • 30
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值