DVWA使用教程(Brute Force)(一)

DVWA是一个用来练习Web渗透的PHP应用。共有十个模块,分别是
1.Brute Force(爆破)

2.Command Injection(命令注入)

3.CSRF(跨站请求伪造)

4.File Inclusion(文件包含)

5.File Uplod(文件上传)

6.Insecure CAPTCHA(不安全的验证码)

7.SQL Inj(SQL注入)

8.SQL B Inj(SQL盲注)

9.XSS-ref(反射型xss)

10.xss-stored(存储型xss)

一、    简介
Brute Force通过登录页面进入到该漏洞的测试位置。
这个模块是用来测试暴力破解工具和展示不安全的开发实现。

二、    功能特点
耗费时间比较长,基本是软件自动化测试,枚举完成所有请求,攻击开始后,手工操作的部分非常有限。

三、    各防护等级简介
low等级,对爆破攻击行为毫无设防。
medium等级,对爆破攻击行为防护不足,防护做法欠考虑。
hight等级,对爆破攻击行为有一定防护,但有疏忽。
impossible等级,对爆破攻击行为正确防护。

四、low代码模块剖析
概述:low等级,对爆破攻击行为毫无设防。

<?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 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);
}
?> 

根据代码可以得知
1.isset函数用来检测变量是否设置,并且不是 NULL。
2.用户可以完全控制该参数,传参时给Login赋值即可满足条件继续执行。
3.无论用户名还是密码都没有经过任何的过滤和检查。
4.用户输入的用户名将原封不动传递到SQL语句中。
5.用户输入的密码将进行md5散列后传递到SQL语句中。

爆破尝试,步骤如下。
 
 
 
通过配置option选项可以让结果更直观些。

五、medium代码模块剖析
概述: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 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.isset函数用来检测变量是否设置,并且不是 NULL。
2.用户可以完全控制该参数,传参时给Login赋值即可满足条件继续执行。
3.用户名部分使用mysqli_real_escape_string(str)函数用户名的特殊符号(\x00,\n,\r,\,‘,“,\x1a)(ascii码0,换行,回车,回退)进行转义,除宽字节注入外,可以抵抗其余SQL注入。
4.用户输入的密码将进行md5散列后传递到SQL语句中。
5. 如果密码输错了,则延时两秒之后才能再次提交。

爆破部分尝试与low代码部分一样。

六、High代码模块剖析
概述:hight等级,对爆破攻击行为有一定防护,但有疏忽。

