DVWA-Brute Force

news/2024/10/17 16:23:19/

关于

密码破解是从计算机系统中存储或传输的数据中恢复密码的过程。一种常见的方法是反复尝试猜测密码。

用户通常选择弱密码。不安全选择的示例包括在字典中找到的单个单词、姓氏、任何太短的密码(通常被认为少于 6 或 7 个字符)或可预测的模式(例如交替的元音和辅音,这被称为 leetspeak,因此“密码" 变成 "p@55w0rd")。

创建针对目标生成的目标词表通常会提供最高的成功率。有一些公共工具可以根据公司网站、个人社交网络和其他常见信息(如生日或毕业年份)的组合创建字典。

最后的手段是尝试所有可能的密码,这被称为暴力攻击。理论上,如果尝试次数没有限制,那么暴力攻击总是会成功,因为可接受密码的规则必须是公开的;但是随着密码长度的增加,可能的密码数量也会增加,从而使攻击时间更长。


客观的

你的目标是通过暴力破解获得管理员的密码。获得其他四个用户密码的奖励积分!


低级

开发人员完全错过了任何保护方法,允许任何人尝试任意多次,登录任何用户而不会产生任何影响。


<?phpif( 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 successfulecho "<p>Welcome to the password protected area {$user}</p>";echo "<img src=\"{$avatar}\" />";}else {// Login failedecho "<pre><br />Username and/or password incorrect.</pre>";}((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}?>

在这个代码片段中,我们尝试使用 username 和 password 来进行登录,并从数据库中查询相关信息以验证登录是否成功。然后,如果成功,我们会显示用户的头像和欢迎信息。

该代码还存在以下安全问题:

1. 使用 GET 请求方法,这将暴露用户凭据,因为所有请求参数都在 URL 里面可见。

2. 存储密码的 MD5 散列值,这是一种不安全的加密方式,因为有大量的彩虹表可用于查找散列值的明文密码。

3. SQL 注入攻击。使用字符串插值来创建 SQL 查询(在 username 和 password 中),从而使得应用程序易受攻击 。

为了解决这些问题,我们需要对代码进行改进:

1. 使用 POST 请求方法来隐藏敏感数据,例如密码。

2. 不直接存储密码的散列值,而是添加一个随机的“salt”值,这个值在存储的密码和待验证的密码中都使用。这种散列技术被称为“加盐散列”。

3. 对输入变量进行验证和过滤,以防止SQL注入攻击。一个好的方法是使用准备好的语句与参数化查询。

4. 为防止跨站点脚本攻击(XSS),我们需要对输出进行适当的转义和处理。

在实现这些改进后,可以大大提高应用程序的安全性,并帮助保护用户账户免受攻击的影响。

 

中级

此阶段在失败的登录屏幕上添加睡眠。这意味着当您错误登录时,在页面可见之前将额外等待两秒钟。

这只会减慢一分钟内可以处理的请求数量,从而延长暴力破解的时间。

<?phpif( 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 successfulecho "<p>Welcome to the password protected area {$user}</p>";echo "<img src=\"{$avatar}\" />";}else {// Login failedsleep( 2 );echo "<pre><br />Username and/or password incorrect.</pre>";}((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}?>

在这一更新后的代码中,我们添加了以下改进以提高安全性:

1. 对输入进行了验证和过滤,使用 mysqli_real_escape_string() 函数来避免SQL注入攻击。

2. 在密码存储之前,我们添加了一个随机的盐值,这种加盐散列方法更加安全。

3. 对于失败的登录尝试,我们添加了一个延迟以减缓暴力攻击。

注意,这仍然是一个简化示例,如果要构建一个正式的登录系统,需要采取其他额外的防御措施,例如使用 HTTPS 连接以加密通信,使用自动锁定账户等,并且应该遵循最佳安全实践以便构建更为健壮的系统。

高水平

使用了“反跨站点请求伪造 (CSRF) 令牌”。有一个古老的神话,认为这种保护将阻止暴力攻击。不是这种情况。此级别还扩展到中等级别,通过在登录失败时等待,但这次是 2 到 4 秒之间的随机时间。这样做的想法是试图混淆任何时序预测。

使用CAPTCHA表单可能会产生与 CSRF 令牌类似的效果。

<?phpif( isset( $_GET[ 'Login' ] ) ) {// Check Anti-CSRF tokencheckToken( $_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 successfulecho "<p>Welcome to the password protected area {$user}</p>";echo "<img src=\"{$avatar}\" />";}else {// Login failedsleep( 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();?>

在这个更新后的代码中,我们进一步增强了安全性,并增加了反跨站点请求伪造(CSRF)保护措施。具体而言,该代码中增加了以下改进:

1. 添加了一个名为 "checkToken()" 的函数,用于检查反CSRF令牌以确保请求是由该网站上某个页面的正常表单提交而不是篡改请求信息的攻击者发出的。这个函数需要在每个需要进行保护的表单处理程序中调用,例如这里的登录处理程序。

2. 添加了一个会话令牌,可以避免CSRF攻击。每次在页面上加载时都会生成一个会话令牌,并将其存储在会话变量中。在处理提交的表单时,该会话令牌将与表单提交的CSRF令牌进行比较,以验证请求的合法性。

3. 使用类似于 sleep(rand(0,3)) 的代码模式可以在登录失败的情况下添加随机延迟(从0到3秒之间的秒数),以减缓暴力攻击。

4. 对输入变量进行验证和过滤,以防止SQL注入攻击。一个好的方法是使用准备好的语句与参数化查询。

5. 为防止跨站点脚本攻击(XSS),我们需要对输出进行适当的转义和处理。

这些改进可以极大地提高代码的安全性,使其更加可靠。但是,请注意,这只是最佳实践之一,您还应该根据特定的使用情况来评估可能存在的风险,并采取适当的安全措施来保护您的Web应用程序。

 

不可能的水平

在不可能的级别上,暴力(和用户枚举)应该是不可能的。开发人员添加了“锁定”功能,如果在过去 15 分钟内有 5 次错误登录,被锁定的用户将无法登录。

如果被锁定的用户尝试登录,即使使用有效密码,它也会说他们的用户名或密码不正确。这将无法知道系统上是否有一个有效的帐户,使用该密码,以及该帐户是否被锁定。

这可能会导致某人不断尝试登录某人的帐户,从而导致“拒绝服务”(DoS)。需要通过将攻击者列入黑名单(例如 IP 地址、国家/地区、用户代理)来扩展此级别。

<?phpif( isset( $_POST[ 'Login' ] ) && isset ($_POST['username']) && isset ($_POST['password']) ) {// Check Anti-CSRF tokencheckToken( $_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 accountif( $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 successfulecho "<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 failedsleep( rand( 2, 4 ) );// Give the user some feedbackecho "<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();?>

(88条消息) DVWA------Brute Force(暴力破解)_dvwa brute force_小孔吃不胖的博客-CSDN博客


http://www.ppmy.cn/news/349534.html

相关文章

使用POI实现JAVA操作Excel文件

1、POI工具介绍 1.1、POI 是用Java编写的免费开源的跨平台的 Java API&#xff0c;Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能。 1.2、主要是运用其中读取和输出excel的功能。 1.3、POI官网地址&#xff1a; https://poi.apache.org/components/i…

面试问题整理

第三家 1.负责的项目的开发人员人数&#xff1f;人员组成 2.说说java的数据类型 我说的list 、set 、map &#xff0c;面试官说这是接口&#xff0c;他说的是实现的类型 List 1. ArrayList&#xff1a; 特点&#xff1a;基于数组实现&#xff0c;支持动态扩容。元素的访…

【微服务】SpringBoot 插件化开发模式详细总结

目录 一、前言 1.1 使用插件的好处 1.1.1 模块解耦 1.1.2 提升扩展性和开放性 1.1.3 方便第三方接入 1.2 插件化常用实现思路 二、Java常用插件实现方案 2.1 serviceloader方式 2.1.1 java spi 2.1.2 java spi 简单案例 2.2 自定义配置约定方式 2.2.1 添加配置文件…

【大学计算机技术】第一章 测试19

文章目录 选择题 选择题 20多年来微处理器的发展非常迅速&#xff0c;下面关于微处理器发展的叙述不准确的是( )。 A. 微处理器中包含的晶体管越来越多&#xff0c;功能越来越强大 B. 微处理器中Cache的容量越来越大 C. 微处理器的指令系统越来越简单规整 D. 微处理器的性能价格…

云计算机专用显示器,华为云电脑+5G,你真的需要一款便携显示器!

移动互联网时代&#xff0c;手机办公已经成为越来越多人的需求。但是由于手机屏幕太小&#xff0c;部分功能操作有所限制&#xff0c;对于复杂的表格处理、PPT制作或处理多任务时&#xff0c;手机办公还是很难满足人们需求。 5G时代来临 即将到来的5G云服务时代&#xff0c;网络…

加速数字化转型,通过零代码ETL工具实现吉客云数据自动化同步

一、吉客云系统介绍 吉客云是一家SaaS企业服务提供商&#xff0c;主要提供企业级应用服务。吉客云的服务范围涵盖了企业级推广、企业级智能客服、企业级销售管理、企业级客户关系管理、企业级电子商务等方面的服务&#xff0c;并且提供了基于AI技术的解决方案。其目标是通过数…

计算机的神奇功能华为,图说华为MateBook X,这是一款神奇的笔记本电脑

随着互联网的快速发展&#xff0c;移动办公已经成为了人们的一种生活方式&#xff0c;因此大家对于笔记本电脑的要求相比一样也要高了很多&#xff0c;机身更轻薄一些、性能更强一些、最好还能有一些创新的体验&#xff0c;为我们的移动办公进一步带来便利。这些需求放在以往可…

华为发布Matebook系列笔记本+平板 外观堪比MacBook

华为不仅是手机、平板电脑和智能手表制造商&#xff0c;如今它也成为笔记本电脑制造商了。 该公司推出了两款全新笔记本电脑Matebook X和Matebook D&#xff0c;同时还发布了去年该公司推出的Windows 10平板电脑的升级版——Matebook E。有点混乱&#xff0c;对吧&#xff1f;…