웹 해킹/portswigger

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

코드라니(CODERANY) 2026. 4. 29. 12:49

사용자 비밀번호 재설정

실제로 일부 사용자는 비밀번호를 잊어버리기 때문에 비밀번호를 재설정할 수 있는 기능을 제공하는 것이 일반적입니다. 하지만 일반적인 비밀번호 기반 인증 방식은 이러한 상황에서 불가능하므로, 웹사이트는 실제 사용자가 직접 비밀번호를 재설정하는지 확인하기 위해 다른 방법을 사용해야 합니다. 따라서 비밀번호 재설정 기능은 본질적으로 위험하며 안전하게 구현되어야 합니다.

이 기능은 일반적으로 몇 가지 다른 방식으로 구현되며, 각 방식에 따라 취약성 수준이 다릅니다.

이메일로 비밀번호 보내기

웹사이트가 애초에 비밀번호를 안전하게 관리한다면 사용자에게 현재 비밀번호를 보내는 것은 절대 불가능해야 한다는 것은 두말할 나위가 없습니다. 대신 일부 웹사이트는 새 비밀번호를 생성하여 사용자에게 이메일로 전송합니다.

일반적으로, 안전하지 않은 채널을 통해 영구적인 비밀번호를 전송하는 것은 피해야 합니다. 이러한 경우 보안은 생성된 비밀번호가 매우 짧은 기간 후에 만료되거나 사용자가 비밀번호를 즉시 변경하는 것에 달려 있습니다. 그렇지 않으면 이 방식은 중간자 공격에 매우 취약합니다.

이메일은 일반적으로 보안이 취약한 것으로 여겨지는데, 그 이유는 받은 편지함이 영구적으로 저장될 뿐 아니라 기밀 정보를 안전하게 저장하도록 설계되지 않았기 때문입니다. 또한 많은 사용자가 안전하지 않은 채널을 통해 여러 기기 간에 받은 편지함을 자동으로 동기화합니다.

URL을 사용하여 비밀번호 재설정하기

보다 안전한 비밀번호 재설정 방법은 사용자에게 비밀번호 재설정 페이지로 연결되는 고유한 URL을 보내는 것입니다. 보안성이 떨어지는 구현 방식은 재설정 대상 계정을 쉽게 추측할 수 있는 매개변수가 포함된 URL을 사용합니다. 예를 들면 다음과 같습니다.

http://vulnerable-website.com/reset-password?user=victim-user

이 예시에서 공격자는 user매개변수를 자신이 파악한 임의의 사용자 이름으로 변경할 수 있습니다. 그러면 공격자는 해당 사용자의 새 비밀번호를 설정할 수 있는 페이지로 바로 이동하게 됩니다.

이 프로세스를 보다 효율적으로 구현하려면 높은 엔트로피(무질서)를 가진 추측하기 어려운 토큰을 생성하고, 이를 기반으로 비밀번호 재설정 URL을 만드는 것이 좋습니다. 최상의 시나리오에서는 이 URL에서 어떤 사용자의 비밀번호가 재설정되는지에 대한 어떤 단서도 제공되지 않아야 합니다.

http://vulnerable-website.com/reset-password?token=a0ba0d1cb3b63d13822572fcff1a241895d893f659164d4cc550b421ebdd48a8

사용자가 해당 URL에 접속하면 시스템은 백엔드에 해당 토큰이 존재하는지 확인하고, 존재한다면 어떤 사용자의 비밀번호를 재설정해야 하는지 확인해야 합니다. 이 토큰은 짧은 시간 후에 만료되어야 하며, 비밀번호 재설정이 완료되면 즉시 파기되어야 합니다.

하지만 일부 웹사이트는 비밀번호 재설정 양식을 제출할 때 토큰을 다시 검증하지 않는 경우가 있습니다. 이 경우 공격자는 자신의 계정으로 재설정 양식에 접속하여 토큰을 삭제한 후, 이 페이지를 악용하여 임의의 사용자의 비밀번호를 재설정할 수 있습니다.

 

https://portswigger.net/web-security/learning-paths/authentication-vulnerabilities/vulnerabilities-in-other-authentication-mechanisms/authentication/other-mechanisms/lab-password-reset-broken-logic

 

버프 스위트 브라우저로 연구실에 접속한 상태에서 " Forgot password?(비밀번호를 잊으셨나요?)" 링크를 클릭하고 사용자 이름을 입력하세요. 이메일 클라이언트 버튼을 클릭하여 전송된 비밀번호 재설정 이메일을 발송하세요.

전송된 비밀번호 재설정 이메일을 확인하세요. 이메일에 있는 링크를 클릭하고 원하는 비밀번호로 재설정하세요.


Burp에서 프록시 > HTTP 기록 으로 이동하여 비밀번호 재설정 기능에 대한 요청과 응답을 살펴보세요. 재설정 토큰이 재설정 이메일의 URL 쿼리 매개변수로 제공되는 것을 확인하세요. 

새 비밀번호를 제출할 때 POST /forgot-password?temp-forgot-password-token요청에 사용자 이름이 숨겨진 입력란으로 포함되어 있는 것을 확인하세요. 

이 요청을 Burp Repeater로 보내세요.


Burp Repeater에서 URL과 요청 본문 모두에서 매개변수  temp-forgot-password-token값을 삭제하더라도 비밀번호 재설정 기능이 여전히 작동하는 것을 확인할 수 있습니다.(페이지 이동 302) 이는 새 비밀번호를 제출할 때 토큰을 확인하지 않는다는 것을 입증합니다.


sername매개변수를 carlos로 변경합니다. 새 비밀번호를 원하는 값으로 설정하고 요청을 보냅니다.


브라우저에서 방금 설정한 새 비밀번호를 사용하여 Carlos의 계정에 로그인하세요. ' 내 계정'을 클릭하여 실습 과제를 완료하세요.