웹 해킹/portswigger

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

코드라니(CODERANY) 2026. 4. 21. 17:23

결함 있는 무력 보호

무차별 대입 공격은 공격자가 계정을 성공적으로 탈취하기 전에 수많은 실패를 겪을 가능성이 매우 높습니다. 따라서 무차별 대입 공격 방지는 자동화 과정을 최대한 어렵게 만들고 공격자가 로그인을 시도하는 속도를 늦추는 데 중점을 둡니다. 무차별 대입 공격을 방지하는 가장 일반적인 두 가지 방법은 다음과 같습니다.

  • 원격 사용자가 로그인 시도 횟수 초과 시 해당 계정을 잠급니다.
  • 원격 사용자가 짧은 시간 안에 너무 많은 로그인 시도를 할 경우 해당 사용자의 IP 주소를 차단합니다.

두 접근 방식 모두 다양한 수준의 보호 기능을 제공하지만, 특히 결함 있는 논리를 사용하여 구현된 경우 어느 방식도 완벽하지 않습니다.

예를 들어, 로그인 실패 횟수가 너무 많으면 IP 주소가 차단될 수 있습니다. 일부 구현 방식에서는 IP 주소 소유자가 성공적으로 로그인하면 실패 시도 횟수 카운터가 초기화됩니다. 즉, 공격자는 실패 시도 횟수 제한에 도달하지 않도록 하려면 몇 번 시도할 때마다 자신의 계정에 로그인하기만 하면 됩니다.

이 경우, 단어 목록 전체에 일정한 간격으로 자신의 로그인 자격 증명을 포함시키는 것만으로도 이러한 방어 전략을 사실상 무력화시키기에 충분합니다.

실험: 무차별 대입 공격 방지 기능 무력화, IP 차단

 

 

Burp를 실행한 상태에서 로그인 페이지를 살펴보세요. 연속으로 세 번 잘못된 로그인 정보를 입력하면 IP 주소가 일시적으로 차단되는 것을 확인할 수 있습니다. 하지만 이 제한에 도달하기 전에 본인 계정으로 로그인하면 실패한 로그인 시도 횟수 카운터를 초기화할 수 있습니다.

잘못된 사용자 이름과 비밀번호를 입력한 다음 Burp Intruder에 POST /login요청을 보냅니다. `username`와 `password` 매개 변수 페이로드 위치에 Pitchfork attack을 생성합니다 

리소스 풀 사이드 패널을 열려면 Resource pool 선택한 다음, 최대 동시 요청 수(Maximum concurrent requests)를 1로 설정한 리소스 풀에 공격을 추가하세요. 한 번에 하나의 요청만 전송하면 로그인 시도가 올바른 순서로 서버에 전송되도록 할 수 있습니다.

페이로드 사이드 패널을 열려면 Payloads를 클릭하세요. 드롭다운 목록에서 1을 선택하세요. 사용자 이름과 carlos를 번갈아 가며 페이로드 목록에 추가합니다. 사용자 이름(Your username)이 가장 먼저 오도록 하고, 'carlos'라는 이름이 최소 100번 이상 반복되게 하세요.

후보 암호 목록을 편집하고 각 암호 앞에 본인의 암호를 추가하세요. 암호가 다른 목록에 있는 사용자 이름과 일치하는지 확인하십시오. 공격을 시작하세요.

공격이 완료되면 상태 코드 200번대가 포함된 응답을 숨기도록 결과를 필터링합니다 . 남은 결과를 사용자 이름별로 정렬합니다. 사용자 이름이 carlos인 요청에 대한 응답은 302는 하나만 있어야 합니다.

확인한 비밀번호를 사용하여 카를로스의 계정에 로그인하고, 그의 계정 페이지에 접속하여 실험을 완료하세요.

계정 잠금

웹사이트에서 무차별 대입 공격을 방지하는 한 가지 방법은 특정 의심스러운 조건(일반적으로 일정 횟수 이상의 로그인 시도 실패)이 충족되면 계정을 잠그는 것입니다. 일반적인 로그인 오류와 마찬가지로, 계정이 잠겼다는 서버의 응답은 공격자가 사용자 이름을 파악하는 데 도움이 될 수 있습니다.

