먼저 용어 정리부터 해보자
접근 통제는 식별 > 인증 > 인가 3단계를 원칙으로 한다. 여기서 확인할 취약점은 인증과 인가다.
식별 : 본인이 누구라는 것을 시스템에 밝히는 것
인증 : 본인임을 주장하는 그 사용자가 본인이 맞다고 시스템이 인증해주는 것 (신원 확인)
인가 : 인증된 주체에게 접근을 허용하고 특정 업무를 수행할 권리를 부여하는 과정
불충분한 인증
중요 페이지에 접근 시 인증 구현이 미흡하게 된 경우이다.
인증 취약점 대표 케이스
1. Cookie를 통한 인증
쿠키는 클라이언트 측에 저장된 정보이기 때문에 공격자가 자바스크립트를 이용해서 쉽게 탈취 가능하다.
2. 프로세스 건너뛰기
본인인증을 하는 페이지에서 자주 발생한다.
예를 들어 회원가입 절차가 아래와 같을 경우
(1) 약관 동의
(2) 본인 인증
(3) 회원가입
인증이 충분히 구현되어있지 않다면 url 조작을 통해 바로 (1) => (3)으로 건너뛸 수 있다.
3. 응답값 파라미터 변조
웹페이지보다는 모바일 앱에서 종종 발생하는 취약점이다.
보통의 로그인 절차는
id, pw 검증 => 맞으면 세션에 저장 후 index 페이지로 이동, 틀리면 로그인 페이지로 이동
이런 식으로 구현된다.
하지만 이 케이스에서는
로그인 요청이 들어옴과 동시에 세션에 정보 저장 => id, pw 검증 => 맞으면 index 페이지로 이동, 틀리면 로그인 페이지로 이동
이런 식으로 구현되어 id, pw가 맞든 틀리든 무조건 세션에 정보가 저장되어 index 페이지도 준비가 되어있는 것이다. 응답값만 조작해서 우회가 가능하게 된다.
4. 인증 횟수 제한 없음
브루트 포스 공격으로 숫자 4 ~ 6자리 정도는 쉽게 알아낼 수 있다.
횟수 제한을 걸어 인증 정보 유출을 막아야 한다.
불충분한 인가
민감한 데이터나 기능에 접근 시 통제가 되지 않는 경우다.
인가 취약점 대표 케이스
1. 주석이나 CSS를 이용한 접근 제한
클라이언트 측에서 권한 체크를 하는 것이다.
주석 포함된 정보를 참조해서 중요 기능에 접근할 수 있다.
혹은 CSS를 이용해서 display:none;으로 설정하는 경우 display:none;만 삭제하면 접근이 가능하다.
2. 자바스크립트를 이용한 접근 제한
이것 또한 클라이언트 측에서 권한 체크를 하는 것이다. 클라이언트 측에서 하는 확인은 모두 우회 가능하다.
본인 확인, 권한 체크 등은 모두 서버 측에서 실행되어야 한다. 절대 자바스크립트나 쿠키 정보를 이용하지 말아야함!!
이 취약점을 확인하기 위한 절차는 다음과 같다.
1) 권한이 없다고 알려주는 것이 서버인지 클라이언트인지 확인
버프슈트에서 인터셉트 걸고 서버로 가는 요청이 없다면 클라이언트 측에서 확인하고 있는 것
2) 어떤 자바스크립트(함수)가 실행되는지 확인
자바스크립트 분석을 통해 우회한다.
만약 자바스크립트가 난독화 되어있다면 분기문을 중점으로 동적분석을 실시한다.
3. 페이지 예측 하기
프로젝트 나가면 가장 흔히 보는 인가 취약점이다.
페이지 명은 보통 일정한 패턴을 가지고 있으므로 추측해서 중요 페이지에 접근해보는 것이다.
4. 파라미터 변조
패킷을 intercept 해서 파라미터를 변조하면 중요 페이지에 접근할 수 있다.
이것을 이용해서 다른 사람의 비밀글이나 문의글을 확인할 수 있다.