보안개구리

[게시판 실습] - 약한 문자열 강도 (2) 로그인 실패 시 로그인 제한 결여 본문

웹 진단/게시판 실습

[게시판 실습] - 약한 문자열 강도 (2) 로그인 실패 시 로그인 제한 결여

보안개구리 2024. 5. 30. 11:53

[설 명]

 약한 문자열 강도 취약점은 웹 사이트에서 취약한 패스워드로 회원가입이 가능할 경우 공격자는 추측 및 주변 정보를 수집하여 작성한 사전 파일로 대입을 시도하여 사용자 계정을 탈취할 수 있는 취약점으로 해당 취약점 존재 시 유추가 용이한 계정 및 패스워드의 사용으로 인한 사용자 권한 탈취 위험이 존재하며, 위험을 방지하기 위해 값의 적절성 및 복잡성을 검증하는 로직을 구현하여야 한다.

 

[점검 내용]

 웹 페이지 내 로그인 폼 등에 약한 강도의 문자열 사용 여부

 

[점검 기준]

 관리자 계정 및 패스워드가 유추하기 쉬운 값으로 설정되어 있으며, 일정 횟수 이상 인증 실패 시 로그인을 제한하고 있지 않은 경우 취약

 

[대응 방법]

 * 취약한 계정 및 패스워드를 삭제하고, 사용자가 취약한 계정이나 패스워드를 등록하지 못하도록 패스워드 규정이 반영된 체크 로직을 회원가입, 정보변경, 패스워드 변경 등 적용 필요한 페이지에 모두 구현

 * 로그인 시 패스워드 입력 실패가 일정 횟수(3~5회) 이상 초과 시 관리자에게 통보 및 계정 잠금

 

[진단 과정]

1) 'hacker'계정으로 로그인 시 임의의 패스워드로(1) 로그인을 시도합니다. 다수의 로그인 실패에도 불구하고 계속해서 로그인 시도가 가능합니다.

로그인 다수 실패 시도

 

2) 이를 통해 해당 사이트는 일정 횟수 이상으로 로그인을 실패새도 로그인 제한이 없는 것을 확인할 수 있습니다.

 로그인 제한이 없는 경우는 무차별 대입공격(Brute-Force attack) 에 취약할 수 있습니다. 프록시 도구(BurpSuite)를 통하여 무차별 대입공격을 시도해보겠습니다. 

 * 무차별 대입공격(Brute-Force attack) : 특정한 암호를 풀기 위해 가능한 모든 값을 대입하는 공격

 

3)  해당 과정은 실습이기 때문에 패스워드 조회 시 100~130까지의 숫자만 입력하도록 하겠습니다. 

 공격을 시도한 결과 '123'라는 패스워드 입력시 응답값 내 길이가 다르며 (Length:242 -> 로그인 실패, Length:285 -> 로그인 성공, Length:264 -> 이미 로그인된 상태) 응답값 확인 결과 로그인에 성공한 것을 확인하였습니다.

패스워드 확인

 

4) 약한 문자열 강도 (1) 실습처럼 패스워드를 복잡하게 만드는 것과 더불어 일정 횟수 이상 로그인 실패 시 로그인을 제한하는 검증 로직이 필요합니다. 

 

5) 소스코드 확인 결과 로그인 시 아이디 패스워드 일치 여부만 확인할 뿐 로그인 횟수 제한은 없음을 확인하였습니다.

소스코드 확인

 

6) 소스코드 내 로그인 실패 시 카운터를 증가시켜 카운터가 5회 이상 시 계정을 잠금시키는 로직을 추가하였습니다.

소스코드 추가

 

7) 소스코드 수정 후  Brute-Force attack을 시도해보겠습니다. 범위는 마찬가지로 100~130까지로 해서 진행 후 결과 확인 시 4회까지는 계정정보가 일치하지 않는다는 응답값을 받았으나 5회 이상부터는 계정이 잠금되어 로그인할 수 없다는 메시지가 출력되었으며 기존 패스워드인 '123'이라는 값이 입력되도 로그인이 가능하지 않음을 확인하였습니다.

패스워드 불일치 후 메시지
계정 잠금 후 메시지
로그인 5패 이상 실패 시 계정 잠금 확인