LOW等级
我们先用burpsuite抓包,因为burpsuite提供了暴力破解模块
 
我们先创建一个1.txt文件夹,把正确的账号密码写进去
 
我们输入 Username:1 Password:1  进行抓包,然后发送到intruder(攻击)模块
 

 
 
Sniper标签这个是我们最常用的,Sniper是狙击手的意思。这个模式会使用单一的payload【就是导入字典的payload】组。它会针对每个position中$$位置设置payload。这种攻击类型适合对常见漏洞中的请求参数单独地进行测试。攻击中的请求总数应该是position数量和payload数量的乘积。
Battering ram – 这一模式是使用单一的payload组。它会重复payload并且一次把所有相同的payload放入指定的位置中。这种攻击适合那种需要在请求中把相同的输入放到多个位置的情况。请求的总数是payload组中payload的总数。简单说就是一个playload字典同时应用到多个position中
Pitchfork – 这一模式是使用多个payload组。对于定义的位置可以使用不同的payload组。攻击会同步迭代所有的payload组,把payload放入每个定义的位置中。比如:position中A处有a字典,B处有b字典,则a【1】将会对应b【1】进行attack处理,这种攻击类型非常适合那种不同位置中需要插入不同但相关的输入的情况。请求的数量应该是最小的payload组中的payload数量
Cluster bomb – 这种模式会使用多个payload组。每个定义的位置中有不同的payload组。攻击会迭代每个payload组,每种payload组合都会被测试一遍。比如:position中A处有a字典,B处有b字典,则两个字典将会循环搭配组合进行attack处理这种攻击适用于那种位置中需要不同且不相关或者未知的输入的攻击。攻击请求的总数是各payload组中payload数量的乘积。

果然爆出了正确的账号跟密码
 
同样,我们也可以用python进行暴力破解:

Medium等级
经验证发现用LOW等级的方法依然可以进行暴力破解,但是明显可以感觉用的时间比LOW等级长
我们能来看一下源代码:
  1. <?php
  2.  
  3. if( isset( $_GET[ 'Login' ] ) ) {
  4. // Sanitise username input
  5. $user = $_GET[ 'username' ];
  6. $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)) ? "" : ""));
  7.  
  8. // Sanitise password input
  9. $pass = $_GET[ 'password' ];
  10. $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)) ? "" : ""));
  11. $pass = md5( $pass );
  12.  
  13. // Check the database
  14. $query = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
  15. $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>' );
  16.  
  17. if( $result && mysqli_num_rows( $result ) == ) {
  18. // Get users details
  19. $row = mysqli_fetch_assoc( $result );
  20. $avatar = $row["avatar"];
  21.  
  22. // Login successful
  23. echo "<p>Welcome to the password protected area {$user}</p>";
  24. echo "<img src=\"{$avatar}\" />";
  25. }
  26. else {
  27. // Login failed
  28. sleep( );
  29. echo "<pre><br />Username and/or password incorrect.</pre>";
  30. }
  31.  
  32. ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
  33. }
  34.  
  35. ?>
 
中间有个sleep(2)的php函数,即是如果账号或者密码错误,程序停止运行两秒,导致medium等级的爆破所用时间更长
 
 
High等级
 
我们先来抓包看一下,输入username:1   password:1 ,抓到的包如图:
 

多了一个user_token的验证
我们来看一下源代码:
  1. <?php
  2.  
  3. if( isset( $_GET[ 'Login' ] ) ) {
  4. // Check Anti-CSRF token
  5. checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
  6.  
  7. // Sanitise username input
  8. $user = $_GET[ 'username' ];
  9. $user = stripslashes( $user );
  10. $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)) ? "" : ""));
  11.  
  12. // Sanitise password input
  13. $pass = $_GET[ 'password' ];
  14. $pass = stripslashes( $pass );
  15. $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)) ? "" : ""));
  16. $pass = md5( $pass );
  17.  
  18. // Check database
  19. $query = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
  20. $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>' );
  21.  
  22. if( $result && mysqli_num_rows( $result ) == ) {
  23. // Get users details
  24. $row = mysqli_fetch_assoc( $result );
  25. $avatar = $row["avatar"];
  26.  
  27. // Login successful
  28. echo "<p>Welcome to the password protected area {$user}</p>";
  29. echo "<img src=\"{$avatar}\" />";
  30. }
  31. else {
  32. // Login failed
  33. sleep( rand( , ) );
  34. echo "<pre><br />Username and/or password incorrect.</pre>";
  35. }
  36.  
  37. ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
  38. }
  39.  
  40. // Generate Anti-CSRF token
  41. generateSessionToken();
  42.  
  43. ?>

这里利用burp来爆破带有规律性的token验证:

1.抓包,选择Pitchfork(草叉模式),添加爆破的参数

2.在Options中找到Request Engine模块,把线程数设为1

