웹 해킹/portswigger

버프스위트를 이용한 웹 해킹, 인증 취약점: 비밀번호 기반 로그인의 취약점 ①

코드라니(CODERANY) 2026. 4. 2. 00:33

비밀번호 기반 로그인의 취약점

비밀번호 기반 로그인 방식을 사용하는 웹사이트의 경우, 사용자는 직접 계정을 등록하거나 관리자로부터 계정을 할당받습니다. 이 계정은 고유한 사용자 이름과 비밀번호와 연결되어 있으며, 사용자는 로그인 양식에 이를 입력하여 본인 인증을 합니다.

이 시나리오에서는 사용자가 비밀번호를 알고 있다는 사실 자체가 사용자의 신원을 입증하는 충분한 증거로 간주됩니다. 즉, 공격자가 다른 사용자의 로그인 정보를 획득하거나 추측할 수 있다면 웹사이트의 보안이 위협받게 됩니다.

이는 여러 가지 방법으로 달성할 수 있습니다. 다음 섹션에서는 공격자가 무차별 대입 공격을 사용하는 방법과 무차별 대입 방어의 몇 가지 취약점을 보여줍니다. 또한 HTTP 기본 인증의 취약점에 대해서도 알아봅니다.

무차별 대입 공격

무차별 대입 공격은 공격자가 시행착오 방식을 사용하여 유효한 사용자 자격 증명을 추측하는 공격입니다. 이러한 공격은 일반적으로 사용자 이름과 비밀번호로 구성된 단어 목록을 이용해 자동화됩니다. 특히 전용 도구를 사용하여 이 과정을 자동화하면 공격자는 엄청난 수의 로그인 시도를 매우 빠른 속도로 수행할 수 있습니다.

무차별 대입 공격은 단순히 사용자 이름과 비밀번호를 무작위로 추측하는 것만이 아닙니다. 공격자는 기본적인 논리나 공개적으로 이용 가능한 정보를 활용하여 더욱 정교한 추측을 통해 무차별 대입 공격을 실행할 수 있습니다. 이는 공격 효율을 크게 높여줍니다. 비밀번호 기반 로그인을 유일한 사용자 인증 방식으로 사용하는 웹사이트는 충분한 무차별 대입 공격 방지 대책을 마련하지 않으면 매우 취약해질 수 있습니다.

사용자 이름은 이메일 주소처럼 쉽게 알아볼 수 있는 패턴을 따르는 경우 특히 추측하기 쉽습니다. 예를 들어, 회사 로그인 아이디는 흔히 `@username.com` 형식으로 firstname.lastname@somecompany.com으로 작성 되어 있는 것을 볼 수 있습니다. 하지만 명확한 패턴이 없더라도, 때로는 높은 권한을 가진 계정조차도 ` administrator `이나 `admin`과 같이 예측 가능한 사용자 이름을 사용하여 생성되는 경우가 있습니다 .

보안 감사를 진행할 때는 웹사이트에서 잠재적인 사용자 이름이 공개적으로 노출되는지 확인해야 합니다. 예를 들어, 로그인하지 않고도 사용자 프로필에 접근할 수 있는지 살펴보세요. 프로필의 실제 내용이 숨겨져 있더라도 프로필에 사용된 이름이 로그인 시 사용한 사용자 이름과 동일한 경우가 있습니다. 또한 HTTP 응답을 확인하여 이메일 주소가 노출되는지 확인해야 합니다. 간혹 응답에 관리자나 IT 지원 담당자와 같은 고위 권한 사용자의 이메일 주소가 포함되어 있는 경우가 있습니다.

비밀번호 무차별 대입 공격

비밀번호 역시 무차별 대입 공격에 취약하며, 난이도는 비밀번호 강도에 따라 달라집니다. 많은 웹사이트에서는 사용자가 높은 엔트로피를 가진 비밀번호를 생성하도록 하는 비밀번호 정책을 시행하고 있는데, 이는 이론적으로 무차별 대입 공격만으로는 해킹하기 어렵게 만듭니다. 일반적으로 이러한 정책은 다음과 같은 요소들을 비밀번호에 적용합니다.

  • 최소 문자 수
  • 소문자와 대문자의 혼합
  • 특수 문자 하나 이상

하지만 높은 엔트로피를 가진 비밀번호는 컴퓨터 단독으로는 해독하기 어렵지만, 우리는 인간 행동에 대한 기본적인 지식을 활용하여 사용자들이 무심코 시스템에 도입하는 취약점을 악용할 수 있습니다. 사용자들은 무작위 문자열 조합으로 강력한 비밀번호를 만드는 대신, 기억하기 쉬운 비밀번호를 사용하고 이를 비밀번호 정책에 억지로 끼워 맞추려고 시도하는 경우가 많습니다. 예를 들어, mypassword가 허용되지 않으면 사용자는 또는 와 mypassword1!나 Myp4$$w0rd와 같은 다른 비밀번호를 시도할 수 있습니다 . 

