불충분한 이용자 인증 취약점은 시스템이 사용자 인증 절차를 적절하게 수행하지 못해 발생하는 보안 문제를 말한다.
중요정보(개인정보 변경 등) 페이지에 접근할 때 인증 절차가 불충분할 경우 권한이 없는 사용자가 중요정보 페이지에 접근하여 정보를 유출하거나 변조할 수 있으므로 중요정보 페이지에는 추가적인 인증 절차를 구현하여야 한다.
민감한 데이터 또는 이용자 인증이 필요한 경로에 다양한 방법을 통해 인증절차 존재 여부 및 우회 가능 여부를 점검한다.
점검방법
다양한 방법(SQL Injection, 액티비티 강제호출, 인증 정보 재사용, 응답값 변조 등)을 통해 인증 우회 가능 여부를 점검한다.
- 개인정보 및 비밀번호 수정 기능 페이지 접근 전에 본인인증에 대한 재인증 여부 확인
- 인증 절차 후 접근이 가능한 페이지의 URL을 수집하여 인증절차 없이 접근 시도, 클라이언트 스크립트를 통한 접근 제어 시 해당 스크립트를 삭제하여 인증 없이 해당 페이지에 접근 가능 여부 점검
- 플로우 통제 우회 가능 여부 점검
📍 플로우 통제란?
플로우 통제(Flow Control)는 시스템 내에서 데이터가 허가된 경로를 따라 흐르도록 보장하고, 비인가된 경로를 통한 정보의 누출이나 침해를 방지하는 것이다.
원하는 플로우대로 로직이 실행되도록 정보의 흐름을 제어한다고 생각하면 된다.
🌱 SQL Injection, 액티비티 강제호출, 인증 정보 재사용, 응답값 변조를 통해 이용자 인증이 필요한 경로에 접근이 가능하고 개인정보가 조회가 가능하다면 불충분한 인증 취약점이고, 권한이 필요한 페이지가 접근이 가능하다면 부적절한 이용자 인가 취약점이다.
🌱 양호
중요정보 페이지 접근 시 추가 인증을 하는 경우 양호
세션이 적절하게 관리되며, 사용자가 로그아웃하거나 세션이 만료되면 즉시 무효화됨
(토큰 유효시간이 길게 설정되어 있을 경우, 토큰을 탈취해 토큰으로 인증을 수행하여 중요 정보를 빼올 수 있다. 필자의 경우 보통 액세스 토큰 유효시간을 30분으로 설정한다.)
중요정보(개인정보 변경 등)를 표시하는 페이지에서 본인 인증을 재확인하는 로직이 구현되어 있음
ex) 다중 인증(2FA) 시스템이 적용되어 있다.
사용자가 인증 후 이용 가능한 페이지에 접근할 때마다 승인을 얻은 사용자인지 페이지마다 검증
인증 과정을 처리하는 부분에 Client Side Script를 사용하지 않음
💊 취약
중요정보 페이지 접근에 대한 추가 인증을 하지 않는 경우
인증 과정을 처리하는 부분에 Server Side Script(PHP, ASP, JSP 등)를 통하여 인증 및 필터링 과정을 수행함
잘못된 로그인 시도가 여러 번 발생해도 계정 잠금이 발생하지 않는 경우
세션 관리가 불충분하여 세션 하이재킹에 취약한 경우
로그아웃 후에도 세션이 계속 유효하거나, 세션 만료 처리가 미흡한 경우
(토큰 만료 처리가 미흡한 경우, 토큰은 계속해서 인증하는데 활용될 수 있으므로 만료처리를 꼭 해줘야 한다.)
불충분한 이용자 인증을 점검할 때 SQL Injection, 액티비티 강제호출, 인증 정보 재사용, 응답값 변조 등 다양한 방법이 있다. 상황에 맞게 적절한 우회 기법을 활용하여 불충분한 인증을 하는 곳이 없는지 확인해야 한다.
로그인 시 알맞은 아이디와 비밀번호를 입력하여 로그인에 성공한 후 결과 데이터를 수집한다.
로그아웃 후 일치 하지 않은 비밀번호를 입력 후 로그인에 실패한다.
잡은 패킷에서 Break on Response버튼을 눌러 실패 결과를 프록시로 반환받는다.
프록시로 반환받은 결과값을 성공 데이터로 바꾼 후 run 버튼을 클릭해 클라이언트로 보낸다.
응답값 변조를 통해 진행하였다.
Oh bank 앱으로 돌아가 로그인에 실패한 것을 확인한다.
🌱 불충분한 인증 취약한 경우를 테스트 해보고 싶다면 아래 사이트에서 위 점검 절차와 동일하게 진행하면 된다.
http://testphp.vulnweb.com/logout.php
아이디: test 비밀번호: test
o 클라이언트가 아닌 서버 사이드 스크립트로 사용자 검증하는 절차가 필요하다.
o 로그아웃 시 세션을 즉시 무효화하고, 세션 만료 시간을 적절히 설정하여 세션 하이재킹을 방지한다.
o 일정 횟수 이상의 실패한 로그인 시도 시 계정을 잠그고, 사용자에게 알림을 전송한다.
o 중요 작업을 수행하기 전에 OTP, SMS 인증, 하드웨어 토큰 등의 방법을 통해 사용자에게 추가 인증을 요구한다.
불충분한 이용자 인증은 취약점 점검을 하면 특히 웹에서 가장 많이 나오는 취약점이다. SQL Injection이나 응답값 변조를 통해 접근하면 로그인이 성공되는 경우가 많다.
일반적으로는 위에서 점검한 절차대로 실패 응답 패킷을 잡아서 성공 패킷으로 변조하였을 경우 로그인이 성공되는 경우가 있다. 그 외에 아이디 비밀번호를 입력해서 로그인을 할 때 로그인에 성공할 경우 1을 반환하고, 실패할 경우 0을 반환하는 경우가 있다. 아이디 비밀번호를 아무거나 입력하고 0을 반환하는 응답값을 1로 변조하여 전송하면 로그인에 성공하는 경우가 있다.
실제로 이런 식으로 많이 잡혔던 취약점이고, 만약 로그인에 성공하여 권한이 필요한 페이지에 접근할 수 있다면 불충분한 인증으로 취약점을 잡아야 하는지, 부적절한 인가 여부로 잡아야 할지도 고민이었다. 선임분께 여쭤보니 귀에 걸면 귀걸이, 코에 걸면 코걸이다 라는 답변을 받았다.
이러한 아이러니함에 매번 어떤 취약점으로 잡을지 고민이 많았고, 필자는 좀 더 위험한 결과가 나오는 쪽으로 취약점을 잡고 있다.