赞
踩
DVWA Security分为四个等级,low,medium,high,impossible,不同的安全等级对应了不同的漏洞等级。
1.low-最低安全等级,无任何安全措施,通过简单毫无安全性的编码展示了安全漏洞。
2.medium-中等安全等级,有安全措施的保护,但是安全性并不强。
3.high-高等安全等级,有安全措施保护,是中等安全等级的加深,这个等级下的安全漏洞可能不允许相同程度的攻击。
4.impossible-最高(不可能)安全等级,存在相当强的安全保护措施,这个级别应能防止所有的漏洞,主要用于比较不同等级下的源代码。
暴力破解也称为穷举法,是指未知用户名和密码的情况下,通过某些破解软件+破解词典(用户可能设置的用户名及密码文件),来爆破出正确的用户名及密码,此过程技术成分低,其耗费时间多,成功几率小。
适用场景:适用于无验证码或者二次验证登录的WEB页面
首先我们在此处用的暴力破解工具为Burp suite,此工具可以在截取WEB页面POST提交的信息后,可以通过修改用户名密码方式来测试WEB页面是否正确回显,也就是修改之后的用户名密码是否正确
由于暴力破解及其耗费时间,此时为了方便,我们在自定义词典,在词典中加入已知的用户名,密码,为了更快速的查到结果。
username:admin
password:123
<?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 = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' ); if( $result && mysql_num_rows( $result ) == 1 ) { // Get users details $avatar = mysql_result( $result, 0, "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>"; } mysql_close(); } ?>
Intruder默认针对于所有的变量,我们先将其原策略清除(clear),重新添加(Add)单选项针对于password,
攻击类型(Attack type)选为sniper
Payload Sets:
Payload set:设置破解页,当前只针对于密码,为1
Payload type 设置为Simple list,单表模式
Payload Options[Simple list]
load:通过load可以载入常用用户名及密码词典,文件形式
Add:添加单独可能存在的密码
常用的用户名密码词典在网上都能下载,此处为了方便,快速的达成效果,我们Add中添加已知的密码
定义好词典后,开始攻击,我们可以发现当出现正确的密码时回复中,Length有不同的结果,此时正确的长度为5317,这就是判断密码是否正确的方法,同时可以在Response Render中查看web页面的回显效果。
同low等级下的暴力破解类似,为了方便,我们在自定义词典,在词典中加入已知的用户名,密码,为了更快速的查到结果。
username:admin
password:123
由于low等级下,不存在安全策略,无安全行可言,但是Medium等级下存在安全策略,为了方便快速,我们此时可以先查看源码再进行破解。
mysql_real_escape_string():此函数转义了SQL语句中使用的字符串的特殊字符
也就是过滤了一些特殊字符,包括(\x00、\n、\r 、\、 '、 "、 \x1a),也意味着用户名和密码中不能存在这些特殊字符。
<?php if( isset( $_GET[ 'Login' ] ) ) { // Sanitise username input $user = $_GET[ 'username' ]; $user = mysql_real_escape_string( $user ); // Sanitise password input $pass = $_GET[ 'password' ]; $pass = mysql_real_escape_string( $pass ); $pass = md5( $pass ); // Check the database $query = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';"; $result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' ); if( $result && mysql_num_rows( $result ) == 1 ) { // Get users details $avatar = mysql_result( $result, 0, "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>"; } mysql_close(); } ?>
Intruder默认针对于所有的变量,我们先将其原策略清除(clear),重新添加(Add)单选项针对于username&password,
攻击类型(Attack type)选为Cluster bomb
Payload Sets:
Payload set:设置破解页,当前于用户名和密码,为2
Payload type 设置为Simple list,单表模式
Payload Options[Simple list]
load:通过load可以载入常用用户名及密码词典,文件形式
Add:添加单独可能存在的用户名及密码
常用的用户名密码词典在网上都能下载,此处为了方便,快速的达成效果,我们Add中添加已知的用户名及密码
用户名:
密码:
定义好词典后,开始攻击,我们可以发现当出现正确的用户名和密码时回复中,Length有不同的结果,此时正确的长度为5326,这就是判断密码是否正确的方法,同时可以在Response Render中查看web页面的回显效果。
此时我定义了6个用户名,7个密码,其共有42中结果,这个过程花费大概1min,可想而知,如果用成千上万个用户名和密码来测试,那需要的时间就相当的长,此时暴力破解的缺点也就显露出来。
在high等级中,存在更加强的安全策略
1.token机制(基于token的身份验证)
2.stripslashes()函数,过滤字符串中的反斜杠’’,也就是说用户名中和密码不能存在
3.mysql_real_escape_string(),同medium等级一样,过滤了一些特殊字符,包括(\x00、\n、\r 、\、 '、 "、 \x1a),也意味着用户名和密码中不能存在这些特殊字符。
由于token值,每次都是随机的,客户端和服务端都为随机值,无法使用burp suite进行暴力破解,但是可以通过python脚本,自动获取token,后期会发布python相关脚本文件的暴力破解过程。
<?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 = mysql_real_escape_string( $user ); // Sanitise password input $pass = $_GET[ 'password' ]; $pass = stripslashes( $pass ); $pass = mysql_real_escape_string( $pass ); $pass = md5( $pass ); // Check database $query = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';"; $result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' ); if( $result && mysql_num_rows( $result ) == 1 ) { // Get users details $avatar = mysql_result( $result, 0, "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>"; } mysql_close(); } // Generate Anti-CSRF token generateSessionToken(); ?>
impossible等级的安全策略相当强大,应能防止所有的漏洞,用于比较不同等级下的源代码。
相比于high等级,impossible等级,加上了登录失败策略,定义了3个变量
total_failed_login:总的登录失败次数,当前定义为3次。
lockout_time:账户锁定时间,当前定义为15s
account_locked:创建用户的时候锁定用户
bindparam:为用户名和密码绑定参数PDOStatement::bindParam
时间函数:
last_login、timeout、timenow等组成了相当大的防御体系
<?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 = mysql_real_escape_string( $user ); // Sanitise password input $pass = $_POST[ 'password' ]; $pass = stripslashes( $pass ); $pass = mysql_real_escape_string( $pass ); $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 = $row[ 'last_login' ]; $last_login = strtotime( $last_login ); $timeout = strtotime( "{$last_login} +{$lockout_time} minutes" ); $timenow = strtotime( "now" ); // Check to see if enough time has passed, if it hasn't locked the account if( $timenow > $timeout ) $account_locked = true; } // 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(); ?>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。