07 - Identification and Authentication Failures
https://owasp.org/Top10/A07_2021-Identification_and_Authentication_Failures/
개요
OWASP Top 10 2021 중 7위로 올라간 Identification_and_Authentication_Failures (식별 및 인증 실패) 이다.
- 예전의 Broken Authentication(깨진 인증)에서 이름이 바뀐 것으로, 이제 식별(누구인지 확인) 단계에서의 실패도 함께 다룬다.
위험 요인
- 무차별 대입 등의 자동화 공격을 허용할 경우
- 기본 비밀번호나 약하고 널리 알려진 비밀번호(예: Password1, admin/admin)의 사용을 허용할 때
- 비밀번호 찾기 기능이나 복구 절차가 취약할 경우
- 비밀번호 저장소가 평문/해시가 아닌 암호화'만' 사용하거나, 약한 해시를 사용할 경우
- 다단계 인증이 없거나 의미가 없을 경우
- 세션 ID를 URL에 노출하는 경우
- 로그인 전 발급된 세션ID를 로그인 후에도 그대로 사용하는 경우
- 로그아웃을 해도 서버 측 세션이 살아있는 경우(세션 무효화 실패)
방지 방법
- 사용자가 로그인 할 때 서로 다른 종류의, 두개 이상의 인증 요소를 요구하는 MFA를 도입한다.
- 기본 자격 증명을 금지한다. 특히 관리자 계정은 절대 기본값으로 배포하지 않는다.
- 약한 비밀번호를 검증한다. 새로운 비밀번호를 약한 비밀번호 목록과 대조하여, 일치하면 사용하지 못하게 차단한다.
- 비밀번호 정책은 NIST SP 800-63B(§5.1.1) 같은 근거 기반 정책에 맞춘다.
-NIST SP 800-63B(§5.1.1) : 미국 NIST (국립표준기술연구소)에서 발행한 디지털 인증 가이드라인 문서.
- 회원가입/복구/API에서 결과 메시지를 동일하게 처리해 존재 여부를 유추 못 하도록 계정 열거를 방지한다.
- 록인 실패 횟수를 제한한다.
- 서버측에서 안전한 세션 관리자를 사용한다.
- 로그인 후 고엔트로피(무작위성이 높은)의 새 세션 ID 재발급, URL에 세션 ID 금지, 쿠키 안전하게 저장
- 로그아웃/유휴/절대 타임아웃 시 세션 무효화 필수, SSO 토큰 (여러 서비스가 하나의 인증 토큰으로 로그인 됨)도 무효화
공격 예시
- 자격 증명 채우기
- 유출 리스트로 대량 로그인에 시도한다. 자동화 공격 방어가 없다면 해당 사이트는 비밀번호 오라클처럼 유효 여부를 확인해주는 도구가 된다.
- 비밀번호 단일요소 의존
- 비밀번호만 이용하는 인증은 공격의 표적이 된다. 하지만 비밀번호를 자주 변경하게 하면 사용자의 비밀번호 재사용을 부추겨 역효과가 난다. 따라서 MFA를 권장한다.
- 세션 타임아웃 부실
- 공용 PC에서 로그아웃 과정을 거치지 않고 자리를 비웠는데, 한 시간 뒤 공격자가 같은 브라우저로 접근했더니 인증이 아직까지 유지되는 경우이다. 타임아웃/무효화의 구성이 잘못된 경우 발생한다.
실습 환경
PortSwigger Web Security Academy - Lab: Username enumeration via different responses
https://portswigger.net/web-security/authentication/password-based/lab-username-enumeration-via-different-responses
문제 설명
이 랩은 사용자 이름 (username) 열거 및 비밀번호 무차별 대입에 취약하다. 사용자 이름과 비밀번호 후보 리스트가 주어진다. 무차별 공격 대입으로 사용자의 이름과 비밀번호를 알아내 로그인에 성공하라.
공격 과정 요약
Burp
를 실행한 상태에서 로그인 페이지를 조사한다. 아직 사용자 이름과 비밀번호를 모르기에 아무 값을 넣어 로그인에 시도한다. 나는 사용자 이름과 비밀번호에 1을 대입하였다.
Proxy > HTTP history
로 이동하여 POST /login
요청을 찾는다. 요청 안의 파라미터에서 username=1 를 드래그 하고, 우클릭 하여 Send to Intruder
를 선택힌다.
Intruder
에 들어오면, 드래그 된 부분이 $1$
로 되어 있는걸 확인할 수 있다.

-
Sniper attack
이 선택되었는지 확인하고, 페이로드 우측 패널에서 Simple list
페이로드 타입이 선택되었는지 확인한다.
-
Payload configuration
에서, 사용자 이름 리스트를 업로드 한다. 리스트는 문제에서 주어지고, 미리 메모장에 복사 해 두어 매모장 파일을 업로드 하였다.

-
주황색의 Start attack 버튼을 누른다.
-
공격이 끝나면, Length
가 다른 것과 다른 값을 찾는다. 길이가 달라졌다는 것은 서버측에서 틀린 값과는 다른 응답을 보냈다는 것이고, 즉 그 계정이 맞는 계정임을 유추해볼 수 있다.

username
의 매개변수를 방금 찾아낸 값 ap
로 변경한다. 이후 password
또한 사용자 이름을 찾던 것과 같은 과정을 거친다.
- 공격 후 상태를 확인해 보면, 상태 코드가
200
인 리스트 사이에 302
인 값이 존재함을 알 수 있다. 또한 길이도 눈에 띄게 짧다. 이 값을 비밀번호라고 유추해볼 수 있다.

- 찾아낸 사용자 이름과 비밀번호를 이용해 정상적으로 로그인에 성공할 수 있었다.

발생한 보안 문제
- 무차별 공격을 허용해 주었다는게 가장 큰 문제이다. 이미
Burp
등의 틀에서 무차별 공격은 매우 쉽게 시도할 수 있다. 이를 방지하는 기능이 없다면 공격에 매우 취약한 상태가 된다.
- 사용자의 이름이
ap
이고, 비밀번호가 112233
인 것은 너무 쉬운 값을 비밀번호로 이용할 수 있게 허용한 것이다. 서버 상에서 너무 간단해 유추가 쉬운 값은 비밀번호로 사용하지 못하도록 막는 기능이 필요하다.
배운 점
- 보안에는 비밀번호 보안이 정말 중요함을 다시 한번 알게 되었다.
- 비밀번호는 사용자가 정하는 것이니 너무 쉬운 값이거나 예상 가능한 값으로 설정한다면 사용자의 잘못이지 않나 생각했었는데, 사용자가 애초에 쉬운 비밀번호를 설정하지 못하도록 하는게 보안 전문자가 고민해야할 점이라는 것을 알게 되었다.
- 누구나 쉽게 툴을 사용하여 무차별 공격을 할 수 있음을 알게 되었고, 이를 방지하는 기능이 꼭 필요함을 알게 되었다.
- 공공 PC 에서 내 계정으로 로그인 하고, 제대로 로그아웃도 안하고 자리를 뜨는 경우가 있었는데, 취약한 PC일 수 도 있으니 이러한 것을 경계해야겠다는 생각을 하였다.