계정 잠금은 특정 계정을 표적으로 하는 무차별 대입 공격으로부터 어느 정도 보호해 줍니다. 그러나 이 방법은 공격자가 임의의 계정에 접근하려는 무차별 대입 공격을 효과적으로 막지는 못합니다.

 

예를 들어, 다음과 같은 방법을 사용하면 이러한 보호 조치를 우회할 수 있습니다.

  1. 유효할 가능성이 높은 후보 사용자 이름 목록을 만드세요. 이는 사용자 이름 열거 방식을 사용하거나 일반적인 사용자 이름 목록을 기반으로 할 수 있습니다.
  2. 최소한 한 명의 사용자가 알고 있을 가능성이 높은 비밀번호 몇 개만 추려내세요. 중요한 것은 선택하는 비밀번호의 개수가 허용된 로그인 시도 횟수를 초과해서는 안 된다는 점입니다. 예를 들어, 로그인 시도 횟수 제한이 3회라면 최대 3개의 비밀번호만 선택해야 합니다.
  3. Burp Intruder와 같은 도구를 사용하여 선택한 각 암호를 후보 사용자 이름 각각에 대입해 보세요. 이렇게 하면 계정 잠금을 해제하지 않고 모든 계정에 대해 무차별 대입 공격을 시도할 수 있습니다. 계정을 해킹하려면 단 한 명의 사용자만 세 가지 암호 중 하나를 사용해도 됩니다.

계정 잠금은 자격 증명 탈취 공격(credential stuffing attack)을 막는 데에도 효과적이지 않습니다. 자격 증명 탈취 공격은 데이터 유출로 탈취된 실제 로그인 자격 증명으로 구성된 대규모 자격 증명 쌍 username:password사전을 사용하는 공격입니다. 많은 사용자가 여러 웹사이트에서 동일한 사용자 이름과 비밀번호를 재사용한다는 점을 악용하여, 사전에 저장된 탈취된 자격 증명 중 일부가 공격 대상 웹사이트에서도 유효한 자격 증명일 가능성을 이용합니다. 각 사용자 이름은 한 번만 시도되기 때문에 계정 잠금은 자격 증명 탈취 공격을 막아주지 못합니다. 자격 증명 탈취 공격은 단 한 번의 자동화된 공격으로 여러 계정을 탈취할 수 있기 때문에 특히 위험합니다.

실습: 계정 잠금을 통한 사용자 이름 열거

버프 스위트 브라우저를 실행한 상태에서 로그인 페이지를 조사하고 유효하지 않은 사용자 이름과 비밀번호를 입력합니다. 그런 다음 POST /login를 Burp Intruder로 요청을 보냅니다.

공격 유형 드롭다운 메뉴에서 'Cluster bomb attack(집중 폭탄 공격)'을 선택합니다 . 매개변수에 페이로드 위치를 추가합니다. '§ 추가'를 클릭하여 페이로드 위치를 추가합니다. 결과는 다음과 같아야 합니다.

username=§invalid-username§&password=example§§

페이로드 사이드 패널에서 첫 번째 페이로드 위치에 사용자 이름 목록을 추가합니다. 두 번째 페이로드 위치에서는 Null 페이로드 유형을 선택하고 5개의 페이로드를 생성하는 옵션을 선택합니다. 이렇게 하면 각 사용자 이름이 5번씩 반복됩니다. 이제 공격을 시작하세요.

결과를 보면, 특정 사용자 이름을 사용했을 때의 응답이 다른 사용자 이름을 사용했을 때보다 더 길다는 것을 알 수 있습니다. 해당 응답을 자세히 살펴보면 다른 오류 메시지가 포함되어 있음을 확인할 수 있습니다. You have made too many incorrect login attempts.이 사용자 이름을 기록해 두세요.

(여담인데 한방에 101개를 505로 돌리면 돌리다 오류나서 20개 내외로 잘라서 n회 돌림.)


