[WARGAME] DVWA write-up/ Brute Force(+SQL_Injection) / low

jckim22·2022년 10월 17일
1

[WEBHACKING] STUDY (WARGAME)

목록 보기
17/114

첫번째 문제는 간단한 Brute Force 기법으로 풀 수 있는 문제이다.
파이썬으로 코드를 짤 수도 있겠지만 이번에는 버프슈트를 이용해보았다.

전에 드림핵 워게임에서도 Brute Force 기법은 자주 사용했었다.

워게임과 다른점은 힌트같은 것도 없고 그저 취약한 웹사이트를 해킹한다는 느낌을 주는 것이 다른점 같다.

보안 레벨을 low로 설정하였더니 로그인에서 데이터 전송을 일반벅인 POST가 아닌 GET 방식으로 요청한다.

그리고 아래는 경로를 따라서 직접 백엔드 파일을 들어가 본것이다.

<?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 = 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
		$html .= "<p>Welcome to the password protected area {$user}</p>";
		$html .= "<img src=\"{$avatar}\" />";
	}
	else {
		// Login failed
		$html .= "<pre><br />Username and/or password incorrect.</pre>";
	}

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

?>

GET방식으로 받는 것을 모자라서 필터링이 아예 없는 것을 알 수 있다.
사용자가 어떤 코드를 입력하여도 그 코드가 실행될 것이다.

이번 주제인 브루트 포스와는 다른 주제이지만 xss,csrf는 물론 sql_injection도 가능하다.

번외로 sql_injection을 사용하여 로그인 해보겠다.
코드에 쿼리를 확인하니

아래와 같다.

"SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";

나는 user라는 변수에다가 admin' -- 이라는 쿼리를 입력하고 싶다.
admin이라는 id가 있다는 전제하에 쓰는 쿼리이다.
그렇게 되면

"SELECT * FROM `users` WHERE admin' -- = '$user' AND password = '$pass';";

이러한 코드가 될 것인데 뒤에 -- 뒤에 부분은 주석처리가 되어 id가 admin인 계정, 단 하나의 조건으로 계정을 찾아줄 것이다.

실제로 입력해보고

로그인이 된 것을 알 수 있다.

매우 취약한 웹페이지임을 알 수 있다.

이제 진짜 주제인 브루트포스 공격을 해보자

먼저 아래는 로그인 폼이다.
패킷을 캡처하기 위해 아무 값이나 넣어보았다.

아래는 캡처한 http 요청에 대한 패킷이다.
이제 브루트 포스 공격을 할 수 있는 intruder에게 이 내용을 보내보자

intruder에서 내용을 받았지만 sniper로 attact type이 설정 되어있기 때문에 하나의 페이로드 밖에 공격할 수 없다.

그래서 두개의 페이로드를 동시 다발적으로 브루트포스를 해주는 Cluster bomb 타입으로 변경해주었다.

그 후 payload set 1에는 의심되는 id 리스트를 추가하고

set 2에는 의심되는 pw 리스트를 추가해줬다.

그리고 attack을 시작하면 이렇게 cluster bomb 타입으로 공격이 진행된다.
중간의 패킷 길이가 다른 응답이 하나 있는 걸 볼 수 있다.

id=admin이고 pw=password 라는 페이로드였다.
결국 이 값만 패킷길이가 다르기 때문에 로그인이 성공하는 아이디 비밀번호임을 알 수 있다.

찾아낸 계정으로 로그인 하면 성공적으로 로그인 할 수 있다.

profile
개발/보안

0개의 댓글