파일 업로드 취약점

보안노트·2024년 5월 1일
0

파일 업로드 취약점이란?


  • 파일 업로드 취약점 (File Upload Vulnerability)

  • 파일 업로드 기능을 이용할 때 정상파일이 아닌 비정상 파일을 업로드 하는 것을 말한다.

  • 정상과 비정상의 기준 : 서버 사이드 스크립트로 작성된 웹쉘인지 아닌지에 따라 나뉘게 된다.

  • 파급력 있는 OS Command Injection과 동일한 효과를 나타낼 수 있는 취약점이다.




공격 원리 분석


  • 파일 업로드 기능을 통해 서버 사이드 스크립트로 작성된 웹쉘을 업로드 한다.

  • 업로드 시, 기존 경로와 파일명을 조합하게 된다.

  • 파일 출력 기능을 통해 지정된 경로로 파일이 업로드된다.

  • 업로드 완료 후, 업로드된 경로로 접근을 하게 된다. 업로드된 웹 쉘의 접근을 위해 URL이 필요하고 실행을 위해서 서버 사이드 스크립트로 작성된 웹 쉘이 웹 디렉터리에 저장이 되어야 한다.




웹 쉘이란?


  • Web (WWW, 월드 와이드 웹) + Shell (사용자와 커널 간의 대화를 하기 위한 인터페이스) = WebShell (웹 페이지 상에서 원격지 서버의 시스템 명령어를 실행할 수 있는 도구)

  • 위 사진처럼 해당 서버 사이드 스크립트로 작성된 웹 쉘을 업로드하여 업로드 경로와 해당 파일명을 통해 웹 쉘을 실행시킬 수 있다.




검증 로직 유형


  1. 확장자 검증 : 파일에 대해서 정상, 비정상적 파일의 확장자인지 검증.

  2. 이미지 검증 : 파일이 이미지인지 아닌지 검증.

  3. 파일 사이즈 검증 : 업로드되는 파일의 사이즈가 정해진 사이즈를 초과하는지에 대한 검증.




확장자 검증 방식


  • 확장자 검증 방식에는 두 가지의 방식이 있다.

  1. 블랙 리스트 방식 : 업로드할 때 확장자에 대해서 악의적인 확장자를 가지고 있는 파일이 존재한다면 업로드를 허용하지 않는 방식이다. (예 : jsp, php ...)

  2. 화이트 리스트 방식 : 허용할 확장자만 업로드할 수 있도록 하는 방식 (예 : jpg, png, gif)



동작 원리

  1. 업로드하려는 파일의 파일명을 받는다.

  2. 파일명에서 확장자를 파싱한다.

  3. 확장자 검증(화이트 or 블랙)을 통해 검증하여 파일 업로드 여부를 결정한다.



주의 사항

  1. 검증되지 않는 확장자 사용

    • test.phptest.html로 변경하여 업로드

  2. 빈값 검증 미흡

    • test.php.
    • test.php[공백]

  3. 대문자 검증 미흡

    • test.phP

  4. 잘못된 확장자 파싱

    • test.png.php

  • 위 네 가지 사항들을 주의하여 파일 업로드 취약점에 대응해야 한다.




대응 방안


1. 파일명에 대한 검증



  • 확장자 검증 : 확장자 검증 방식은 역방향으로 해야 하며 화이트 리스트 방식을 사용하는 것이 좋다.



  • 서버 측에서 파일명 생성 : 시간-밀리세컨드 또는 랜덤 문자열로 저장하여 사용자가 변조를 하지 못 하도록 한다.



2. 올바른 업로드 경로 설정


0개의 댓글

관련 채용 정보