新手指南:新手指南:DVWA-1.9全级别教程之全级别教程之Brute Force
来源:新手指南:DVWA-1.9全级别教程之Brute Force
目前,最新的目前,最新的 DVWA已经更新到已经更新到1.9版本(版本(http://www.dvwa.co.uk/),而网上的教程大多停留在旧版本,且没有针对),而网上的教程大多停留在旧版本,且没有针对 DVWA high级别的教程,因此级别的教程,因此
萌发了一个撰写新手教程的想法,错误的地方还请大家指正。萌发了一个撰写新手教程的想法,错误的地方还请大家指正。
DVWA简介简介
DVWA((Damn Vulnerable Web Application)是一个用来进行安全脆弱性鉴定的)是一个用来进行安全脆弱性鉴定的PHP/MySQL Web应用,旨在为安全专业人员测试自己的专业技应用,旨在为安全专业人员测试自己的专业技
能和工具提供合法的环境,帮助能和工具提供合法的环境,帮助web开发者更好的理解开发者更好的理解web应用安全防范的过程。应用安全防范的过程。
DVWA共有十个模块,分别是Brute Force(暴力(破解))、Command Injection(命令行注入)、CSRF(跨站请求伪造)、File Inclusion(文件包含)、
File Upload(文件上传)、Insecure CAPTCHA(不安全的验证码)、SQL Injection(SQL注入)、SQL Injection(Blind)(SQL盲注)、
XSS(Reflected)(反射型跨站脚本)、XSS(Stored)(存储型跨站脚本)。
需要注意的是,DVWA 1.9的代码分为四种安全级别:Low,Medium,High,Impossible。初学者可以通过比较四种级别的代码,接触到一些PHP代码审计的
内容。
DVWA的搭建的搭建
Freebuf上的这篇文章《新手指南:手把手教你如何搭建自己的渗透测试环境》(http://www.freebuf.com/sectool/102661.html)已经写得非常好了,在这里
就不赘述了。
本文介绍Brute Force模块的相关内容,后续教程会在之后的文章中给出。
Brute Force
Brute Force,即暴力(破解),是指黑客利用密码字典,使用穷举法猜解出用户口令,是现在最为广泛使用的攻击手法之一,如2014年轰动全国的
12306“撞库”事件,实质就是暴力破解攻击。
下面将对四种级别的代码进行分析。下面将对四种级别的代码进行分析。
Low
服务器端核心代码
<?php
if(isset($_GET['Login'])){
//Getusername
$user=$_GET['username'];
//Getpassword
$pass=$_GET['password'];
$pass=md5($pass);
//Checkthedatabase
$query="SELECT*FROM`users`WHEREuser='$user'ANDpassword='$pass';";
$result=mysql_query($query)ordie('<pre>'.mysql_error().'</pre>');
if($result&&mysql_num_rows($result)==1){
//Getusersdetails
$avatar=mysql_result($result,0,"avatar");
//Loginsuccessful
echo"<p>Welcometothepasswordprotectedarea{$user}</p>";
echo"<imgsrc="{$avatar}"/>";
}
else{
//Loginfailed
echo"<pre><br/>Usernameand/orpasswordincorrect.</pre>";
}
mysql_close();
}
?>
可以看到,服务器只是验证了参数Login是否被设置(isset函数在php中用来检测变量是否设置,该函数返回的是布尔类型的值,即true/false),没有任何的
防爆破机制,且对参数username、password没有做任何过滤,存在明显的sql注入漏洞。
漏洞利用漏洞利用
方法一爆破利用方法一爆破利用 burpsuite即可完成即可完成
第一步抓包
第二步,ctrl+I将包复制到intruder模块,因为要对password参数进行爆破,所以在password参数的内容两边加$
第三步选中Payloads,载入字典,点击Start attack进行爆破
图片3.png
最后,尝试在爆破结果中找到正确的密码,可以看到password的响应包长度(length)“与众不同”,可推测password为正确密码,手工验证登陆成功。
方法二手工方法二手工 sql注入注入
1. Username:admin’ or ’1′=’1
Password:(空)
注入成功
2. Username :admin’ #
Password :(空)
注入成功
Medium
服务器端核心代码
<?php
if(isset($_GET['Login'])){
//Sanitiseusernameinput
$user=$_GET['username'];
$user=mysql_real_escape_string($user);
//Sanitisepasswordinput
$pass=$_GET['password'];
$pass=mysql_real_escape_string($pass);
$pass=md5($pass);
//Checkthedatabase
$query="SELECT*FROM`users`WHEREuser='$user'ANDpassword='$pass';";
$result=mysql_query($query)ordie('<pre>'.mysql_error().'</pre>');
if($result&&mysql_num_rows($result)==1){
//Getusersdetails
$avatar=mysql_result($result,0,"avatar");
//Loginsuccessful
echo"<p>Welcometothepasswordprotectedarea{$user}</p>";
echo"<imgsrc="{$avatar}"/>";
}
else{
//Loginfailed
sleep(2);
echo"<pre><br/>Usernameand/orpasswordincorrect.</pre>";
}
mysql_close();
}
?>
相比Low级别的代码,Medium级别的代码主要增加了mysql_real_escape_string函数,这个函数会对字符串中的特殊符号(x00,n,r,,’,”,x1a)进行
转义,基本上能够抵御sql注入攻击,说基本上是因为查到说 MySQL5.5.37以下版本如果设置编码为GBK,能够构造编码绕过mysql_real_escape_string 对
单引号的转义(因实验环境的MySQL版本较新,所以并未做相应验证);同时,$pass做了MD5校验,杜绝了通过参数password进行sql注入的可能性。但
是,依然没有加入有效的防爆破机制(sleep(2)实在算不上)。
具体的mysql_real_escape_string函数绕过问题详见
http://blog.csdn.net/hornedreaper1988/article/details/43520257
http://www.cnblogs.com/Safe3/archive/2008/08/22/1274095.html
漏洞利用漏洞利用
虽然sql注入不再有效,但依然可以使用Burpsuite进行爆破,与Low级别的爆破方法基本一样,这里就不赘述了。
High
服务器端核心代码
<?php
if(isset($_GET['Login'])){
//CheckAnti-CSRFtoken
checkToken($_REQUEST['user_token'],$_SESSION['session_token'],'index.php');
//Sanitiseusernameinput
$user=$_GET['username'];
$user=stripslashes($user);
$user=mysql_real_escape_string($user);
//Sanitisepasswordinput
$pass=$_GET['password'];
$pass=stripslashes($pass);
$pass=mysql_real_escape_string($pass);
$pass=md5($pass);