您当前的位置:首页 > 电脑百科 > 安全防护 > 软件工具

「黑客工具」Web渗透测试-DVWA的暴力破解操作

时间:2019-10-16 11:14:46  来源:  作者:

简述

暴力破解(Brute Force)的意思是攻击者借助计算机的高速计算不停枚举所有可能的用户名和密码,直到尝试出正确的组合,成功登录系统。理论上,只要字典足够大,破解总是会成功的。阻止暴力破解的最有效方式是设置复杂的密码(英文字母大小写、数字、符号混合)。而如果你的字典是从某网站泄露出来的,你使用它试图登陆其他网站,就便是撞库。撞库攻击的成功率高于暴力破解,因为你在A网站的用户名、密码通常和B网站的用户名、密码一致。例如:12306铁道部购票网站曾在2014年底发生过撞库攻击。

DVWA提供以下四种安全级别:Low、Medium、High、Impossible。

Low级别

首先,我们将安全级别设置为Low进行破解,选择左侧DVWA Security选项,下拉框选Low并提交,然后选择Brute Force。

「黑客工具」Web渗透测试-DVWA的暴力破解操作

 

方法一:使用Burp Suite暴力破解

1.浏览器设置代理,地址127.0.0.1,端口8080;

「黑客工具」Web渗透测试-DVWA的暴力破解操作

 

2.启动Burp Suite软件,在Proxy选项卡下选择Options,监听127.0.0.1:8080;

「黑客工具」Web渗透测试-DVWA的暴力破解操作

 

3.在Proxy选项卡下的Intercept中开启intercept(拦截数据包);

4.随后在DVWA中输入用户名和密码,假设已知用户名是admin,密码未知(随意填写),点击登录;

5.在Burp Suite中得到请求代码,全选按Ctrl+I或者点击鼠标右键Send to Intruder。

「黑客工具」Web渗透测试-DVWA的暴力破解操作

 

6.切换到Intruder选项卡,选择Positions,点击右侧Clear,然后选中密码123456,点击Add,结果如图。

「黑客工具」Web渗透测试-DVWA的暴力破解操作

 

7.点击Payloads,在Payload set中选择第几个需要暴力破解的参数,我们这里只有一个,在下面选择Load加载字典文件(*.txt格式),然后点击Start attack;

「黑客工具」Web渗透测试-DVWA的暴力破解操作

 

8.我们可以看到密码password的返回长度和其他不一样,证明password就是正确密码;

「黑客工具」Web渗透测试-DVWA的暴力破解操作

 

方法二:SQL注入漏洞

查看php代码;

<?php 
 
if( isset( $_GET[ 'Login' ] ) ) { 
 // Get username 
 $user = $_GET[ 'username' ]; 
 
 // Get password 
 $pass = $_GET[ 'password' ]; 
 $pass = md5( $pass ); 
 
 // 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>' );
 
 if( $result && mysqli_num_rows( $result ) == 1 ) { 
 // Get users details 
 $row = mysqli_fetch_assoc( $result ); 
 $avatar = $row["avatar"]; 
 
 // Login successful 
 echo "<p>Welcome to the password protected area {$user}</p>"; 
 echo "<img src="{$avatar}" />"; 
 } 
 else { 
 // Login failed 
 echo "<pre><br />Username and/or password incorrect.</pre>"; 
 } 
 
 ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res); 
} 
 
?>

代码审计可以发现,没有对username和password进行过滤,存在SQL注入漏洞:

$query = "SELECT * FROM `users` WHERE user = '$user' AND password ='$pass';";

比如在Username中输入admin' #或者admin' or '1'='1等都可以登录。

Medium级别

代码如下;

<?php 
 