정책상 사용자가 정기적으로 비밀번호를 변경해야 하는 경우, 사용자는 일반적으로 선호하는 비밀번호에 사소하고 예측 가능한 변경만 하는 경우가 많습니다. 예를 들어, Mypassword1!Mypassword1?가 되거나 .Mypassword2! 되는 식입니다.

이처럼 예상되는 자격 증명과 예측 가능한 패턴에 대한 지식은 무차별 대입 공격이 단순히 모든 가능한 문자 조합을 반복하는 것보다 훨씬 더 정교하고 효과적일 수 있음을 의미합니다.

사용자 이름 열거형

사용자 이름 열거는 공격자가 웹사이트의 동작 변화를 관찰하여 특정 사용자 이름이 유효한지 여부를 확인하는 방식입니다.

사용자 이름 열거 공격은 일반적으로 로그인 페이지에서, 예를 들어 유효한 사용자 이름을 입력했지만 비밀번호를 잘못 입력했을 때 또는 회원가입 양식에서 이미 사용 중인 사용자 이름을 입력했을 때 발생합니다. 공격자는 이러한 방식으로 유효한 사용자 이름 목록을 빠르게 생성할 수 있으므로 무차별 대입 공격에 필요한 시간과 노력을 크게 줄일 수 있습니다.

 

로그인 페이지를 무차별 대입 공격할 때는 다음과 같은 차이점에 특히 주의해야 합니다.

  • 상태 코드 : 무차별 대입 공격 시 대부분의 추측이 틀리기 때문에 반환되는 HTTP 상태 코드는 대부분 동일할 가능성이 높습니다. 만약 추측이 다른 상태 코드를 반환한다면, 이는 사용자 이름이 정확했을 가능성이 크다는 것을 의미합니다. 웹사이트는 결과와 관계없이 항상 동일한 상태 코드를 반환하는 것이 바람직하지만, 실제로는 항상 지켜지는 것은 아닙니다.
  • 오류 메시지 : 사용자 이름과 비밀번호가 모두 틀린 경우와 비밀번호만 틀린 경우에 따라 반환되는 오류 메시지가 다를 수 있습니다. 웹사이트에서는 두 경우 모두 동일한 일반적인 메시지를 사용하는 것이 가장 좋지만, 사소한 오타로 인해 오류가 발생할 수 있습니다. 문자 하나만 잘못 입력해도 두 메시지가 다르게 표시될 수 있으며, 해당 문자가 화면에 표시되지 않더라도 차이가 발생할 수 있습니다.
  • 응답 시간 : 대부분의 요청이 비슷한 응답 시간으로 처리되었다면, 이 범위를 벗어나는 요청은 백그라운드에서 다른 작업이 진행되고 있음을 시사합니다. 이는 추측한 사용자 이름이 맞을 가능성을 보여주는 또 다른 증거입니다. 예를 들어, 웹사이트는 사용자 이름이 유효한 경우에만 비밀번호의 유효성을 검사할 수 있습니다. 이러한 추가 단계로 인해 응답 시간이 약간 증가할 수 있습니다. 이는 미미할 수 있지만, 공격자는 웹사이트에서 처리하는 데 눈에 띄게 오래 걸리는 지나치게 긴 비밀번호를 입력하여 이러한 지연을 더욱 명확하게 만들 수 있습니다.

 

Burp를 실행한 상태에서 로그인 페이지를 조사하고 유효하지 않은 사용자 이름과 비밀번호를 입력하십시오.

버프 스위트 에서 프록시 > HTTP 기록 으로 이동하여 해당 요청 POST /login을 찾습니다 . 요청에서 매개변수 username을 강조 표시 하고 Burp Intruder로 보냅니다.

Burp Intruder에서 username매개변수가 페이로드 위치로 자동으로 설정되는 것을 확인하세요. 이 위치는 §(섹션,Section)기호로 표시됩니다.

username=§invalid-username§

비밀번호는 일단 임의의 고정 값으로 두세요.

저격수 공격이 선택되어 있는지 확인하십시오 .페이로드 사이드 패널 에서 'Simple list(간단한 목록)' 페이로드 유형이 선택되어 있는지 확인하십시오 .