<?php
if( 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();
?>

根据代码可以得知
1.isset函数用来检测变量是否设置,并且不是 NULL。
2.用户可以完全控制该参数,传参时给Login赋值即可满足条件继续执行。
3. 校验token,每次都需要更新token。
3.用户名部分使用,stripslashes(str)函数去除用户名中出现的反斜线。然后再使用mysqli_real_escape_string(str)函数用户名的特殊符号(\x00,\n,\r,\,‘,“,\x1a)(ascii码0,换行,回车,回退)进行转义,完全抵抗SQL注入。
4.用户输入的密码将进行md5散列后传递到SQL语句中。
5. 如果密码输错了,则延时0-3秒之后才能再次提交。

爆破尝试,步骤如下。

抓取数据包

Attack type选择Pitchfork。将passwod和user_token设置攻击位置(attack position)

在options栏找到Grep – Extract,点击Add,弹出的界面中点击Refetch response,进行一个请求,即可看到响应报文,直接选取需要提取的字符串,上面的会自动填入数据的起始和结束标识。

线程设置为1

返回Welcome时标注打钩。

注意设置跳转跟随。
( Never(从来没有) - 入侵者不会遵循任何重定向。 On-site only(现场唯一的) - 入侵者只会跟随重定向到同一个网页“网站” ,即使用相同的主机,端口和协议的是在原始请求使用的URL 。 In-scope only(调查范围内的唯一) - Intruder只会跟随重定向到该套件范围的目标范围之内的URL 。 Always(总是) - Intruder将遵循重定向到任何任何URL 。您应使用此选项时应谨慎 - 偶尔, Web应用程序在中继重定向到第三方的请求参数,并按照重定向你可能会不小心攻击。)

结果如下,没发生302跳转,成功跑出密码。上一次访问得到的token作为了本次请求的参数。而且从响应信息上也可以看到,没有提示token错误。不过这里注意到,字典的前几个元素不正常,这是因为burp每次开启爆破任务前都要进行payload空负载请求。这导致字典的第一个元素将得不到合适token,如果密码恰巧在第一个就白忙活了。
 
 

七、Impos代码模块剖析

<?php
if( 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();
?>

根据代码可以得知
1.isset函数用来检测变量是否设置,并且不是 NULL。
2.用户可以完全控制该参数,传参时给Login赋值即可满足条件继续执行。
3. 校验token,每次都需要更新token。
3.用户名部分使用,stripslashes(str)函数去除用户名中出现的反斜线。然后再使用mysqli_real_escape_string(str)函数用户名的特殊符号(\x00,\n,\r,\,‘,“,\x1a)(ascii码0,换行,回车,回退)进行转义,完全抵抗SQL注入。
4.用户输入的密码将进行md5散列后传递到SQL语句中。
5. 当用户登录失败达到3次,锁定账号15分钟,同时采用了更为安全的PDO(PHP Data Object)机制防御sql注入。PDO执行任何数据库操作分两步操作,用户输入的部分属于第二步,即使包含命令也不会执行。

八、注入的做法
在low模块中,可以使用注入的方法登录。注意的是,程序结果集中只有一条数据才能登陆成功。密码参数会进行md5散列,故注入的位置只能是用户名处。可以是 ‘ or 1=1#  或者 ‘ or 1=1 limit 1,1# ,把#换成两个减号也可以,这里没有任何输入过滤,注入起来很是方便。

九、小结
内容比较多,学习dvwa的暴力破解模块颇为耗时。从代码审计,到研究burp爆破的各种操作。遇到不懂的地方查阅资料,前前后后花了近十五小时。端午节放假三天,想多学点,没出去嗨。如此一来,本文便是端午节送给自己的礼物了。

DVWA使用教程(Brute Force)(一)相关推荐

  1. Kali渗透测试之DVWA系列2——Brute Force(暴力破解)

    目录 一.暴力破解原理 二.实验环境 三.实验步骤 安全等级:LOW 安全等级:Medium 暴力破解的四种方式 安全等级:High 安全等级:Impossible 防止暴力破解的有效手段 一.暴力破 ...

  2. 网络安全入门之 Burp Suite 暴力破解 DVWA Brute Force Low

    文章目录 1. 背景 2. 准备工作 2.1. 靶场环境 2.2. 安装破解工具 3. 破解过程 3.1. 代理请求 3.2. 拦截请求 3.3. 填装弹药 3.4. 设置岗哨 3.5. 开始攻击 4 ...

  3. 【白帽子学习笔记11】DVWA Brute Force【暴力破解】

    [白帽子学习笔记11]DVWA Brute Force Brute Force 就是暴力破解的意思,尝试常用的用户名和必然然后使用工具一个一个的去尝试 LOW级别 通过解析源码我们可以发现代码没有任何 ...

  4. DVWA Brute Force(low)

    0x00 设置安全水平 小白刚接触DVWA,先从简单的开始 00x1 Brute Force(蛮力:爆破) 0x02 开启firefox代理 首选项 0x03 使用brupsuite爆破 输入: ad ...

  5. DVWA 之暴力破解攻击(Brute Force)

    暴力破解(Brute Force)的意思是攻击者借助计算机的高速计算不停枚举所有可能的用户名和密码,直到尝试出正确的组合,成功登录系统.理论上,只要字典足够大,破解总是会成功的.阻止暴力破解的最有效方 ...

  6. DVWA学习(三)Brute Force(暴力破解)

    BF算法,即暴风(Brute Force)算法,是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符:若不相 ...

  7. 新手指南:DVWA-1.9全级别教程之Brute Force

    目前,最新的DVWA已经更新到1.9版本(http://www.dvwa.co.uk/),而网上的教程大多停留在旧版本,且没有针对DVWA high级别的教程,因此萌发了一个撰写新手教程的想法,错误的 ...

  8. DVWA全关教程手册

    搭建 使用phpstudy 放入根目录下 C:\phpstudy\PHPTutorial\WWW 修改两个配置文件 C:\phpstudy\PHPTutorial\WWW\DVWA\php.ini m ...

  9. Hydra – Brute Force HTTP(S)

    In this tutorial, I will be demonstrating how to brute force authentication on HTTP and HTTPS servic ...

最新文章

  1. C语言 经典编程100
  2. RedHat.Enterprise.Linux.5.2 Yum源配置
  3. UTXO与账户/余额模型
  4. java中mongodb中dao通用_Spring配置MongoDB及 构建通用Dao
  5. 敏捷开发用户故事系列之二:如何面向客户价值编写故事
  6. android studio设置Tab为四空格缩进
  7. Webdriver API (二)
  8. Unity3D笔记十七 Unity3D生命周期
  9. 安卓逆向_9 --- log 插桩、Toast 弹窗、smali代码编写和植入 ( 好搜小说 )
  10. 第五章 应用程序主窗口
  11. (13)Zynq DDR控制器介绍
  12. JAVA POI处理WORD
  13. 保存网页为图片——滚动截取IE(WebBrowse)
  14. outlook邮箱邮件大小限制_如何解除OutLook邮件附件大小限制?成功发送大附件的邮件...
  15. [乐意黎原创]hosts文件位置及说明
  16. HDU 5441并查集 by cyl
  17. 4.3.1 管道翻模
  18. 淘宝帝国是如何创建的连载03
  19. 指令系统 —— 指令格式
  20. 奇虎360_2017校园招聘笔试编程题第二题

热门文章

  1. 利用wireshark和fiddler破解中控人脸识别考勤机
  2. 第九届蓝桥杯国赛总结
  3. 汽车智能化进入赛点:城市NOA落地竞速,战至最后一公里
  4. 如何把 Excel 的表格导入 Indesign
  5. 安卓嵌入式开发视频!斗鱼直播Android开发二面被刷,持续更新中
  6. WEB之浏览器使用入门--chrome扩展插件安装及好用的扩展插件小集合
  7. Nodejs + express 开发微信公众号模板消息推送功能
  8. pytorch - directml 中查看设备支持情况
  9. rust怎么传送坐标_5G基站可以这样“上天”,你怎么看?
  10. 划重点:《App Store 审核指南》更新条目一览