티스토리 뷰

반응형

 

 

 

가. 원인

  - 검증되지 않은 외부입력값을 파일 및 서버의 시스템 자원에 접근하거나 식별을 허용

 

 

나. 영향

  - 시스템이 보호하는 자원에 접근/수정/삭제/정보노출

  - 시스템 자원간 충돌로 시스템 장애 유발

  - 허용되지 않는 권한을 획득

  - 인증/인가 우회 후 설정파일 열람/변경/실행

 

 

다. 보안대책

  - 외부입력값을 자원(파일, 소켓포트 등)의 식별자로 사용할 경우, 검증 후 사용

  - 사용자별 사용가능한 자원을 사전에 리스트로 정의

  - 외부입력값을 파일 식별자로 사용할 경우, 경로순회공격 위험이 있는 문자( .. / \ ) 필터링

 

 

라. 안전한 코드

 

  String fileName = request.getParameter("file");
  FileInputStream fis = null

  fileName = filename.replaceAll("\\.", "").replaceAll("/", "").replaceAll("\\\\", "");

  fis = new FileInputStream("c:\data\" + fileName);

 

 

  public static void main(String[] args) {

     String fileName = args[0];

     if ( fileName != null ) {

        fileName = fileName.replaceAll("\\.{2,}[/\\\\\]", "");

     }

     ...

  }

 

 

 

마. 진단방법

<경로조작>

  1. 파일객체를 사용하는지 확인

  2. 해당파일을 외부에서 직접접근하는지 확인

  3. 외부입력값에 경로순회 문자열을 제거하는 필터링이 있는지 확인

 

<자원삽입>

  1. 파일명, 소켓포트 등과 같은 자원을 사용하는지 확인

  2. 해당자원을 외부에서 직접접근하는지 확인

  3. 직접접근하지 않고 매핑표나 리스트를 통해 사용하는지 확인

 

 

바. 정/오탐 케이스

<정탐 케이스>

  1. 경로순회 문자열을 제거하지 않고 파일생성에 사용

  2. 개별 사용 프로퍼티를 사용하여 자원에 접근 시 정탐

 

<오탐 케이스>

  1. getRealPath(), getContextPath() 등 내부 함수는 소스가 안전하므로 취약하지 않다고 판정

  2. 시스템 프로퍼티를 사용하여 자원에 접근 시 오탐

반응형
댓글
반응형
최근에 올라온 글
Total
Today
Yesterday