티스토리 뷰

파일 업로드 취약점 



파일업로드 기능을 이용하여 시스템 명령어를 실행할 수 있는 웹 프로그램(웹셀)을 업로드할 수 있는 취약점이다.

DBD(Drive-By-Download)공격을 이용해 (웹이 가지고있는 취약한 보안상태를 이용해 악성코드를 심어 놓는방법)
공격이 이루어지면 일반 클라이언트는 어떠한 액션을 취하지 않아도 취약한 사이트를 방문하는것 만으로도 감염시킬 수 있다.

파급 효과



시스템 장악, 웹 페이지 변조


공격 예상도




서버측에서 실행될 수 있는 스크립트 파일(asp,jsp,php파일 등)을 업로드가능하고, 이 파일을 공격자가 웹을 통해 
직접 실행할 수 있는 경우 시스템 내부 명령어를 실행하거나 외부와 연결하여 시스템을 제어할 수 있다.


파일 업로드 취약점 원인 및 결과



→ 파일 업로드 취약점
  - 파일 업로드 기능을 이용하여 시스템 명령어를 실행할 수 있는 웹 프로그램(웹셀)을 업로드할 수 있는 취약점

→ 파일업로드 취약점 원인과 결과
  - 웹 사이트상에서 파일 업로드 시 파일의 확장자 검증을 하지 않아서 발생
  - 서버의 모든 제어권, 정보탈취, 변조, 악성스크립트 삽입 등의 위험 존재

파일 업로드 취약점에 대한 대응방안


점검시 고려사항
  1. 검증된 웹셀 올리기
  2. 웹셀 취약점 점검 이후 후속 조치를 통해 업로드 했던 웹셀은 반드시 삭제 해야한다.
  3. 업로드 기능이 불필요할 경우 개발단계에서 완전 제거해야하며 소스코드단에서 편의를 위해 주석처리하는등의 처리는 지양한다.
  4. 파일 업로드 기능이 필요한 경우 서버측에서 파일명 검
    4-1. 파일 이름은 전체 검사를 원칙으로 한다.
    4-2. 확장자를 분리할 경우(.) 조건문자 마지막 확장자를 검사한다.
    4-3. 시스템에서는 대소문자를 구분함으로 소문자 치환 후 검사를 진행한다.
    ※ 허용하는 확장자를 먼저 규정한 후 이외의 확장자는 모두 차단한다. 
    4-4. 업로드 가능한 파일명, 확장자인 경우 업로드 전용 폴더에 저장한다. 저장시 파일명, 확장자명 변경
    => 정상 파일 다운로드시 데이터베이스 연동을 통해 원본 파일명으로 바꿔준다.
    4-5. 업로드 전용 폴더의 실행권한 제거 ( 주기적으로 체크 요망 )


설계시 고려사항

1. 업로드되어 저장되는 파일의 타입, 크기, 개수, 실행권한을 제한해야 한다.
    1-1. 업로드 파일의 크기제한
    1-2. 파일 타입의 제한
    1-3. 업로드 되어 정되는 파일의 실행권한 제거

2. 업로드되어 저장되는 파일은 외부에서 식별되지 않아야 한다.
    2-1. 업로드되는 파일의 저장경로는 외부에서 직접 접근이 불가능한 경로 사용
    2-2. 업로드되어 저장되는 파일의 파일명은 랜덤하게 생성하여 사용

↑ 파일 업로드 기능 구현시 위와같은 프레임워크의 사용을 고려하여 기능의 목적에 부합하는 
    형식의 파일만 업로드 하도록 허용한다.



파일 업로드 취약점 실습 : 웹페이지 소스코드 변조



1. 파일업로드 기능 탐색

2. 파일 업로드 기능을 이용해서 악성파일 업로드 시도

    2-1. 웹 어플리케이션에서 실행 가능한 언어로 작성된 악성 스크립트 업로드 시도
    => 이는 웹 개발 언어가 JSP언어로 개발된 환경이라면 먼저 1차원적으로 JSP로 작성된 악성 스크립트의 
         업로드를 시도한다. → .jsp 해당 환경에 맞춰 같은 언어로 제작된 악성 스크립트 업로드 시도

    2-2. 업로드된 파일 확장ㅈ가 개발 운영 환경에서 실행 가능한 확장자이어야 실행이 가능하다.

3. 우회기법

    3-1. webshell.txt.asp 
         →조건 문자를 만나는것에서 처음 만나는 부분으로 기준을 잡는다면해당 파일이 업로드될 가능성이 있다.
           #파일 이름은 전체검사를 원칙으로 한다.
    3-2. 종단 문자 우회
          A. urlencode 이용 : %00 = null code 
          → %00가 포함된 뒷 문자열은 웹 서버에서 파일을 저장할 때 null 인식되는 것을 악용하는 방식
          허용하는 확장자를 알고 있다면  해당 방식을 사용할 때 허용하는 확장자와 원하는 확장자 사이에
          %00를 이용해 업로드를 시도한다.

↑ 현재 파일업로드 기능에대해서 파일의 확장자를 필터링하고 있다.


↑ 현재 게시판은 웹 서버측에서 확장자 필터링을 하는것이 아닌, 해당 웹 페이지단에서 확장자를 필터링하고 있다.
  # 확장자 필터링은 항상 웹 서버측에서 진행되어야 한다. 이는 프록시를 이용한 소스코드 조작으로 악의적인
    스크립트 파일을 업로드할 수 있기 때문이다.

↑프록시도구를 이용해 해당 웹페이지의 소스코드중 필터링 코드를 수정하였다.


↑웹셀 업로드 시도


↑ 웹셀이 성공적으로 업로드 되었다.


%00를 이용한 파일 업로드



↑업로드 가능한 파일 확장자명을 알 수 있다.
  # 이를 이용한 우회기법으로 웹셀 업로드를 시도할 수 있다.


↑%00가 포함된 물자열은 웹 서버에서 파일을 저장할 때 null로 인식한다
   # 웹 서버에 저장되는 파일은 webshell(seung_hoon).asp이다.


↑웹셀이 성공적으로 업로드 되었다.


↑업로드한 웹셀을 다운로드하고, 프록시 도구를 이용해 다운로드 경로를 찾는다.


↑다운로드 경로 확인하기


↑ 파일 다운로드 URL을 통해 다운로드 경로를 확이할 수 있다.
   # 이를 이용해 웹셀에 접근한다.


↑찾아낸 다운로드 경로를 이용해 업로드한 웹셀에 접근한다.


↑접근한 웹셀을 이용해 시스템 명령어를 사용한 모습



참고


- K-shield.jr 2기 정보보호 관리진단 과정
- KISA : 웹 취약점 분석 및 기술지원
- KISA : SW개발 보안 가이드