본문 바로가기

정보보안/애플리케이션 보안

[웹 애플리케이션 취약점] 파일 업로드(File Upload) 취약점

① 개념

  • 파일 업로드 기능이 존재하는 웹 애플리케이션에서 업로드 파일에 대해 적절한 필터링을 하지 않을 경우, 허가되지 않은 파일들이 웹서버로 업로드될 수 있는 취약점
  • (취약점 1) 업로드 파일 타입,확장자를 체크하지 않고 업로드를 허용하는 경우 (웹쉘)webshell이 업로드
  • (취약점 2) 업로드하는 파일 개수나 크기에 제한을 두지 않을 경우 다량의 큰 파일을 전송해 시스템 장애
  • (피해자) 서버, 해당 웹을 이용하는 사용자

 

② 공격 과정

  1. 공격자는 게시판을 이용해 웹쉘(webshell.php) 파일 첨부
  2. POST 요청의 multipart/form-data 형식(MIME타입) 으로 서버 전달
    • (APM 환경) 파일명은 webshell.php이고 파일 내용은 base-64로 인코딩되어 전달됨
    • (APM 환경) 내용을 살펴보면, PHP eval(base64_decode("...")) 로 되어있는데 인코딩된 php코드를 디코드하고, 해당 코드를 php코드로 해석하여 실행시키는 함수이다.
  3. 업로드된 웹쉘 파일 경로 유추
    • 자료실에서 해당 게시물을 살펴보면 파일을 다운로드할 수 있는 [저장] 링크를 가지고 있다. 해당 링크의 속성을 살펴보면 파일명이 변경되어 저장되어 있으며 이를 바탕으로 경로를 유추하여 웹쉘 요청을 시도한다. (ex.table=downlaod&num=33&real_name=2016_02_15_14&show_name=webshell.php..)
  4. 공격자에 의해 웹쉘을 실행한다.
    • (ex.http://example.com/home/download/data/2016_02_15_14.php 에 접속해서 웹쉘 실행되는 것 확인)
    • 웹쉘을 통해 시스템 명령 수행,정보획득,소스파일 변조 등 다양한 공격을 수행할 수 있다.

 

③ 대응책

  1. (취약점 1 대응방안)업로드 파일의 파일타입(MIME타입) 검증 (화이트 리스트 생성)
    • MIME(Multipurpose Internet Mail Extensions) 타입 : 이메일과 함께 파일을 텍스트 형식으로 변환하기 위해 만들어진 표준 포멧. 현재는 웹을 통해 여러 형태의 파일을 전달하기 위한 목적으로 사용. 웹을 통해 파일 전송 시 Content-Type 헤더 필드에 MIME 타입이 명시되며 그 형식은 text/html, image/gif 처럼 타입/서브타입 형식으로 이루어져있다.
    • 업로드 파일의 파일타입을 확인하여 이미지 파일(image/gif,image/jpeg,image/png) 이외에는 모두 허용하지 않도록 체크한다.
  2. (취약점 1 대응방안) 업로드 파일의 파일 확장자 검증 (화이트 리스트 생성)
    • 웹쉘 업로드 시 요청 메시지 파일타입(Content-Type 헤더)을 업로드 허용하는 이미지 파일(image/gif)로 변조하여 파일타입에 대한 유효성 검증을 우회하는 경우가 존재하므로, 유효성 검증 시 파일타입 뿐만 아니라 파일 확장자(.php와 같은)에 대한 추가 검증을 수행하는 것이 좀 더 안전하다.
  3. (취약점 1 대응방안) 웹서버 설정을 통해 파일 업로드 디렉터리에 있는 서버 사이드 스크립트 파일이 실행 차단 & 직접 URL 호출 차단
    • 이미 웹쉘 등 악의적인 서버사이드스크립트 파일이 업로드된 경우에도 악의적인 행동을 못하게 한다.
    • 파일 업로드 디렉터리에 대한 문서 타입을 제어하기 위해서는 아파치 설정파일(httpd.conf)에 해당 Directory 섹션의 AllowOverride 지시자에 "FileInfo" 또는 "All"을 추가한 후 파일 업로드 디렉터리에 엑세스 파일(.htaccess)을 생성한다.
    • 더보기
      #httpd.conf 파일
      <Directory "/var/www/html">AllowOverride All</Directory>
      • AllowOverride 지시자 : 엑세스 파일(.htaccess)에 어떤 지시자 설정을 가능하게 할 지 결정하는 지시자.
        • All: 엑세스 파일에 모든 지시자 설정을 허용
        • FileInfo: AddType과 같은 문서 타입 관련 지시자 설정을 허용
    • 파일 업로드 디렉터리(/var/www/html/home/downlaod/data)에 엑세스 파일(.htaccess)을 생성한 후 FilesMatch 지시자를 이용해 *.ph,*.inc,*.lib 등의 파일에 대한 직접 URL 호출을 차단하도록(Deny from all)을 설정한다.
    • AddType 지시자를 이용, 서버사이드 스크립트 확장자(.php등)을 가진 파일들에 대해 text/html로 MIME 타입을 재조정하여(웹서버가 해당 파일들을 PHP 스크립트 파일이 아닌 HTML 문서로 처리하도록함) 업로드된 서버사이드 스크립트가 실행되지 않도록 설정한다.
    • 더보기
      #/var/www/html/home/downlaod/data 경로(파일업로드 디렉터리)# pwd/var/www/html/home/downlaod/data# cat .htaccess<FilesMatch "\. (ph|inc|lib)">Order allow.denyDeny from all</FilesMatch>AddType text/html .html .htm .php .php3 .php4 .phtml .phps .in .cgi .pl .shtml .jsp
      • .htaccess 파일 : 아파치 웹서버의 기본 설정파일(httpd.conf)와 함께 디렉터리별 설정을 위해 사용하는 설정파일. 이 파일을 특정 디렉터리에 생성하면 해당 디렉터리 및 그 하위 디렉터리까지 설정한 지시자가 적용됨.
      • <FilesMatch 인수> 의미 : 인수와 비교하여 패턴 검사 후, 일치하면 안에 코드 동작
      • AddType 지시자 의미 : 설정한 동적 자원을 정적 자원으로 바꿔줌
      • FilesMatch 지시자를 통한 서버 사이드 스크립트(.php) 직접 호출 시, 403(Forbidden) 에러 응답 메시지 반환
      • AddType 지시자를 통한 서버 사이트 스크립트(.php) 직접 호출 시, webshell.php 파일을 HTML 문서로 처리하기 떄문에 php 스크립트가 실행되지 않고 코드가 그대로 클라언트에 전달.
  4. (취약점 1 대응방안) 윈도우 IIS 웹서버에서 파일 업로드 디렉터리의 실행 권한 제거
    • 파일 업로드 디렉터리의 등록 정보에서 디렉터리의 실행 권한을 '없음'으로 정하면 서버사이드스크립트 파일이 실행되지 않는다.
  5. (취약점 2 대응방안) 업로드 파일에 대한 파일 크기 검증 코드(필터링) 작성
    • 파일 업로드 디렉터리에 업로드할 파일 크기를 제한하기 위해 아파치 설정파일(httpd.conf)에 해당 Directory 섹션의 LimitRequestBody 지시자 이용
      더보기
      #httpd.conf 파일 / 모든 경로에 대한 파일 요청을 5MB로 제한
      <Directory "/">LimitRequestBody 5000000</Directory>
      더보기
      #httpd.conf 파일 "/var/www/html/home/download" 경로에 대한 파일 요청을 5MB로 제한
      <Directory "/var/www/html/home/download">LimitRequestBody 5000000</Directory>
      LimitRequestBody 지시자 : 클라이언트가 POST,PUT 메소드를 이용하여 HTTP 요청 메시지 바디부에 데이터를 담앙서 전달할 수 있는 최대 크기(바이트단위)를 의미한다. (0으로 지정 시 무한대)
    • 지정한 크기를 초과하여 요청할 경우 413(Request entity too large) 에러 응답 메시지를 반환한다.
  6. 업로드 파일을 저장하기 위한 전용 디렉터리를 별도 생성한 후 웹서버 설정을 통해 업로드 디렉터리에 있는 서버사이드스크립트 파일이 실행되지 않도록 설정하거나 직접 URL 호출을 차단하도록 설정한다.

 

④ 취약점 판단기준

  • 게시판 등의 파일 업로드가 가능한 입력 폼에 파일 업로드를 시도하여 업로드에 성공한 경우 취약한 것으로 판단