if( isset( $_GET[ 'Login' ] ) ) { 
 // Sanitise username input 
 $user = $_GET[ 'username' ]; 
 $user = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $user ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : "")); 
 
 // Sanitise password input 
 $pass = $_GET[ 'password' ]; 
 $pass = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : "")); 
 $pass = md5( $pass ); 
 
 // 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>' );
 
 if( $result && mysqli_num_rows( $result ) == 1 ) { 
 // Get users details 
 $row = mysqli_fetch_assoc( $result ); 
 $avatar = $row["avatar"]; 
 
 // Login successful 
 echo "<p>Welcome to the password protected area {$user}</p>"; 
 echo "<img src="{$avatar}" />"; 
 } 
 else { 
 // Login failed 
 sleep( 2 ); 
 echo "<pre><br />Username and/or password incorrect.</pre>"; 
 } 
 
 ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res); 
} 
 
?>

mysqli_real_escape_string()会将转义特殊字符,一定程度上防止SQL注入。但是它也有漏洞,在MySQL5.5.37以下版本有绕过方法。sleep(2)降低了暴力破解速度,嗯,但是没有从根源上防住爆破呀!因此,破解方法同Low级别。

High级别

代码如下;

<?php 
 
if( isset( $_GET[ 'Login' ] ) ) { 
 // Check Anti-CSRF token 
 checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' ); 
 
 // Sanitise username input 
 $user = $_GET[ 'username' ]; 
 $user = stripslashes( $user ); 
 $user = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $user ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : "")); 
 
 // Sanitise password input 
 $pass = $_GET[ 'password' ]; 
 $pass = stripslashes( $pass ); 
 $pass = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : "")); 
 $pass = md5( $pass ); 
 
 // Check 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>' );
 
 if( $result && mysqli_num_rows( $result ) == 1 ) { 
 // Get users details 
 $row = mysqli_fetch_assoc( $result ); 
 $avatar = $row["avatar"]; 
 
 // Login successful 
 echo "<p>Welcome to the password protected area {$user}</p>"; 
 echo "<img src="{$avatar}" />"; 
 } 
 else { 
 // Login failed 
 sleep( rand( 0, 3 ) ); 
 echo "<pre><br />Username and/or password incorrect.</pre>"; 
 } 
 
 ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res); 
} 
 
// Generate Anti-CSRF token 
generateSessionToken(); 
 
?>

代码中加入了user_token,每次提交需要将username、password、Login和user_token四个参数一起提交到后台,因此要想解决每次变化的user_token需要每次重新获取,破解难度提升,需要编码解决。

Impossible级别

代码如下;

<?php 
 