해당 POST /login요청에 대해 새로운 Burp Intruder 공격을 생성하되, 이번에는 공격 유형 드롭다운 메뉴에서 Sniper attack을선택합니다. username매개변수를 방금 확인한 사용자 이름으로 설정하고 페이로드 위치를 password매개변수에 추가합니다.

암호 목록을 페이로드 세트에 추가하고 오류 메시지에 대한 grep 추출 규칙을 생성합니다. 공격을 시작하세요.


결과에서 grep extract 열을 확인하세요. 여러 가지 오류 메시지가 있지만, 그중 하나에는 오류 메시지가 포함되어 있지 않습니다. 이 암호를 메모해 두세요.


계정 잠금이 해제될 때까지 잠시 기다려 주세요. 확인하신 사용자 이름과 비밀번호를 사용하여 로그인하고 사용자 계정 페이지에 접속하여 실습 문제를 해결하세요.

해결~

사용자 속도 제한

웹사이트에서 무차별 대입 공격을 방지하는 또 다른 방법은 사용자 접속 횟수 제한입니다. 이 경우, 짧은 시간 내에 너무 많은 로그인 요청을 하면 IP 주소가 차단됩니다. 일반적으로 IP 주소 차단은 다음 방법 중 하나로만 해제할 수 있습니다.

  • 일정 시간이 경과한 후 자동으로
  • 관리자가 수동으로
  • 사용자가 CAPTCHA를 성공적으로 완료한 후 수동으로 입력합니다.

사용자 접속 제한은 사용자 이름 유출 및 서비스 거부 공격에 덜 취약하기 때문에 계정 잠금보다 선호되는 경우가 있습니다. 그러나 완전히 안전한 방법은 아닙니다. 이전 실습에서 살펴본 예시처럼 공격자는 차단을 우회하기 위해 IP 주소를 조작할 수 있는 여러 가지 방법을 사용할 수 있습니다.

제한은 사용자의 IP 주소에서 전송되는 HTTP 요청 속도를 기준으로 하므로, 단일 요청으로 여러 개의 비밀번호를 추측하는 방법을 알아낼 수 있다면 이 보안 조치를 우회하는 것도 가능합니다.

 

HTTP 기본 인증

HTTP 기본 인증은 꽤 오래된 방식이지만, 상대적으로 단순하고 구현이 용이하기 때문에 간혹 사용되는 것을 볼 수 있습니다. HTTP 기본 인증에서 클라이언트는 서버로부터 인증 토큰을 받는데, 이 토큰은 사용자 이름과 비밀번호를 연결하고 Base64로 인코딩하여 생성됩니다. 이 토큰은 브라우저에 저장 및 관리되며, 브라우저는 이후 모든 요청의 Authorization헤더에 다음과 같이 자동으로 추가합니다.

Authorization: Basic base64(username:password)

여러 가지 이유로 인해 이 방법은 일반적으로 안전한 인증 방법으로 간주되지 않습니다. 첫째, 모든 요청마다 사용자의 로그인 자격 증명을 반복적으로 전송해야 합니다. 웹사이트에서 HSTS(하드웨어 보안 테스트)를 구현하지 않은 경우, 중간자 공격으로 사용자 자격 증명이 탈취될 위험이 있습니다.

또한 HTTP 기본 인증 구현은 무차별 대입 공격 방지 기능을 지원하지 않는 경우가 많습니다. 토큰이 정적 값으로만 ​​구성되어 있기 때문에 무차별 대입 공격에 취약할 수 있습니다.

HTTP 기본 인증은 세션 관련 공격, 특히 CSRF 공격에 매우 취약하며, 자체적으로는 이러한 공격에 대한 방어 기능을 제공하지 않습니다.

어떤 경우에는 취약한 HTTP 기본 인증을 악용하여 공격자가 겉보기에는 별것 아닌 페이지에 접근할 수 있을 뿐입니다. 그러나 이렇게 노출된 자격 증명은 공격 표면을 넓히는 것 외에도 다른 더욱 기밀성이 높은 상황에서 재사용될 수 있습니다.