File Vulnerability 

:: 파일을 업로드/다운로드 하는 기능에서 발생할 수 있는 취약점

 

ⓐ File Upload

:: 파일 업로드 기능은 사용자의 파일이 서버의 파일 시스템에 저장되어 처리된다는 이유로 인해 취약점이 발생할 수 있다.

이때 서버가 아무런 검증이 없다면 서버의 파일 시스템에 원하는 파일을 저장할 수 있다.

 

+) 웹 서버의 CGI(Common Gateway Interface) : 사용자의 요청을 받은 서버가 동적인 페이지를 구성하기 위해 엔진에 요청을 보내고 엔진이 처리한 결과를 서버에게 반환하는 기능

ex) Apache 웹 서버, php 웹 어플리케이션 사용하는 서버에 사용자가 요청을 보내면

Apache는 사용자의 요청을 해석하고,

사용자가 요청하는 리소스의 확장자가 .php와 같이 php 엔진을 사용하기로 설정되어 있는 확장자라면

mod_php(CGI)를 통해 사용자의 요청을 php 엔진이 처리 및 실행하도록 요청한다.

 

 

웹 서비스가 동작하는 경로에 사용자가 원하는 파일 내용과 파일 명을 업로드할 수 있다면

서버가 엔진에 요청하는 확장자를 업로드하여 서버의 웹 어플리케이션에 원하는 코드를 실행할 수 있다.

 

웹 어플리케이션이 실행하는 코드를 악의적 공격자가 조작할 수 있다면

웹 어플리케이션 언어에 내장된 OS 명령어 등을 사용할 수 있으며, 해당 서버의 쉘을 웹을 통해 사용한다고 하여

WebShell(웹쉘)이라는 악성코드가 등장하게 되었다.

 

<?php
if(!empty($_FILES['file'])){
  $filename = generateRandomString(); // custom function
  $ext = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
  $path = "./uploads/" . $filename . "." . $ext;
  if(move_uploaded_file($_FILES['file']['tmp_name'], $path)) {
    return true; // upload success
  } else {
    return false; // upload fail
  }
}
?>

이러한 코드를 가지는 업로드 페이지가 있다면,

php 파일을 업로드하여 php를 실행시키거나 html 파일 등을 업로드하여 Stored XSS 취약점을 발생시킬 수 있다.

 

 

이런식으로 .php, .php3/4/5/7, .pht, .phtml 등의 파일 확장자를 업로드하여 php 엔진이 처리하도록 유도할 수 있다.

 

 

 

ⓑ File Download

파일 다운로드 기능을 구현할 때 발생하는 취약점의 형태는 사용자가 입력한 파일이름을 검증하지 않은 채 그대로 다운로드를 제공하는 형태이다.

 

...
@app.route("/download")
def download():
    filename = request.args.get("filename", "")
    return open("uploads/" + filename, "rb").read()
...

위와 같은 코드를 가지는 다운로드 페이지가 있다고 하면

Path Traversal과 같은 Injection 공격을 통해 uploads 경로보다 더 상위 경로에 존재하는 시스템 파일, 설정 파일과 같은 중요한 정보들을 다운로드 할 수 있다.

 

※파일 다운로드 취약점을 막기 위해선?

- 기본적으로 인자에 다운로드 받으려는 파일의 경로나 이름을 넘기지 않은 것이 좋다.

- 반드시 이름을 넘기는 방식으로 구현해야 한다면 상대경로로 접근하는데 사용될 수 있는 ../를 적절하게 필터링 해야한다.

- 또 다른 방법으로, 데이터베이스에 다운로드 될 파일의 경로와 그에 해당하는 랜덤키를 생성해 1대 1로 매칭해서 저장해두고 해당 랜던 값이 인자로 넘어왔을 때 데이터베이스에 존재하는 파일인지를 먼저 식별하고 다운로드 하는 방법이 있다.

+ Recent posts