3.在Options中找到Rediections模块,选择always,允许重定向

4.在Options中找到Grep-Extract模块,点击Add,并设置筛选条件,得到user_token。

5.在Payloads中为选择的参数设置字典

6.开始爆破

根据返回长度的大小,可以得到正确的用户密码

除了burpsuite爆破,也可以通过python脚本实现,鄙人较菜,代码不好看,但是经实验可以运行:

代码执行结果:

impossible等级
impossible几乎是不可能注入,我们来看一下代码
  1. <?php
  2.  
  3. if( isset( $_POST[ 'Login' ] ) ) {
  4. // Check Anti-CSRF token
  5. checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
  6.  
  7. // Sanitise username input
  8. $user = $_POST[ 'username' ];
  9. $user = stripslashes( $user );
  10. $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)) ? "" : ""));
  11.  
  12. // Sanitise password input
  13. $pass = $_POST[ 'password' ];
  14. $pass = stripslashes( $pass );
  15. $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)) ? "" : ""));
  16. $pass = md5( $pass );
  17.  
  18. // Default values
  19. $total_failed_login = ;
  20. $lockout_time = ;
  21. $account_locked = false;
  22.  
  23. // Check the database (Check user information)
  24. $data = $db->prepare( 'SELECT failed_login, last_login FROM users WHERE user = (:user) LIMIT 1;' );
  25. $data->bindParam( ':user', $user, PDO::PARAM_STR );
  26. $data->execute();
  27. $row = $data->fetch();
  28.  
  29. // Check to see if the user has been locked out.
  30. if( ( $data->rowCount() == ) && ( $row[ 'failed_login' ] >= $total_failed_login ) ) {
  31. // User locked out. Note, using this method would allow for user enumeration!
  32. //echo "<pre><br />This account has been locked due to too many incorrect logins.</pre>";
  33.  
  34. // Calculate when the user would be allowed to login again
  35. $last_login = strtotime( $row[ 'last_login' ] );
  36. $timeout = $last_login + ($lockout_time * );
  37. $timenow = time();
  38.  
  39. /*
  40. print "The last login was: " . date ("h:i:s", $last_login) . "<br />";
  41. print "The timenow is: " . date ("h:i:s", $timenow) . "<br />";
  42. print "The timeout is: " . date ("h:i:s", $timeout) . "<br />";
  43. */
  44.  
  45. // Check to see if enough time has passed, if it hasn't locked the account
  46. if( $timenow < $timeout ) {
  47. $account_locked = true;
  48. // print "The account is locked<br />";
  49. }
  50. }
  51.  
  52. // Check the database (if username matches the password)
  53. $data = $db->prepare( 'SELECT * FROM users WHERE user = (:user) AND password = (:password) LIMIT 1;' );
  54. $data->bindParam( ':user', $user, PDO::PARAM_STR);
  55. $data->bindParam( ':password', $pass, PDO::PARAM_STR );
  56. $data->execute();
  57. $row = $data->fetch();
  58.  
  59. // If its a valid login...
  60. if( ( $data->rowCount() == ) && ( $account_locked == false ) ) {
  61. // Get users details
  62. $avatar = $row[ 'avatar' ];
  63. $failed_login = $row[ 'failed_login' ];
  64. $last_login = $row[ 'last_login' ];
  65.  
  66. // Login successful
  67. echo "<p>Welcome to the password protected area <em>{$user}</em></p>";
  68. echo "<img src=\"{$avatar}\" />";
  69.  
  70. // Had the account been locked out since last login?
  71. if( $failed_login >= $total_failed_login ) {
  72. echo "<p><em>Warning</em>: Someone might of been brute forcing your account.</p>";
  73. echo "<p>Number of login attempts: <em>{$failed_login}</em>.<br />Last login attempt was at: <em>${last_login}</em>.</p>";
  74. }
  75.  
  76. // Reset bad login count
  77. $data = $db->prepare( 'UPDATE users SET failed_login = "0" WHERE user = (:user) LIMIT 1;' );
  78. $data->bindParam( ':user', $user, PDO::PARAM_STR );
  79. $data->execute();
  80. } else {
  81. // Login failed
  82. sleep( rand( , ) );
  83.  
  84. // Give the user some feedback
  85. 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>";
  86.  
  87. // Update bad login count
  88. $data = $db->prepare( 'UPDATE users SET failed_login = (failed_login + 1) WHERE user = (:user) LIMIT 1;' );
  89. $data->bindParam( ':user', $user, PDO::PARAM_STR );
  90. $data->execute();
  91. }
  92.  
  93. // Set the last login time
  94. $data = $db->prepare( 'UPDATE users SET last_login = now() WHERE user = (:user) LIMIT 1;' );
  95. $data->bindParam( ':user', $user, PDO::PARAM_STR );
  96. $data->execute();
  97. }
  98.  
  99. // Generate Anti-CSRF token
  100. generateSessionToken();
  101.  
  102. ?>
