DVWA - Brute Force ( Medium )
DVWA - Brute Force ( Medium ) 입니다

개요
이 포스팅에서는 DVWA(Damn Vulnerable Web Application) - Brute Force, Medium 단계 실습을 진행하면서 공부했던 내용에 대한 내용을 정리해 보았고, 모두 본인이 소유한 가상머신에서 실습이 이루어졌습니다
DVWA - Brute Force, Low 단계에서는 Wfuzz를 사용하여 실습을 진행하였고 Medium 단계에서는 Hydra를 사용하였습니다
실습환경
M1 MacBook Air
16G RAM
UTM - 가상머신
Kali Linux 2023.1 - Apple Silicon (ARM64)
목차
1. 취약점 설명 및 분석 - 소스코드 분석, Brute Force, 관리자 페이지
2. Hydra 사용방법 및 실습 - 사용방법, 실습, wfuzz와 비교하기
3. 대응방안
4. Secure Coing In Ubuntu - 로그인 횟수 제한하기
취약점 설명 및 분석
소스코드 분석
// 위치 : /var/www/html/dvwa/vulnerabilities/brute/source -> medium.php
// 중요내용 제외 삭제하였음
<?php
if( isset( $_GET[ 'Login' ] ) ) {
// 회원 정보 조회하기
$query = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $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}\" />";
}
else {
// 로그인 실패
sleep( 2 );
echo "<pre><br />Username and/or password incorrect.</pre>";
}
}
?>
입력받은 아이디와 비밀번호를 조회하여
로그인에 성공했다면 이미지와 성공 메시지를, 실패한다면 2초 뒤에 실패메시지를 보내도록 한다
Brute Force
위 코드에서는 이용자가 로그인 시도를 무한으로 할 수 있다
로그인에 실패할 경우 2초 뒤에 응답이 온다는 차이점이 있지만 로그인 시도를 하고 바로 응답이 오지 않으면 로그인 실패로 간주하고 바로 다음 로그인을 시도할 수 있다
관리자 페이지
아이디를 admin으로 하고 비밀번호를 password로 로그인을 시도하면 위와 같이 로그인에 성공함을 알 수 있다
로그인에 성공했을 때 나오는 이미지를 이용하여 다른 관리자 아이디를 알 수 있다
Hydra 사용방법 및 실습
사용방법
-l 유저이름 -P 비밀번호파일 형식으로 사용했다
-V 는 verbose mode( 상세모드 )로 아이디와 비밀번호를 보여준다
-I 는 기존 복원파일을 무시한다 ( 10초를 기다리지 않는다 )
실습
시간지연이 발생해 5개의 터미널을 이용하여 동시에 진행해 주었고 rockyou.txt, fasttrack.txt, john.lst 를 사용했다
wfuzz와 비교하기
Low 에서 사용했던 wfuzz를 Medium에도 적용했다
hydra를 적용했을 때와 마찬가지로 sleep(2)때문에 시간지연이 발생하는 것은 똑같았지만 결과는 같았다
대응방안
Brute Force는 로그인 시도를 무한으로 할 수 있다는 문제에서 발생하므로 Captcha, 로그인 횟수 제한, 로그인 시 개인 인증과 같은 방식으로 Brute Force 공격을 막을 수 있다
로그인할 때 개인 인증을 추가로 하는 경우는 국가 기관과 같이 엄청 중요한 곳이나 은행과 같이 평소에 이용은 자주 안 하지만 중요한 곳에 적용을 할 수 있다
Secure Coing In Ubuntu
로그인 횟수 제한하기
칼리 리눅스에서 우분투로 공격을 진행했다
<?php
$dbcon = mysqli_connect("localhost", "ruang", "ruang", "test") or die("접속 실패");
$user = $_GET['username'];
$pass = $_GET['passwd'];
$query = "SELECT * FROM `dvwa_brute` WHERE username = '$user' AND passwd = '$pass';";
$result = mysqli_query($dbcon, $query);
if( $result && mysqli_num_rows($result) == 1 )
{
echo "<p>Welcome to the password protected area {$user}</p>";
}
else
{
sleep( 2 );
echo "<pre><br />Username and/or password incorrect.</pre>";
}
?>
기존 코드를 가져와서 실습하기 편하도록 수정했다
Brute Force 공격이 정상적으로 진행된다
<?php
$dbcon = mysqli_connect(데이터베이스 연결);
$query = "로그인 성공시 사용할 SQL 질의문";
$result = mysqli_query($dbcon, $query);
$user_query = "로그인 실패시 사용할 SQL 질의문";
$user_result = mysqli_query($dbcon, $user_query);
if (mysqli_num_rows($result) == 1)
{
$trys = mysqli_fetch_assoc($result);
$trynum = $trys['count'];
if ($trynum < 3)
{
//로그인 성공
}
}
else
{
$trys = mysqli_fetch_assoc($user_result);
$trynum = $trys['count'];
if ($trynum >= 3)
{
echo "<pre><br/>계정이 잠겼습니다. 비밀번호를 변경해주세요.</pre>";
mysqli_close($dbcon);
exit;
}
else
{
//로그인 실패
}
}
?>
로그인 시도 횟수를 1씩 증가하도록 하여 3회 이상이 되면 계정이 잠기도록 변경했다
Brute Force 공격을 진행하면 연결이 끊겨서 더 이상 공격을 할 수 없다