발생원인


파일 업로드가 가능한 페이지에서 업로드 파일에 대한 검증을 수행하지 않을 경우 발생한다.


영향


시스템 내부 명령어 실행 및 제어가능


코드예



 

 안전하기 않은 코드의 예 - JAVA
 ……

public void upload(HttpServletRequest request) throws ServletException {

   MultipartHttpServletRequest mRequest = (MultipartHttpServletRequest) request;

   String next = (String) mRequest.getFileNames().next();

   MultipartFile file = mRequest.getFile(next);


   // MultipartFile로부터 file을 얻음

  String fileName = file.getOriginalFilename();


   // upload파일에 대한 확장자 체크를 하지 않음

   File uploadDirnew File("/app/webapp/data/upload/notice");

   String uploadFilePathuploadDir.getAbsolutePath()+"/" + fileName;


    /* 이하 file upload 루틴 */

……

 업로드 파일에대한 검증 수행이 없음



 

 안전한 코드의 예 - JAVA

 

 String next =  (String) mRequest.getFileNames().next();

 MultipartFile file = mRequest.getFile(next);

 

 if ( file == null ) return ;

    // 화이트리스트 방식으로 업로드 파일의 확장자를 체크한다.

    if ( fileName != null ) {

   if ( fileName.endsWith(".doc") ||  fileName.endsWith(".hwp") 

      || fileName.endsWith(".pdf") || fileName.endsWith(".xls") )  {

              /* file 업로드 루틴 */

             // 저장 시 파일명을 외부 사용자가 추측할 수 없는 형태로 변경

             // 외부에서 직접적으로 접근할 수 없는 경로에 파일을 저장한다

         ...

   } else  throw new ServletExeption("에러");


 /* 이하 file upload 루틴 */

 ……

 파일 확장자 체크 수행




<참고> 웹쉘(web shell)


웹쉘은 악의적인 목적으로 웹서버에서 임의의 명령을 실행할 수 있도록 제작된 프로그램이다. 일반적으로 jsp, php,asp 같은 스크립트로 간단하게 작성한다. 이 스크립트들은 웹서버의 취약점을 통해 웹서버에 업로드 되면 이후에는 공격자가 웹서버 환경에서 임의의 명령어를 실행할 수 있다.


웹쉘을 방어하기 위해서는...

웹셀은 다양한 경로로 웹서버에 업로드할 수 있고, 일단 웹쉘이 설치되면 웹쉘을 이용하는것과 정상적인 웹페이지들을 이용하는것에서 큰차이가 없으므로 탐지가 어렵다. 

웹쉘방어에 효과적인 대응을 위해 웹서버에 파일업로드를 효과적으로 제어하여야 한다.  적절한 기능을 갖춘 웹방화벽을 도입하거나, 웹서버에서 업로드된 파일들이 실행권한이 없도록 웹서버의 환경을 설정해야 한다. 

웹쉘의 이용을 탐지하는 방법을 갖추는것도 필요하다. 일반적으로 공격자는 웹쉘을 통해 특정 시스템 명령어를 이용하거나 상위 디렉토리 또는 특정 디렉토리에 접근한다. 이런 명령어들을 탐지함으로써 웹쉘의 이용을 차단하고 웹쉘의 조재 여부를 판단할수 있다.




블로그 이미지

오픈이지 제로킴

시큐어코딩 교육/컨설팅 전문가 그룹

티스토리 툴바