Lab: Password reset broken logic
https://portswigger.net/web-security/authentication/other-mechanisms/lab-password-reset-broken-logic
사용자 인증 미흡으로 인한 타사용자 비밀번호 초기화 가능성
carlos 사용자의 비밀번호 재설정하면 문제 해결
사용자 계정 wiener / peter
피해자 carlos
[기본 설정] 프록시 설정, ACCESS THE LAB의 주소를 Burp Suite에 설정
(1) 블로그 내 My account로 이동하여 사용자(wiener)로 로그인합니다.
(2) 상단 Email client로 이동합니다.
이 기능은 패스워드 재설정할 때 보통 이메일 인증을 하게 되는데 그것을 테스트해볼 수 있는 것입니다.
=> 현재는 아무것도 뜨지 않음
(3) Forgot password?를 클릭하고 wiener를 입력하고 비밀번호 재설정을 합니다.
(3)-1로그아웃 하고 로그인 화면으로 이동해보면 "Forgot password?"가 있습니다. 그곳에 wiener를 입력합니다.
(3)-2 Email client 사이트를 새로고침해서 확인해보면 비밀번호를 재설성 하기 위한 링크가 있습니다. 링크를 클릭합니다.
(3)-3 비밀번호 재설정을 합니다. (비밀번호 1234로 설정)
(4) wiener를 바뀐 비밀번호로 재로그인 해봅니다.
=> 정상적으로 비밀번호 변경됨
(5) 비밀번호 변경 패킷을 확인하여 취약점을 확인합니다. 해당 패킷을 Repeater로 보냅니다.
(6) 패킷 내용을 확인합니다.
패스워드를 잃어버렸을 때 생성되는 토큰 값: temp-forgot-password-token
=> temp-forgot-password-token 값이 올바른 사용자인지 아닌지에 대해 체크를 해야하는데 이 부분이 제대로 작동하지 않고 있습니다.
=> 이 토큰 값을 생략하면 사실상 토큰이 토큰으로서의 역할을 제대로 하지 못해서 타사용자의 비밀번호를 변경할 수 있게 됩니다.
=> 보통 취약점 테스트할 때, 토큰이나 세션부분을 제거해보기도 하고 다른 값을 넣어보기도 합니다.
(7) token 값 두 개를 지우고 테스트를 진행합니다. (비밀번호 5678로 설정)
=> token과 session과의 비교 검증이 없어서 wiener에 대한 패스워드 변경을 Email client에 만들어지는 링크로 해야하는데 Repeater에서도 바뀌는 것을 확인할 수 있습니다.
(8) wiener를 바뀐 비밀번호로 재로그인 해봅니다.
=> 정상적으로 비밀번호 변경됨
(9) 문제 해결을 위해 Repeater에서 carlos의 비밀번호를 변경합니다.
username=carlos, password는 0000으로 설정합니다.
(10) 문제해결
carlos로 로그인을 해봅니다. (carlos / 0000)
=> 정상적으로 로그인 됨
=> token 값이 없는데 비밀번호가 변경되는 취약점이 있습니다.
=> session 값 또한 사용자 인증이 필요합니다.
=> 서버에 token에 대한 정보를 저장하고, 이 token이 아니라면 사용자 패스워드를 변경할 수 없도록 설정해야합니다. token이 있어야만 패스워드를 변경할 수 있도록 해야합니다. 안전하게 하기 위해 token에 유효시간/횟수제한을 주고, 값을 서버에 저장합니다. 사용자 비밀번호를 변경할 때 token값과 abc 값을 비교해서 비밀번호를 변경해야합니다.