我们尝试输入错误的用户名跟密码:
 
发现再次尝试要等到15分钟后,果然是impossible等级,限制了暴力破解,多次尝试输入
 
所以说要防止暴力破解:

 
 

4. DVWA亲测暴力破解的更多相关文章

  1. DVWA靶场练习-暴力破解

    一.暴力破解 (Brute Force)    暴力破解是Web安全领域的一个基础技能,破解方法论为:构建常见用户名及弱口令 因此需要好的字典,对应破解场景构建特定的用户名密码,以及还需要具有灵活编写 ...

  2. 2. DVWA亲测CSRF漏洞

    DVWA登陆      用户名:admin   密码:password Low级: 查看源代码: <?php if (isset($_GET['Change'])) { // Turn requ ...

  3. 1.4 DVWA亲测XSS漏洞

    首先需要有配置好的DVWA环境,像下图这样   其中: XSS (DOM) :  DOM型XSS漏洞 XSS (Reflected) : 反射性XSS漏洞  XSS (Stored) :  存储型XS ...

  4. 1.2 DVWA亲测sql注入漏洞(blind)

    LOW等级     我们尝试输入:   即如果页面返回为假,则说明后面的语句成功注入 据此我们可以知道 1' and 真 --> 页面显示 “User ID exists in the data ...

  5. 2. DVWA亲测文件包含漏洞

    Low级:     我们分别点击这几个file.php文件 仅仅是配置参数的变化: http://127.0.0.1/DVWA/vulnerabilities/fi/?page=file3.php 如 ...

  6. 1.4 DVWA亲测文件上传漏洞

    Low 先看看源代码: <?php if(isset( $_POST[ 'Upload' ] ) ) { // Where are we going to be writing to? $tar ...

  7. Mac-Navicat Premium For Mac 12 破解 - [数据库可视化工具,亲测完美破解]

    一.下面的公钥和私钥暂时存到文本编辑器中 公钥: -----BEGIN PUBLIC KEY-----MIIBITANBgkqhkiG9w0BAQEFAAOCAQ4AMIIBCQKCAQB8vXG0I ...

  8. 2. DVWA亲测命令执行漏洞

        先看low级: 提示让我们输入一个IP地址来实现ping,猜测会是在系统终端中实现的, 我们正常输入127.0.0.1: 那我们就可以利用这个使用其他CMD命令  我们输入127.0.0.1& ...

  9. 1.3 DVWA亲测sql注入漏洞

    LOW等级   我们先输入1 我们加上一个单引号,页面报错 我们看一下源代码: <?php if( isset( $_REQUEST[ 'Submit' ] ) ) { // Get input ...

随机推荐

  1. hd acm1008

    Problem Description The highest building in our city has only one elevator. A request list is made u ...

  2. Spring Cloud之服务治理(注册发现)

    服务治理SpringCloud Eureka 什么是服务治理 在传统rpc远程调用中,服务与服务依赖关系,管理比较复杂,所以需要使用服务治理,管理服务与服务之间依赖关系,可以实现服务调用.负载均衡.容 ...

  3. HDU5371 Hotaru's problem

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  4. codevs1279 Guard 的无聊

    题目描述 Description 在那楼梯那边数实里面,有一只 guard,他活泼又聪明,他卖萌又霸气.他每天刷题虐 场 D 人考上了 PKU,如果无聊就去数一数质数~~ 有一天 guard 在纸上写 ...

  5. linux shell 编程(一)

    脚本:命令的堆砌,按照实际需要结合命令流程控制机制实现的源程序 linux 内核只能识别 elf格式的文件(可执行的可链接的文件) 脚本的第一行写 #!/bin/bash 表示脚本解释器

  6. Cannot find class [org.apache.commons.dbcp.BasicDataSource] for bean with name 'dataSource' defined in class path resource [applicationContext.xml]

    Cannot find class [org.apache.commons.dbcp.BasicDataSource] for bean with name 'dataSource' defined ...

  7. php 简单判断是否微信浏览器

    今天遇到一问题,让一个页面在微信上打开和浏览器打开显示不同的按钮,这是一个建议的方法 $user_agent = $_SERVER['HTTP_USER_AGENT']; if (strpos($us ...

  8. mysql多位小数字段用decimal类型

    转自http://database.51cto.com/art/201005/201651.htm

  9. Oracle学习笔记_03_单行函数

    1.SQL函数: 单行函数.多行函数 单行函数:       操作数据对象       接受参数返回一个结果       只对一行进行变换       每行返回一个结果       可以转换数据类型  ...

  10. 【遍历二叉树】03二叉树的后序遍历【Binary Tree Postorder Traversal】

    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 给定一个二叉树,返回他的后序遍历的 ...