Lab: Password reset broken logic

Lab: Password reset broken logic

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

 

Lab: Password reset broken logic | Web Security Academy

This lab's password reset functionality is vulnerable. To solve the lab, reset Carlos's password then log in and access his "My account" page. ...

portswigger.net

 

etc-image-0


사용자 인증 미흡으로 인한 타사용자 비밀번호 초기화 가능성

 

carlos 사용자의 비밀번호 재설정하면 문제 해결

사용자 계정 wiener / peter

피해자 carlos

[기본 설정] 프록시 설정, ACCESS THE LAB의 주소를 Burp Suite에 설정

 

(1) 블로그 내 My account로 이동하여 사용자(wiener)로 로그인합니다.

etc-image-1

 

(2) 상단 Email client로 이동합니다.

이 기능은 패스워드 재설정할 때 보통 이메일 인증을 하게 되는데 그것을 테스트해볼 수 있는 것입니다.

etc-image-2
etc-image-3
Email client

=> 현재는 아무것도 뜨지 않음

 

(3) Forgot password?를 클릭하고 wiener를 입력하고 비밀번호 재설정을 합니다.

(3)-1로그아웃 하고 로그인 화면으로 이동해보면 "Forgot password?"가 있습니다. 그곳에 wiener를 입력합니다.

etc-image-4
Forgot password 클릭
etc-image-5
wiener 입력
etc-image-6
제출확인

 

(3)-2 Email client 사이트를 새로고침해서 확인해보면 비밀번호를 재설성 하기 위한 링크가 있습니다. 링크를 클릭합니다. 

etc-image-7

 

(3)-3 비밀번호 재설정을 합니다. (비밀번호 1234로 설정)

etc-image-8
비밀번호 재설정

 

(4) wiener를 바뀐 비밀번호로 재로그인 해봅니다.

etc-image-9
etc-image-10

=> 정상적으로 비밀번호 변경됨

 

(5) 비밀번호 변경 패킷을 확인하여 취약점을 확인합니다. 해당 패킷을 Repeater로 보냅니다.

etc-image-11

 

(6) 패킷 내용을 확인합니다.

패스워드를 잃어버렸을 때 생성되는 토큰 값: temp-forgot-password-token

etc-image-12

=> temp-forgot-password-token 값이 올바른 사용자인지 아닌지에 대해 체크를 해야하는데 이 부분이 제대로 작동하지 않고 있습니다.

=> 이 토큰 값을 생략하면 사실상 토큰이 토큰으로서의 역할을 제대로 하지 못해서 타사용자의 비밀번호를 변경할 수 있게 됩니다.

=> 보통 취약점 테스트할 때, 토큰이나 세션부분을 제거해보기도 하고 다른 값을 넣어보기도 합니다.

 

(7) token 값 두 개를 지우고 테스트를 진행합니다. (비밀번호 5678로 설정)

etc-image-13

=> token과 session과의 비교 검증이 없어서 wiener에 대한 패스워드 변경을 Email client에 만들어지는 링크로 해야하는데 Repeater에서도 바뀌는 것을 확인할 수 있습니다. 

 

(8) wiener를 바뀐 비밀번호로 재로그인 해봅니다.

etc-image-14
etc-image-15

=> 정상적으로 비밀번호 변경됨

 

(9) 문제 해결을 위해 Repeater에서 carlos의 비밀번호를 변경합니다.

username=carlos, password는 0000으로 설정합니다.

etc-image-16

 

(10) 문제해결

carlos로 로그인을 해봅니다. (carlos / 0000)

etc-image-17
etc-image-18

=> 정상적으로 로그인 됨

=> token 값이 없는데 비밀번호가 변경되는 취약점이 있습니다.

=> session 값 또한 사용자 인증이 필요합니다.

=> 서버에 token에 대한 정보를 저장하고, 이 token이 아니라면 사용자 패스워드를 변경할 수 없도록 설정해야합니다. token이 있어야만 패스워드를 변경할 수 있도록 해야합니다. 안전하게 하기 위해 token에 유효시간/횟수제한을 주고, 값을 서버에 저장합니다. 사용자 비밀번호를 변경할 때 token값과 abc 값을 비교해서 비밀번호를 변경해야합니다.