2015년 12월 1일 화요일

입력데이터 검증 및 표현 - 디렉터리 경로 조작

1)     디렉터리 경로 조작
디렉터리 경로 조작은 크게 상대, 절대 디렉터리 경로 조작으로 나눌 수 있다.

I.       상대 디렉터리 경로 조작(Relative Path Traversal)
상대 디렉터리 경로 조작은 외부의 입력을 통하여 디렉터리 경로 문자열 생성이 필요한 경우, 외부 입력값에 대해 경로 조작에 사용될 수 있는 문자를 필터링하지 않으면, 예상 밖의 접근 제한 영역에 대한 경로 문자열 구성이 가능해져 시스템 정보누출, 서비스 장애 등을 유발 시킬 수 있다. , 경로 조작을 통해서 공격자가 허용되지 않은 권한을 획득하여, 설정에 관계된 파일을 변경할 수 있거나 실행시킬 수 있다.

n  안전한 코딩 기법
     외부의 입력이 직접 파일이름을 생성하도록 사용될 수 없도록 한다. 불가피하게 직접 사용하는 경우, 다른 디렉터리의 파일을 접근할 수 없도록 replaceAll() 등의 메소드를 사용하여 위험 문자열(, /, \)을 제거하는 필터를 거치도록 한다.
     외부의 입력을 받아들이되, 내부적인 처리는 미리 정의해놓은 데이터를 사용하도록 화이트 리스트를 관리한다. , 외부에서 받아들인 데이터 중 미리 정의된 케이스를 제외하고는 모두 무시하도록 한다.

II.      절대 디렉터리 경로 조작(Absolute Path Traversal)
외부 입력이 파일 시스템을 조작하는 경로를 직접 제어할 수 있거나 영향을 끼치면 위험하다. 사용자 입력이 파일 시스템 작업에 사용되는 경로를 제거하는 것을 허용하면, 공격자가 응용프로그램에 치명적인 시스템 파일 또는 일반 파일을 접근하거나 변경할 가능성이 존재한다. , 경로 조작을 통해서 공격자가 허용되지 않은 권한을 획득하여, 설정에 관계된 파일을 변경할 수 있거나 실행시킬 수 있다.

n  안전한 코딩 기법
     외부의 입력을 통해 파일이름의 생성 및 접근을 허용하지 말고, 외부 입력에 따라 접근이 허용된 파일의 리스트에서 선택하도록 프로그램을 작성하는 것이 바람직하다.   

1.   String fileName = request.getParameter("");
2.   deleteFile(filename);  
3.    
4.   private void deleteFile(String request) {  
5.       String result = new String(request);  
6.        
7.       result = result.replaceAll("\\""");  
8.       result = result.replaceAll("/""");  
9.       result = result.replaceAll(".", "");  
10.      result = result.replaceAll("&"""); 
11.        
12.      File file = new File("/user/local/tmp/" + name);
13.      if (file != null) file.delete();
14.      
15.      /* 나머지 구현 */
16.  }  

댓글 없음:

댓글 쓰기