if( isset( $_POST[ 'Login' ] ) ) { 
 // Check Anti-CSRF token 
 checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' ); 
 
 // Sanitise username input 
 $user = $_POST[ 'username' ]; 
 $user = stripslashes( $user ); 
 $user = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $user ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : "")); 
 
 // Sanitise password input 
 $pass = $_POST[ 'password' ]; 
 $pass = stripslashes( $pass ); 
 $pass = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : "")); 
 $pass = md5( $pass ); 
 
 // Default values 
 $total_failed_login = 3; 
 $lockout_time = 15; 
 $account_locked = false; 
 
 // Check the database (Check user information) 
 $data = $db->prepare( 'SELECT failed_login, last_login FROM users WHERE user = (:user) LIMIT 1;' ); 
 $data->bindParam( ':user', $user, PDO::PARAM_STR ); 
 $data->execute(); 
 $row = $data->fetch(); 
 
 // Check to see if the user has been locked out. 
 if( ( $data->rowCount() == 1 ) && ( $row[ 'failed_login' ] >= $total_failed_login ) ) { 
 // User locked out. Note, using this method would allow for user enumeration! 
 //echo "<pre><br />This account has been locked due to too many incorrect logins.</pre>"; 
 
 // Calculate when the user would be allowed to login again 
 $last_login = strtotime( $row[ 'last_login' ] ); 
 $timeout = $last_login + ($lockout_time * 60); 
 $timenow = time(); 
 
 /* 
 print "The last login was: " . date ("h:i:s", $last_login) . "<br />"; 
 print "The timenow is: " . date ("h:i:s", $timenow) . "<br />"; 
 print "The timeout is: " . date ("h:i:s", $timeout) . "<br />"; 
 */ 
 
 // Check to see if enough time has passed, if it hasn't locked the account 
 if( $timenow < $timeout ) { 
 $account_locked = true; 
 // print "The account is locked<br />"; 
 } 
 } 
 
 // Check the database (if username matches the password) 
 $data = $db->prepare( 'SELECT * FROM users WHERE user = (:user) AND password = (:password) LIMIT 1;' ); 
 $data->bindParam( ':user', $user, PDO::PARAM_STR); 
 $data->bindParam( ':password', $pass, PDO::PARAM_STR ); 
 $data->execute(); 
 $row = $data->fetch(); 
 
 // If its a valid login... 
 if( ( $data->rowCount() == 1 ) && ( $account_locked == false ) ) { 
 // Get users details 
 $avatar = $row[ 'avatar' ]; 
 $failed_login = $row[ 'failed_login' ]; 
 $last_login = $row[ 'last_login' ]; 
 
 // Login successful 
 echo "<p>Welcome to the password protected area <em>{$user}</em></p>"; 
 echo "<img src="{$avatar}" />"; 
 
 // Had the account been locked out since last login? 
 if( $failed_login >= $total_failed_login ) { 
 echo "<p><em>Warning</em>: Someone might of been brute forcing your account.</p>"; 
 echo "<p>Number of login attempts: <em>{$failed_login}</em>.<br />Last login attempt was at: <em>${last_login}</em>.</p>"; 
 } 
 
 // Reset bad login count 
 $data = $db->prepare( 'UPDATE users SET failed_login = "0" WHERE user = (:user) LIMIT 1;' ); 
 $data->bindParam( ':user', $user, PDO::PARAM_STR ); 
 $data->execute(); 
 } else { 
 // Login failed 
 sleep( rand( 2, 4 ) ); 
 
 // Give the user some feedback 
 echo "<pre><br />Username and/or password incorrect.<br /><br/>Alternative, the account has been locked because of too many failed logins.<br />If this is the case, <em>please try again in {$lockout_time} minutes</em>.</pre>"; 
 
 // Update bad login count 
 $data = $db->prepare( 'UPDATE users SET failed_login = (failed_login + 1) WHERE user = (:user) LIMIT 1;' ); 
 $data->bindParam( ':user', $user, PDO::PARAM_STR ); 
 $data->execute(); 
 } 
 
 // Set the last login time 
 $data = $db->prepare( 'UPDATE users SET last_login = now() WHERE user = (:user) LIMIT 1;' ); 
 $data->bindParam( ':user', $user, PDO::PARAM_STR ); 
 $data->execute(); 
} 
 
// Generate Anti-CSRF token 
generateSessionToken(); 
 
?>

当输入错误3次,锁定15分钟的可靠方式防止了爆破,同时采用PDO(PHP Data Object,PHP数据对象)机制更为安全,不会在本地对SQL进行拼接。当调用prepare()时,将SQL模板传给MySQL Server,传过去的是占位符“?”,不包含用户数据,当调用execute()时,用户的变量值才传递到MySQL Server,分开传递,阻止了SQL语句被破坏而执行恶意代码。

转自:https://blog.csdn.net/lujie_1996/article/details/79054656



