2023年7月10日发(作者:)
DVWA使⽤教程(BruteForce)(⼀)DVWA使⽤教程(Brute Force)(⼀)DVWA是⼀个⽤来练习Web渗透的PHP应⽤。共有⼗个模块,分别是 Force(爆破)d Injection(命令注⼊)(跨站请求伪造) Inclusion(⽂件包含) Uplod(⽂件上传)re CAPTCHA(不安全的验证码) Inj(SQL注⼊) B Inj(SQL盲注)-ref(反射型xss)-stored(存储型xss)⼀、 简介Brute Force通过登录页⾯进⼊到该漏洞的测试位置。这个模块是⽤来测试暴⼒破解⼯具和展⽰不安全的开发实现。
⼆、 功能特点耗费时间⽐较长,基本是软件⾃动化测试,枚举完成所有请求,攻击开始后,⼿⼯操作的部分⾮常有限。三、 各防护等级简介low等级,对爆破攻击⾏为毫⽆设防。medium等级,对爆破攻击⾏为防护不⾜,防护做法⽋考虑。hight等级,对爆破攻击⾏为有⼀定防护,但有疏忽。impossible等级,对爆破攻击⾏为正确防护。四、low代码模块剖析概述:low等级,对爆破攻击⾏为毫⽆设防。Welcome to the password protected area {$user}
"; echo ""; } else { // Login failed echo ""; } ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);}>
Username and/or password incorrect.
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '
' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___my根据代码可以得知函数⽤来检测变量是否设置,并且不是 NULL。2.⽤户可以完全控制该参数,传参时给Login赋值即可满⾜条件继续执⾏。3.⽆论⽤户名还是密码都没有经过任何的过滤和检查。4.⽤户输⼊的⽤户名将原封不动传递到SQL语句中。5.⽤户输⼊的密码将进⾏md5散列后传递到SQL语句中。 爆破尝试,步骤如下。
通过配置option选项可以让结果更直观些。五、medium代码模块剖析概述:medium等级,对爆破攻击⾏为防护不⾜,防护做法⽋考虑。Welcome to the password protected area {$user}
"; echo ""; } else { // Login failed sleep( 2 ); echo ""; } ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);}> $user = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $use $pass = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pas $result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '
Username and/or password incorrect.' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___my根据代码可以得知函数⽤来检测变量是否设置,并且不是 NULL。2.⽤户可以完全控制该参数,传参时给Login赋值即可满⾜条件继续执⾏。3.⽤户名部分使⽤mysqli_real_escape_string(str)函数⽤户名的特殊符号(x00,n,r,,‘,“,x1a)(ascii码0,换⾏,回车,回退)进⾏转义,除宽字节注⼊外,可以抵抗其余SQL注⼊。4.⽤户输⼊的密码将进⾏md5散列后传递到SQL语句中。5. 如果密码输错了,则延时两秒之后才能再次提交。爆破部分尝试与low代码部分⼀样。六、High代码模块剖析概述:hight等级,对爆破攻击⾏为有⼀定防护,但有疏忽。Welcome to the password protected area {$user}"; echo ""; } else { // Login failed sleep( rand( 0, 3 ) ); echo ""; } ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);}// Generate Anti-CSRF tokengenerateSessionToken();> $user = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $use $pass = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pas $result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '
Username and/or password incorrect.' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___my根据代码可以得知函数⽤来检测变量是否设置,并且不是 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代码模块剖析
// 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 "
"; // Calculate when the user would be allowed to login again $last_login = strtotime( $row[ 'last_login' ] ); $timeout = $last_login + ($lockout_time * 60); $user = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $use $pass = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pas $timenow = time(); /* print "The last login was: " . date ("h:i:s", $last_login) . "
This account has been locked due to too many incorrect logins.
"; print "The timenow is: " . date ("h:i:s", $timenow) . "
"; print "The timeout is: " . date ("h:i:s", $timeout) . "
"; */ // 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
"; } } // 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 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 "Welcome to the password protected area {$user}
"; echo ""; // Had the account been locked out since last login? if( $failed_login >= $total_failed_login ) { echo "Warning: Someone might of been brute forcing your account.
"; echo "Number of login attempts: {$failed_login}.
"; } // 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 // 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 tokengenerateSessionToken();> echo "
Last login attempt was at: ${last_login}.
Username and/or password incorrect.
Alternative, the account has been locked because of too many failed logins.
If this is根据代码可以得知函数⽤来检测变量是否设置,并且不是 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爆破的各种操作。遇到不懂的地⽅查阅资料,前前后后花了近⼗五⼩时。端午节放假三天,想多学点,没出去嗨。如此⼀来,本⽂便是端午节送给⾃⼰的礼物了。发布者:admin,转转请注明出处:http://www.yc00.com/news/1688986545a191855.html
评论列表(0条)