페이로드 구성 에서 후보 사용자 이름 목록을 Paste를 통해 붙여넣으세요. 마지막으로 Start attack을 클릭하고, 공격을 시작하세요 . 공격은 새 창에서 시작됩니다.

공격이 완료되면 결과 테이블의 길이 열을 확인하세요. 열 헤더를 클릭하면 결과를 정렬할 수 있습니다. 항목 중 하나가 다른 항목보다 더 긴 것을 확인할 수 있습니다. 이 페이로드에 대한 응답을 다른 응답과 비교해 보세요. 다른 응답에는 Invalid username메시지가 포함되어 있지만 , 이 응답에는 Incorrect password가 포함되어 있는 것을 알 수 있습니다. 페이로드 열에 있는 사용자 이름을 기록해 두세요.

공격을 종료하고 침입자 탭으로 돌아갑니다. [Clear §]을 클릭한 다음, username방금 확인한 사용자 이름으로 매개변수를 변경합니다. password매개변수에 페이로드 위치를 추가합니다. 결과는 다음과 같아야 합니다.

username=identified-user&password=§invalid-password§

페이로드 사이드 패널 에서 사용자 이름 목록을 지우고 후보 암호 목록으로 바꿉니다. Start attack을 클릭하고, 공격을 시작하세요 . 공격은 새 창에서 시작됩니다.

공격이 완료되면 상태(Status )열을 확인하세요. 모든 요청에 ​​상태 코드가 포함된 응답이 전송되었지만 200, 하나의 요청에만 응답(302)이 전송된 것을 알 수 있습니다. 이는 로그인 시도가 성공했음을 의미하며, 페이로드에 있는 비밀번호를 기록해 두세요.

확인하신 사용자 이름과 비밀번호를 사용하여 로그인하고 사용자 계정 페이지에 접속하여 실습을 완료하세요.

클러스터 폭탄 공격 하나로 무차별 대입 공격을 시도하는 것도 가능합니다. 하지만 일반적으로는 먼저 유효한 사용자 이름을 파악하는 것이 훨씬 효율적입니다.

1. 버프 스위트 가 실행 중인 상태에서 버프 스위트 브라우저를 엽니다. 홈페이지에 접속하고 로그인 창에서 유효하지 않은 사용자 이름과 비밀번호를 입력합니다. 요청에서 해당 매개변수 POST /login의 username을 강조 표시하고 Burp Intruder로 전송합니다.


2. Burp Intruder에서 username매개변수가 페이로드 위치로 자동으로 설정되는 것을 확인하세요. 이 위치는 §(섹션,Section)기호로 표시됩니다.

▶ 페이로드: 목적을 달성하기 위해 실어 보내는 알맹이(데이터)


3. 페이로드 사이드 패널 에서 '간단한 목록' 페이로드 유형이 선택되어 있는지 확인하고 후보 사용자 이름 목록을 추가하세요.

4. 설정 탭을 클릭하여 설정 사이드 패널을 엽니다 . Grep - Extract 아래에서 추가를 클릭합니다. 나타나는 대화 상자에서 응답을 아래로 스크롤하여 오류 메시지 Invalid username or password를 찾습니다. 마우스를 사용하여 메시지의 텍스트 내용을 강조 표시합니다. 다른 설정은 자동으로 조정됩니다. OK를 클릭한 다음 Start attack을 클릭해 공격을 시작합니다.

5. 공격이 완료되면 추출한 오류 메시지가 포함된 추가 열이 생성된 것을 확인할 수 있습니다. 이 열을 기준으로 결과를 정렬하면 그중 하나가 미묘하게 다르다는 것을 알 수 있습니다. 이 답변을 자세히 살펴보시고 오류 메시지에 오타가 있는지 확인해 보세요. 마침표 대신 공백이 있습니다. 이 사용자 이름을 메모해 두세요.

6. 결과 창을 닫고 Intruder(침입자)탭으로 돌아갑니다. 방금 확인한 사용자 이름을 입력하고 페이로드 위치를 password매개변수에 추가합니다. 페이로드 사이드 패널에서 사용자 이름 목록을 지우고 암호 목록으로 교체합니다. 공격을 시작하세요.

username=identified-user&password=§invalid-password§

9. 공격이 완료되면 요청 중 하나가 302응답을 받았음을 확인하십시오. 이 암호를 기록해 두세요.


10. 확인하신 사용자 이름과 비밀번호를 사용하여 로그인하고 사용자 계정 페이지에 접속하면 클리어!

덧, 클러스터 폭탄 공격 하나로 무차별 대입 공격을 시도하는 것도 가능합니다. 하지만 일반적으로는 먼저 유효한 사용자 이름을 파악하는 것이 훨씬 효율적입니다.

