본문 바로가기
Projects/애플리케이션 보안

[bWAPP] Broken Auth. 비밀번호 무차별/사전 대입 공격 실습

by rimystory 2025. 9. 3.

실습 환경 구축은 이 글에 설명되어있다. (https://rimystory.tistory.com/18)

 

- 비밀번호 무차별 대입 공격: 사용자에 대한 계정 정보를 획득하기 위하여 비밀번호로 입력 가능한 모든 문자 조합을 입력하여 사용자의 계정과 비밀번호가 일치할 때까지 대입하는 공격.

- 비밀번호 사전 대입 공격: 사용자들이 가장 즐겨 쓰는 비밀번호를 사전처럼 기록한 파일에 있는 문자열을 하나씩 대입하는 공격. 무차별 대입 공격보다 공격 속도는 빠르나 사전 파일에 비밀번호 정보가 없다면 공격은 실패한다.

 

1. 비밀번호 무차별 대입 공격

자동화 도구를 사용하기 위해 웹 사이트의 비밀번호 정책을 파악한 다음, 조합할 문자의 구성과 최소 문자열 길이를 정해야 한다.

문자와 숫자가 조금만 복잡해도 가능한 조합의 가지 수가 많아져 시간이 많이 걸린다.

 

1) 버프스위트 실행 - Proxy - Open browser - 비박스 접속 - ba_pwd_attacks_1.php 페이지에 접속한다.

 

2) 버프스위트로 돌아가서 Intercept를 누르고 페이지에 다시 접속하여 Login 버튼을 클릭한다.

http 요청을 가로채어 자동으로 버프스위트로 돌아온다.

 

3) 요청을 오른쪽 클릭하고 Intruder로 보낸다. (Send to Intruder)

 

4) 주황색 글씨가 된 Intruder로 들어가서 대입 공격할 페이로드 위치를 Add∮(?) 버튼으로 지정한다.

(공격을 수행할 사용자 아이디는 'bee'로 지정한다.)

5) Payload type을 Brute forcer로 지정한다.

6) Min length와 Max length를 지정하고 Start attack을 누른다.

참고로 연산 수행 시간이 꽤 오래 걸린다.

(메모리 크기와 CPU 개수도 좀 늘려줬는데 자꾸 칼리 리눅스 자체가 뻗어서 Character set을 임의로 줄였다.)

 

7) 무차별 대입 공격이 실행되는 창으로 이동된다. 그 중 결과 값이 다르게 나오는 페이로드를 찾는다.

상태 코드가 다르거나 페이로드 길이(Length)가 다르다. (±1의 오차는 무시한다)

 

8) 결과 값이 다른 페이로드를 클릭하면 결과 페이지 하단에 뜨는 [Response -> Render] 탭을 눌러 응답 페이지를 볼 수 있다.

'bug'가 페이로드로 실렸을 때 로그인에 성공하므로 'bee' 사용자의 비밀번호는 'bug'인 것을 알 수 있다.

 

2. 비밀번호 사전 대입 공격

1) 칼리 리눅스에서 사전 공격에 사용할 비밀번호 목록 파일(FuzzDB)을 다운로드한다.

(https://github.com/fuzzdb-project/fuzzdb)

- FuzzDB: 퍼징에 사용되는 입력 값을 모은 데이터베이스. 국가나 사용 환경에 따라 다른 입력 값을 제공해서 유용하다.

- 퍼징(Fuzzing): 악의적인 입력 값을 주입하여 취약점 여부를 찾는 기법.

 

2) fuzzdb-master.zip을 열고, /fuzzdb-master/wordlists-user-passwd/passwds/phpbb.txt 파일을 압축 해제 한다.

 

3) 버프스위트에서 'ba_weak_pwd.php' 페이지의 요청을 가로채고 Intruder로 전송한다. (무차별 대입 공격과 같음)

 

4) 공격 타입을 Cluster Bomb으로 지정한다. (아이디와 비밀번호 둘 다 모르는 상태라고 가정)

5) Payload position 1은 login 변수, 2는 password 변수를 공격하는 페이로드이다.

6) Payload type은 둘 다 Simple list로 지정한다.

7) 그 밑의 Load를 눌러 다운 받은 'phpbb.txt' 파일을 불러온다. (또한 Add 버튼을 눌러 예상 문자를 임의로 추가할 수 있다.)

8) 설정 후 Start attack을 누르면 공격이 시작된다.

 

(주의: 총 단어 수가 18만개 정도라서 연산 수행 시간이 매우 오래 걸린다! 일부 텍스트만 추출해서 돌리는 것을 추천)

 

9) 무차별 대입 공격이 실행되는 창으로 이동된다. 그 중 페이로드 길이(Length)가 다르게 나오는 페이로드를 찾는다.

10) 결과 값이 다른 페이로드를 클릭하면 결과 페이지 하단에 뜨는 [Response -> Render] 탭을 눌러 응답 페이지를 볼 수 있다.

 

로그인이 성공한 것으로 보아 아이디/비밀번호는 test/test 인 것을 알 수 있다.

 

3. 대응방안

취약한 비밀번호는 회원가입 시 비밀번호 유효성 검사(정규 표현식)를 통하여 방지할 수 있다.

클라이언트 스크립트에서 처리하면 우회가 가능하므로 서버사이드 스크립트에서 처리해야 한다.

 

PHP에서는 'preg_match' 함수를 사용하여 비밀번호의 길이를 지정하거나 특수 문자, 숫자, 영문이 포함되었는지 검사한다.

 

(비밀번호 규칙 예시)

if(!preg_match('/^(?=.*\d)(?=.*[A-Za-z])[0-9A-Za-z!@#$%]{8,20}$/', $password)) {
	echo '영문자, 숫자 포함 8~20자 (특수문자: !@#$%만 허용)'
}