IN: 11. 불충분한 권한 검증
분류: Web Application(웹)
중요도: 상
개요
점검 내용
타 사용자의 권한을 탈취하여 민감한 데이터 접근 및 수정 가능 여부 점검
점검 목적
사용자 검증 로직을 서버 사이드에서 구현하여 비인가자로부터 악의적인 접근을 차단하기 위함
보안 위협
패킷 변조, 클라이언트 측 로직 변조 등을 포함한 사용자 식별이 가능한 시퀀스 등의 데이터 변조를 통해 타 사용자의 권한을 탈취할 경우, 개인정보 유출 및 데이터 조작이 가능하므로 서버 사이드에서 권한 검증 로직을 구현해야 함
참고
소스코드 및 취약점 점검 필요
점검 대상 및 판단 기준
대상
웹 애플리케이션 소스코드
판단 기준
✅ 양호: 중요 페이지에 사용자 검증 로직이 구현되어 있어, 타 사용자의 권한 탈취가 제한된 경우
❌ 취약: 중요 페이지에 사용자 검증 로직이 미흡하여, 타 사용자의 권한 탈취가 가능한 경우
조치 방법
접근 제어가 필요한 모든 페이지에 서버 사이드 방식 사용자 권한 검증 로직 구현
조치 시 영향
일반적인 경우 영향 없음
점검 및 조치 사례
점검 방법
Step 1) 타 사용자 접근이 제한된 페이지(비밀 게시글, 개인정보 변경 등)에서 사용되는 URL 구조와 파라미터를 분석하여 사용자 간 구분을 ID, 숫자, 일련번호 등 단순한 값의 사용 여부 확인
[ 타 사용자 권한 탈취 시도 ]
Step 2) 식별된 URL 구조와 파라미터를 변조하여 타 사용자의 비공개 정보나 권한 외 리소스에 대한 접근 가능 여부 확인
[ 타 사용자 권한 탈취 유무 확인 ]
조치 방법
- 세션을 이용한 사용자 검증 로직을 서버 측에 구현하여, 인가된 사용자만 중요 페이지에 접근할 수 있도록 구현
-
각 페이지의 접근 권한을 정의하는 권한 매트릭스를 작성하고, 모든 페이지에 대해 해당 매트릭스를 참조하여 서버 사이드에서 권한 체크를 일관되게 수행
서버 사이드 세션 검증 예시
@GetMapping("/inquiry/{id}") public String viewInquiry(@PathVariable Long id, Model model, HttpSession session) { User currentUser = (User) session.getAttribute("currentUser"); // 세션에서 현재 사용자 정보를 가져옴 // 세션에 사용자 정보가 없으면 로그인되지 않은 상태이므로 401 Unauthorized 응답 if (currentUser == null) { throw new ResponseStatusException(HttpStatus.UNAUTHORIZED, "Not logged in"); } Inquiry inquiry = inquiryService.findInquiryById(id); // ID에 해당하는 문의를 데이터베이스에서 가져옴 // 현재 사용자가 문의의 작성자가 아니면 403 Forbidden 응답을 보냄 if (!inquiry.getUser().getUsername().equals(currentUser.getUsername())) { throw new ResponseStatusException(HttpStatus.FORBIDDEN, "permission denied"); } }