버프 스위트 가 실행 중인 상태에서 버프 스위트 브라우저를 엽니다. 홈페이지에 접속하고 로그인 창에서 유효하지 않은 사용자 이름과 비밀번호를 입력합니다. 요청에서 해당 매개변수 POST /login의 username을 강조 표시하고 Burp Intruder로 전송합니다.

잘못된 로그인 시도가 너무 많으면 IP 주소가 차단될 수 있다는 점에 유의하세요.

Burp를 실행한 상태에서 유효하지 않은 사용자 이름과 비밀번호를 입력한 다음 POST /login을 Repeater로 보내세요. 다양한 사용자 이름과 비밀번호를 사용해 실험해 보세요. (일단 차단 되어야 아이피를 바꿔 공격하는게 되는지 알 수 있기 때문)

차단 당했다!


해당 X-Forwarded-For헤더가 지원되는지 확인하여 IP 주소를 위장하고 IP 기반 무차별 대입 공격 방지 기능을 우회할 수 있습니다.

X-Forwarded-For:1

다양한 사용자 이름과 비밀번호를 바꿔가며 계속 실험해 보세요. 특히 응답 시간에 주의를 기울이세요. 사용자 이름이 유효하지 않을 때는 응답 시간이 거의 동일하지만, 유효한 사용자 이름(본인의 이름)을 입력하면 입력한 비밀번호의 길이에 따라 응답 시간이 증가하는 것을 알 수 있습니다.

? 길이에 따른 응답시간도 있나봄. 아이디가 길면 응답시간도 길어지는 듯
Intruder에 이 요청을 보내고 공격 유형 드롭다운 메뉴에서 Pitchfork attack을 선택하고 X-Forwarded-For 헤더를 추가합니다.

X-Forwarded-For:1

X-Forwarded-For헤더와 username파라미터에 페이로드를 추가하세요 . 비밀번호는 매우 긴 문자열(약 100자 정도)로 설정하세요.

페이로드 사이드 패널 에서 페이로드 위치 드롭다운 목록 1을 선택합니다. 숫자 페이로드 유형을 선택합니다. 1~101 범위를 입력하고 단계를 1로 설정합니다. 최대 소수 자릿수를 0으로 설정합니다. 이 값은 IP 주소를 위장하는 데 사용됩니다.

공격이 안 되는 결정적인 이유 (Payload count 불일치)
보내주신 사진들의 오른쪽 Payloads 설정을 비교해 볼게요.
Payload 1 (IP 주소): Numbers 타입으로 100개 설정되어 있습니다. (1번 사진)
Payload 2 (Username): Simple list 타입으로 101개가 들어가 있습니다. (2번 사진)
문제점: Pitchfork는 "1번 IP - 1번 ID", "2번 IP - 2번 ID" 이렇게 짝을 지어서 던지는데, 지금 ID는 101개인데 IP는 100개뿐이라 마지막 한 놈의 짝이 없습니다. Burp Suite는 이렇게 짝이 안 맞으면 공격을 시작하지 않거나 에러를 냅니다.

페이로드 위치 드롭다운 목록 2에서 위치를 선택한 다음 사용자 이름 목록을 추가합니다. 공격을 시작하세요.

요.

공격이 완료되면 대화 상자 상단에서 [열]을 클릭하고 [수신된 응답] 및 [응답 완료] 옵션을 선택합니다 . 이제 결과 표에 이 두 열이 표시됩니다.


응답 시간 중 하나가 다른 것들보다 훨씬 길다는 것을 확인하세요. 이 요청을 몇 번 반복하여 일관적으로 더 오래 걸리는지 확인한 다음 해당 사용자 이름을 기록해 두세요.

동일한 요청에 대해 새로운 Burp Intruder 공격을 생성합니다. X-Forwarded-For헤더를 다시 추가하고 페이로드 위치를 추가합니다. 방금 확인한 사용자 이름을 입력하고 password매개변수에 페이로드 위치를 추가합니다. 페이로드 사이드 패널 에서 숫자 목록을 페이로드 위치 1에 추가하고 암호 목록을 페이로드 위치 2에 추가합니다. 공격을 시작합니다.

공격이 완료되면 302상태 정보가 포함된 응답을 찾으세요. 이 암호를 기록해 두세요.

확인하신 사용자 이름과 비밀번호를 사용하여 로그인하고 사용자 계정 페이지에 접속하여 실습을 완료하세요.


클러스터 폭탄 공격 하나로 무차별 대입 공격을 시도하는 것도 가능합니다. 하지만 일반적으로는 먼저 유효한 사용자 이름을 파악하는 것이 훨씬 효율적입니다.