상세 컨텐츠

본문 제목

DVWA : Brute Force - Medium level

Vulnerability Assessment/Web Application

by DarkSoul.Story 2024. 12. 28. 22:51

본문

반응형
이 문서에 포함된 어떠한 내용도 불법적이거나 비윤리적인 목적으로 보안 도구나 방법론을 사용하도록 가르치거나 장려하지 않습니다. 항상 책임감 있는 태도로 행동하세요. 여기에 설명된 도구나 기법을 사용하기 전에 개인 테스트 환경 또는 허가를 받았는지 확인하세요.

1. Source code analysis

[그림 1] Medium level Source Code

사용자 입력 처리 (username)

$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)) ? "" : ""));
  • $user $_GET'username' ]; : 사용자 이름을 가져온다.
  • mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $user ) : SQL Injection을 방지하기 위해 username에 포함된 특수문자를 이스케이프 처리한다.

사용자 입력 처리 (password)

$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 );
  • $pass $_GET'password' ]; : 비밀번호를 가져온다.
  • mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass ) : SQL Injection을 방지하기 위해 password에 포함된 특수문자를 이스케이프 처리한다.
  • $pass md5$pass ); : 비밀번호를 MD5 해시로 변환하여 저장하거나 비교한다. 그러나 MD5는 보안상 취약하므로 bcrypt나 argon2와 같은 더 안전한 해시 알고리즘을 사용하는 것이 좋다.

데이터베이스 쿼리 실행

$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>' );
  •  $query  "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';"; : SQL 쿼리를 생성하여 사용자가 입력한 아이디와 비밀번호가 데이터베이스에 존재하는지 확인한다. mysqli_real_escape_string()을 사용하여 입력을 정리하지만, MD5 해시를 사용하고 SQL 쿼리 문자열을 그대로 구성하는 방식은 SQL 인젝션 위험이 있다. 이를 방지하려면 prepared statements과 바인딩된 매개변수를 사용하는 것이 더 안전하다.
  • mysqli_query( ) : 쿼리를 실행하고, 결과가 성공적으로 반환되면 사용자가 데이터베이스에 존재하는지 확인한다.

로그인 결과 처리 (로그인 성공 시)

if( $result && mysqli_num_rows( $result ) == 1 ) {
        $row    = mysqli_fetch_assoc( $result );
        $avatar = $row["avatar"];

        echo "<p>Welcome to the password protected area {$user}</p>";
        echo "<img src=\"{$avatar}\" />";
    }
  • $result && mysqli_num_rows$result ) == ) : 쿼리 결과가 정확히 한 행을 반환하면, 이는 사용자의 아이디와 패스워드가 일치함을 의미한다.
  • $avatar $row["avatar"]; : 로그인이 성공하면 사용자 정보에서 아바타를 가져와 사용자에게 환영 메시지 echo "<p>Welcome to the password protected area {$user}</p>"; 와 아바타 이미지 echo "<img src=\"{$avatar}\" />"; 를 표시한다.

로그인 결과 처리 (로그인 실패 시)

else {
        sleep( 2 );
        echo "<pre><br />Username and/or password incorrect.</pre>";
    }
  • sleep); : 로그이 실패 시 응답을 지연시켜 Brute Force 공격을 방지하려고 시도한다.

데이터베이스 연결 종료

((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
  • 데이터베이스 연결을 종료하여 리소스를 해제한다.

Medium level의 Source code를 살펴보면 Low level과 거의 비슷하지만, 한 가지 다른 점은 로그인 실패  시 sleep( )함수 2초 지연하는 Code가 추가되었다.

 

2. Practical exercises

공격 방법은 Low level( DVWA : Brute Force - Low level)과 동일한 방식으로 진행하며, 공격 실행 결과 로그인 실패 시 2초 딜레이가 있어 1분에 처리할 수 있는 요청 수가 줄어들어  Brute Force 공격 시간이 더 길어졌을뿐 Length로 정렬하면 Low Level과 동일한 결과를 얻을 수 있다.

[그림 2]  Brute Force 공격 결과

 

반응형

관련글 더보기