Authentication(인증) & Authorization(권한)
Web App의 일반적인 보안 취약성
가장 많은 피해사례가 보고된 목록
개발자가 대처방법을 반드시 알고 있어야 할 일반적인 취약성 목록
- 인증 취약성
- 세션 고정
- XSS (교차 사이트 스크립팅)
- CSRF (사이트 간 요정 위조)
- Injection
- 기밀 데이터 노출
- 메서드 접근 제어 부족
- 알려진 취약성이 있는 종속성(Dependency) 이용
인증 (Authentication)
애플리케이션을 이용하려는 사용자를 식별하는 프로세스
회원가입, 로그인, 로그아웃 등
인가(권한) (Authorization)
인증된 사용자가 특정 기능과 데이터에 대한 이용 권리가 있는지 확인하는 프로세스
인증 취약성이란?
사용자가 악의를 가지고 다른 사람의 기능이나 데이터에 접근할 수 있다는 것
예 - 일반 사용자가 관리자의 기능이나 데이터에 접근한다.
내가 작성하지 않은 글의 수정 또는 삭제
내가 주문하지 않은 상품들의 주문서 수정 또는 삭제
세션 고정 (Session Fixation / Session Hijacking)
세션 인증 기반 애플리케이션에서 발생
서버는 사용자를 식별한 후 다음 요청을 위해 SessionID를 발급한다.
발급한 SessionID를 사용자에게 Cookie를 통해 전달한다.
사용자는 매 요청마다 SessionID를 Cookie로 전달한다.
세션 고정 / 세션 탈취란?
발급받은 SessionID가 로그인 전/후의 SessionID와 모두 동일하게 사용될 경우
악의적인 사용자가 피해자의 세션을 탈취하여 정상적인 사용자로 위장하는 방법.
XSS (교차 사이트 스크립팅)
악의적인 사용자가 게시글에 스크립트르 주입해 사용자가 이를 실행하도록 하는 공격.
DDoS, 세션 탈취 등의 공격에 사용.
불특정 다수의 피해자는 자신도 모르는 사이에 공격의 가담자가 될 수 있다.
CSRF (사이트 간 요청 위조)
- 웹 애플리케이션의 흔한 취약점 중 하나.
- 서버에서 실행되는 특정 URL 하나를 추출해 이메일이나 게시글 및 댓글에 작성 (이미지나 링크 혹은 스크립트)
- 이메일 또는 게시글, 댓글을 조회한 사용자는 자신도 모르는 사이에 URL을 실행.
- 서버는 사용자가 직접 실행한 것으로 판단. (Log, DB 등에도 사용자가 직접 실행한 것으로 작성된다.)
Injection (주입)
- 해커가 시스템의 OS, DB, 환경정보 등을 탈취 및 제어권을 확보하기 위한 공격.
- Form 또는 URL을 통해 시스템을 제어하는 실행문장을 전송.
- 이를 방어하지 않은 서버는 정보를 탈취당하거나 제어권을 잃게 된다.
(SQL Injection: SQL문장을 서버로 보내 DB정보를 탈취한다.
Command Injection: OS 명령문을 서버로 보내 OS의 제어권을 탈취한다.
등등..)
민감한 데이터 노출 처리
시스템의 중요 정보나 사용자의 개인 정보 등
보호되어야 할 정보들이 Log나 화면에 그대로 노출되는 것.
- 사용자의 개인 정보
ID, Password, 주소, 이메일 등등.- 시스템 정보
OS 종류, Server 제품명 및 버전, DB 제품명 및 버전 등등.- 로그인 결과 정보
아이디가 존재하지 않습니다.
비밀번호가 틀렸습니다. 등 해커가 유추할 수 있는 정보들.
메서드 접근 제어 부족 (그냥 설계의 관점)
Controller, Service, Repository 등 권한 처리를 하나의 클래스로만 처리하는 경우
충분한 테스트가 뒷받침 되지 않으면, 정상적으로 동작하지 않을 가능성이 높다.
- 권한에 대한 인터페이스나 클래스를 따로 분리하여 처리해야 한다.
알려진 취약성이 있는 종속성 이용
- Spring 애플리케이션을 개발하기 위해서 여러 종류의 라이브러리가 필요.
- 취약성이 보고된 라이브러리를 사용할 경우, 개발자 단계에서 처리가 불가능.
따라서, 애플리케이션도 동일한 취약성에 노출된다.