웹 해킹의 개념

파일 업로드 공격(File Upload Attack)

ser-ser 2025. 1. 26. 11:17

파일 업로드 공격

파일 업로드 공격은 공격자가 서버에 임의의 파일을 업로드하여 악의적인 행위를 수행할 수 있도록 하는 공격 기법을 말합니다



발생 원인

파일 업로드 기능에서 적절한 검증 및 검사를 수행하지 않을 경우 발생합니다.

주요 원인

  1. 업로드 파일 형식, 크기, 내용에 대한 검증 부족
  2. MIME 타입 위/변조:
    • 클라이언트(공격자)가 HTTP 요청 헤더의 Content-Type을 임의로 수정하여 이미지를 가장해 image.png로 보내도 실제 파일은 PHP 코드일 수 있습니다.
    • 서버에서 $_FILES ['userfile']['type']$_FILES ['userfile']['type']와 같은 값만으로 검증할 경우 쉽게 우회가 가능합니다.
    • 따라서 서버 측에서 실제 파일의 Magic Number(파일 헤더)를 확인하거나 신뢰할 수 있는 라이브러리를 통해 파일을 열어보고 유효성을 검사하는 방법이 필요합니다.
    • a
     
  3. 이중 확장자(Double Extension):
    • 예: webshell.php.jpg
    • 서버가 파일 확장자를 jpg로 인식하거나 MIME 타입을 image/jpeg로 인식하는 등 취약한 검증 로직을 우회하는 기법입니다.
    • 서버 설정에 따라 webshell.php.jpg 파일이 PHP로 실행될 수 있습니다


실습해보기

간단한 PHP 웹 셸 코드. GET 파라미터 cmd 값을 받아 시스템 명령어(system($_GET ['cmd']);)를 실행합니다.
해당 코드는 공격자가 서버에서 직접 명령어를 실행할 수 있는 악성 스크립트입니다


업로드 파일에 대한 검증이 없을 경우, 이미지처럼 악성 파일 업로드가 가능해집니다

 

 

해당 스크립트를 업로드해보도록 하겠습니다

 

 

실험을 위해 업로드 성공 후, 서버에서 업로드된 파일의 원본 이름과 저장된 이름을 출력되게 설정해 뒀습니다
파일이 저장된 것으로 보아 PHP 파일이 그대로 업로드되었고, 실행 가능성이 있습니다

 

URL: 192.168.136.129:1018/uploads/6795 a6763 ebdc_test_webshell.php을 브라우저에서 실행합니다

 

 

저장된 PHP 파일에 cmd 파라미터 명령어를 전달하여 데이터를 추출했으며 이보다 좀 더 민감한 데이터를 추출하도록 하겠습니다


cmd 파라미터에 cat/etc/passwd 명령어를 전달하여 서버의 /etc /passwd 파일 내용을 출력했습니다
/etc /passwd 파일은 시스템 사용자 계정 정보를 담고 있으며,
공격자는 이 정보를 악용하여 추가적인 공격을 시도할 수 있습니다

 

 


파일 저장 위치 및 실행 가능성

  1. 웹 루트(Web Root) 내부 저장의 위험성:
    • 웹 루트 내부에 파일을 업로드하면, 업로드된 파일을 직접 URL로 접근해 실행할 수 있는 위험이 큽니다.
    • 대응 방안:
      • 가급적 웹 루트 바깥에 저장하고, 파일 제공 시에는 **별도의 스크립트(download.php)**를 통해 읽어서 사용자에게 전달하는 방식을 권장합니다.
      • PHP, JSP와 같은 서버 실행 파일로 해석되지 않도록. txt.txt 등 강제 확장자로 변환하여 저장한 뒤, 웹 페이지에서 다운로드만 가능하게 처리할 수도 있습니다.
  2. 상대 경로 조작(Path Traversal)과 씸볼릭 링크:
    • 업로드 시 파일 이름에../../ 또는 씸볼릭 링크 등을 활용하여 의도치 않은 상위 디렉터리에 파일을 생성할 수 있는 취약점이 있습니다.
    • 대응 방안:
      • 파일 이름에서 경로 관련 문자를 필터링하거나 제거하는 처리가 필요합니다.

파일 내용 검증 기법 보강

  1. 파일 헤더(Magic Number) 검사:
    • 단순히 확장자나 MIME 타입만 보는 것이 아니라, 실제 파일 헤더에 포함된 시그니처를 확인해야 합니다.
    • 예:
      • PNG 파일: 89 50 4E 47 (16진수)
      • JPG 파일: FF D8 FF
  2. 라이브러리 활용:
    • 이미지만 업로드해야 하는 경우 PHP의 getimagesize()나 Python의 Pillow 등을 활용해 파일이 정상적인 이미지인지 확인합니다.

업로드 후 후속 처리

  1. 파일 권한 제한:
    • 업로드된 파일에 실행 권한(chmod 0755)을 부여하지 않도록 제한합니다.
  2. 서버 설정:
    • 특정 디렉터리에서 PHP 해석을 막고, 정적 파일로만 제공하거나 다운로드만 가능하도록 설정할 수 있습니다.
    • 예 (Apache):
    • <Directory "/var/www/uploads"> php_admin_flag engine off AllowOverride None Options -ExecCGI -Indexes </Directory>

추가 우회 및 공격 시나리오

  1. 파일 이름 인코딩 우회:
    • 유니코드 디코딩, 퍼센트 인코딩 등을 활용하여. php.php 확장자를 감추는 방법이 있을 수 있습니다.
    • 예: webshell%2 Ephp (URL 디코딩 후. php로. php 처리됨)
  2. Chunked Upload 우회:
    • 대용량 파일을 분할하여 업로드한 뒤 서버에서 조합하여 악성 코드로 변환될 수 있습니다.