Tags:DVWA   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
在kali的里面随机找一张png结尾的图片,然后重命名一下改成1.php%00.png。 改成这样的名字!! 然后用编辑器编辑一下! 在空白处写入一句话木马!!<%php @eval($_POST[pass]);?>像这样...【详细内容】
2019-12-23  Tags: DVWA  点击:(116)  评论:(0)  加入收藏
简述暴力破解(Brute Force)的意思是攻击者借助计算机的高速计算不停枚举所有可能的用户名和密码,直到尝试出正确的组合,成功登录系统。理论上,只要字典足够大,破解总是会成功的。...【详细内容】
2019-10-16  Tags: DVWA  点击:(2327)  评论:(0)  加入收藏
黑客渗透攻击必备环境DVWA简介及搭建dVWA简介DVWA(Damn Vulnerable Web App)是一个基于PHP/MySql搭建的Web应用程序,旨在为安全专业人员测试自己的专业技能和工具提供合法的 环...【详细内容】
2019-08-06  Tags: DVWA  点击:(392)  评论:(0)  加入收藏
▌简易百科推荐
已经观察到一种新的基于JavaScript的远程访问木马(RAT)利用社会工程学传播,采用隐蔽的"无文件"技术作为其逃避检测和分析的方法。该恶意软件由Prevalyion的对抗性反情报团队(PA...【详细内容】
2021-12-17  网安老葫    Tags:恶意软件   点击:(13)  评论:(0)  加入收藏
关于windows Defender防病毒的问题升级win10后,我们会经常遇到打开或下载文件时弹出提示框提示你下载的文件是病毒之类,直接给你删除。你好不容易找了个激活工具,你刚打开发现...【详细内容】
2021-11-08  IT小哥吧    Tags:defender   点击:(47)  评论:(0)  加入收藏
喽!大家好,我是小易,欢迎来到我的知识分享站!今天给大家分享5个杀毒神器,让你的电脑干干净净,建议收藏起来哟! 1、Windows Defender随着Win10系统的更新已经日趋完善,它可以很好的解...【详细内容】
2021-11-08  知识与技能    Tags:流氓软件   点击:(74)  评论:(0)  加入收藏
介绍其实Iptables服务不是真正的防火墙,只是用来定义防火墙规则功能的"防火墙管理工具",将定义好的规则交由内核中的netfilter即网络过滤器来读取,从而真正实现防火墙功能。fil...【详细内容】
2021-10-18  互联网IT技术全栈    Tags:   点击:(52)  评论:(0)  加入收藏
什么是Nessus?Nessus 是目前全世界最多人使用的系统漏洞扫描与分析软件。总共有超过75,000个机构使用Nessus 作为扫描该机构电脑系统的软件步骤如下:查看当前kali系统内核版本...【详细内容】
2021-09-09  TestGO    Tags:Nessus   点击:(112)  评论:(0)  加入收藏
http 头部信息http头部信息经常包含着主机服务的一些版本信息,经常使用的字段信息有:Server, X-Powered-By, X-AspNet-Version工具可采用curl进行curl --location --head $URL...【详细内容】
2021-08-19  80后IT老民工    Tags:渗透   点击:(227)  评论:(0)  加入收藏
一、杀软常见的三种方式二、免杀的三种常用方式三、利用工具实现免杀1、veil工具基础实现免杀+进阶2、venom免杀3、利用kali自带的shellter进行免杀4、利用avet实现免杀四、...【详细内容】
2021-08-18  白帽hacker淬炼    Tags:免杀   点击:(82)  评论:(0)  加入收藏
关于工具现有工具现在,现成的污点分析工具已经有很多了。其中,我最感兴趣的是Triton和bincat,因为两者已经相当成熟。然而,我们却无法使用这两种工具,因为它们不支持目标设备所...【详细内容】
2021-08-12  Hbo涵    Tags:安全漏洞   点击:(94)  评论:(0)  加入收藏
从实现原理上分,防火墙的技术包括四大类:网络级防火墙、应用级网关、电路级网关和规则检查防火墙。1、网络级防火墙一般是基于源地址和目的地址、应用、协议以及每个IP包的端...【详细内容】
2021-07-20  趣谈文化  搜狐号  Tags:防火墙   点击:(225)  评论:(0)  加入收藏
一、VMware部分1、Vmware简介虚拟机就是一个用来模拟真实的物理机环境的一个软件,可以在虚拟机中安装不同版本的操作系统。就是一个把下载好的ISO安装在物理机操作系统的一个...【详细内容】
2021-07-12  Kali与编程  公众号  Tags:Kali Linux   点击:(113)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条