[OWASP Top 10 2021] 07 - Identification and Authentication Failures (식별 및 인증 실패)

·2025년 8월 16일
1

OWASP Top 10 2021

목록 보기
7/10

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) 열거 및 비밀번호 무차별 대입에 취약하다. 사용자 이름과 비밀번호 후보 리스트가 주어진다. 무차별 공격 대입으로 사용자의 이름과 비밀번호를 알아내 로그인에 성공하라.

공격 과정 요약

  1. Burp를 실행한 상태에서 로그인 페이지를 조사한다. 아직 사용자 이름과 비밀번호를 모르기에 아무 값을 넣어 로그인에 시도한다. 나는 사용자 이름과 비밀번호에 1을 대입하였다.
  2. Proxy > HTTP history 로 이동하여 POST /login 요청을 찾는다. 요청 안의 파라미터에서 username=1 를 드래그 하고, 우클릭 하여 Send to Intruder 를 선택힌다.
  3. Intruder 에 들어오면, 드래그 된 부분이 $1$로 되어 있는걸 확인할 수 있다.
  1. Sniper attack이 선택되었는지 확인하고, 페이로드 우측 패널에서 Simple list 페이로드 타입이 선택되었는지 확인한다.

  2. Payload configuration 에서, 사용자 이름 리스트를 업로드 한다. 리스트는 문제에서 주어지고, 미리 메모장에 복사 해 두어 매모장 파일을 업로드 하였다.

  3. 주황색의 Start attack 버튼을 누른다.

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

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

발생한 보안 문제

  • 무차별 공격을 허용해 주었다는게 가장 큰 문제이다. 이미 Burp 등의 틀에서 무차별 공격은 매우 쉽게 시도할 수 있다. 이를 방지하는 기능이 없다면 공격에 매우 취약한 상태가 된다.
  • 사용자의 이름이 ap 이고, 비밀번호가 112233 인 것은 너무 쉬운 값을 비밀번호로 이용할 수 있게 허용한 것이다. 서버 상에서 너무 간단해 유추가 쉬운 값은 비밀번호로 사용하지 못하도록 막는 기능이 필요하다.

배운 점

  • 보안에는 비밀번호 보안이 정말 중요함을 다시 한번 알게 되었다.
  • 비밀번호는 사용자가 정하는 것이니 너무 쉬운 값이거나 예상 가능한 값으로 설정한다면 사용자의 잘못이지 않나 생각했었는데, 사용자가 애초에 쉬운 비밀번호를 설정하지 못하도록 하는게 보안 전문자가 고민해야할 점이라는 것을 알게 되었다.
  • 누구나 쉽게 툴을 사용하여 무차별 공격을 할 수 있음을 알게 되었고, 이를 방지하는 기능이 꼭 필요함을 알게 되었다.
  • 공공 PC 에서 내 계정으로 로그인 하고, 제대로 로그아웃도 안하고 자리를 뜨는 경우가 있었는데, 취약한 PC일 수 도 있으니 이러한 것을 경계해야겠다는 생각을 하였다.
profile
CTF 풀이 및 실습 중심 학습을 기록합니다.

0개의 댓글