Web 공부/개념정리

파일 업로드란?

sniffy-fanta 2025. 7. 10. 14:25

1. 파일 업로드 공격이란?

파일 업로드 공격이란 웹 서비스의 파일 업로드 기능이나 설정의 취약점을 이용해, 악성 스크립트(웹셸 등)를 서버에 업로드하는 방식의 공격이다. 공격자는 이렇게 업로드한 파일을 실행함으로써 서버 내부에 침투하거나 시스템을 제어할 수 있으며,
이로 인해 데이터 유출이나 추가적인 공격 도구 설치 등 다양한 피해로 이어질 수 있다.


2. 공격 목적

2.1. 웹서버 침투

  •  웹서버에 침투해 DB 연결정보를 확보할 수 있고, 이를 통해 2차로 DB 쿼리를 조작할 수 있다.

2.2. 내부망(포탈, 로그서버 등) 추가 공격

  • 포트포워딩/터널링 기반으로 내부 시스템까지 접근이 가능하다.

2.3. 부가 공격

  • 웹사이트 변조(`Deface`), 피싱 페이지 업로드, 파일 삭제/수정/유출, `XSS`, `DoS` 등 다양한 피해가 발생할 수 있다.

3. 공격 방법

3.1. 파일 저장

첨부한 파일이 실제 서버 경로에 저장돼야 한다.

3.2. 웹셸 업로드

실행 가능한 파일(웹셸)을 업로드한다.

✅이때, 반드시 서버와 동일한 언어의 파일이어야 한다.

3.3. 업로드 경로 파악

파일 다운로드 기능이 제공되는 게시글이나 페이지로 이동하여, 업로드된 파일의 실제 저장 경로를 확인한다.

3.4. 웹셸 접속

앞서 파악한 파일의 경로를 URL로 요청을 보내 파일에 접근한다.


4. 기본 방안

4.1. 확장자 제한

  • `.png`, `.jpg`, `.docx` 등만 허용한다. (화이트 리스트 필터링)
  • `.php`, `.jsp`, `.asp`, `.exe` 등 거부한다. (블랙 리스트 필터링)

4.2. MIME 타입 검사

  • `image/jpeg`, `image/png` 등 업로드 파일의 `Content-Type`으로 제한한다.

4.3. 파일 크기 제한

  • 큰 웹셸이나 바이너리 업로드 막기 위해 `php.ini`, `nginx.conf` 에서 `max_upload_filesize`을 지정한다.

4.4. 업로드 파일명 난수화/무작위화

  • 업로드 시 파일명을 난수화 한 후 저장한다.

4.5. 업로드 디렉토리 실행권한 제한

  • `Apache/nginx conf`에서 `php_admin_flag engine off`, `Options -ExecCGI`으로 실행 자체를 차단한다.
  • 이 경우 파일은 업로드되지만 실행은 불가능하다.

5. 우회 방법

5.1. 확장자 검사 우회

  • 대소문자를 혼용한다. (`phP`, `pHP` 등)
  • 대체 확장자(`phtml`, `php3`, `php5` 등)를 사용한다.
  • 멀티확장자(`webshell.png.php` )를 사용한다.
    - 개발자가 첫 `.`만 기준으로 확장자를 검사할 때 우회가 가능하다.
  • NULL 바이트 주입(`.php%00.png`)을 이용한다.
    - 최신 언어/프레임워크 버전에서는 불가능하다.
  • 디렉터리 설정 파일(`.htaccess`)을 업로드하여, 허용된 확장자(예: `.jpg`)로 웹쉘 파일 업로드가 가능하도록 설정하고, 실제로는 웹쉘 코드를 가진 `.jpg` 파일을 업로드해 우회한다.

5.2. MIME 타입 검사 우회

  • `Burp Suite` 등 프록시 툴로 `Content-Type: image/png` 등으로 요청을 조작한다.

5.3. 파일 크기 제한 우회

  • 최소한의 원리만 갖춘 웹쉘을 업로드 한다. 

5.4. 이미지 헤더+웹셸코드 혼합

  • 정상 이미지 파일의 `hex(시그니처)` 앞부분은 그대로 두고 끝에 웹쉘 코드를 삽입한다.
  • 확장자는 서버언어로 변경한다.
  • 서버가 헤더만 검사한다면 이미지+웹셸 혼합 파일도 실행될 수 있다.

5.5. 경로이동(Path Traversal)

  • 파일명을 `../webshell.php`로 입력해 상위 디렉토리에 업로드를 시도한다.
  • 상위 디렉토리에 실행 권한이 있으면 해당 위치로 우회 업로드가 가능하다.
  • 단, `path traversal` 취약점이 있어야 한다.

6. 대응 방안

6.1. DB에 파일 저장 (BLOB/CLOB)

  • 파일을 DB의 BLOB 또는 CLOB 컬럼에 저장해 웹서버 파일 직접 접근을 차단한다.

6.2. NAS 서버 사용

  • NAS 등 별도 파일 서버에 파일을 저장하여 웹서버와 파일 저장소를 분리한다.