TeamH4C

[빡공팟 5기] W4 : Web Hacking 로드맵 - STAGE 7 - File Vulnerability

이유갬 2022. 10. 17. 12:56

ServerSide: File Vulnerability

이용자가 업로드한 파일을 데이터베이스에 저장하지 않고 서버의 파일 시스템에 저장하는 것이 개발하기 쉽고, 관리의 효율도 높다.

하지만 이를 이용하여 중요 파일을 다운로드 하거나

악성 웹셸 파일을 업로드하여서 악의저인 코드를 실행시킬 수 있는 취약점이 발생하기도 한다.

 

따라서, 이와 관련된 취약점은

파일 업로드 취약점(File Upload Vulnerability), 파일 다운로드 취약점(File Download Vulnerability)가 있다.

 

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

웹 서비스를 통해 이용자 파일을 서버의 파일 시스템에 업로드 하는 과정에서 발생한다.

특히, 이용자가 업로드 될 파일의 이름을 정할 수 있을 때 발생하는데, 파일 이름에 이용자가 입력한 문자열을 그대로 사용하거나,

이용자의 이메일, 닉네임 등을 포함시키는 등의 소스 코드 패턴이 이러한 취약점을 발생시킨다.

파일 업로드 취약점은 크게 2가지로 구분된다.

 

1. Path Traversal 취약점 :

보통 사이트는 보안을 위해서 특정 디렉토리에만 업로드를 허용한다.

이러한 제약이 없다면 악의적인 이용자가 웹 서버의 소스 코드나 서버에 있는 중요 시스템 파일을 덮어 쓸 위험이 있기 때문이다.

해당 취약점은 업로드에 존재하는 이러한 제약을 우회하여, 임의 디렉토리에 파일을 업로드할 수 있는 취약점이다.

 

(Path Traversal 취약점이 있는 코드)

/fileUpload 는 POST 요청을 받으면, 클라이언트가 전송한 파일을 ./uploads 에 저장한다.

이때, f.filename 은 이용자가 입력한 파일 이름을 그대로 사용하므로 Path Traversal 에 취약하다.

공격자가 파일 이름에 ../ 와 같은 메타 문자를 사용한다면 uploads 디렉토리를 벗어나 상위 디렉토리에 파일이 업로드 가능하다.

 

(정상적인 HTTP 요청)

위의 HTTP 요청에서 filename 의 파일 이름이 그대로 f.filename 으로 들어간다.

하지만, 이때 filename 에 ../ 와 같은 메타 문자를 사용하여 업로드 할 때 상위 디렉토리에 업로드가 가능하다.

 

(비정상적인 HTTP 요청)

 

2. 악성 파일 업로드 취약점 :

해당 취약점은 이용자가 파일을 업로드할 때, 이를 사이트가 제대로 검사하지 않아서 발생하는 취약점이다.

 

웹 셸

웹 서버는 .php, .jsp, .asp 와 같은 확장자 파일을 Common GateWay Interface(CGI) 로 실행하고, 결과를 이용자에게 반환한다.

아래 소스 코드는 이용자가 요청한 파일의 확장자가 정규표현식을 만족하면, x-httpd-php 로 핸들링하게 하는 Apache 설정 파일이다.

x-httpd-php 는 PHP 엔진이며 요청한 파일을 실행하고, 그 결과를 반환한다. .php, .php3, .phtml 이 아래의 정규 표현식을 만족한다.

많은 웹 서버들이 php 파일에 대해서 핸들링을 지원하는데, 이를 이용하여 공격자가 임의로 php 소스 파일을 .php 확장자로 업로드해서

GET 요청을 보낼 수 있으면 CGI 에 의해 해당 코드가 실행되게 할 수 있다.

 

악의적인 웹 리소스

웹 브라우저는 파일의 확장자나 응답의 Content-Type 에 따라 요청을 다양하게 처리한다.

만약 요청한 파일의 확장자가 .html 이거나, 반환된 Content-Type 의 헤더가 text/html 일 경우에 응답은 HTML 으로 처리된다.

또한 파일의 확장자가 .png, .jpg 의 이미지 확장자이거나 Content-Type 이 image/png 일 경우에는 이미지로 렌더링된다.

만일 공격자가 서버에 exploit.html 을 업로드하고 접근하는 URL 이 https://dreamhack.io/uploads/exploit.html 라면,

브라우저는 이를 HTML 로 해석한다. exploit.html 에 악의적인 스크립트를 삽입한다면, Cross-Site-Scripting (XSS) 공격으로 이어질 수 있다.

 

파일 다운로드 취약점(File Download Vulnerability)

웹 서비스를 통해서 서버의 파일 시스템에 존재하는 파일을 내려 받는 과정에서 발생하는 취약점이며,

이용자가 다운로드 할 파일의 이름을 임의로 정할 수 있을 때 발생한다.

웹 서비스는 이용자가 업로드한 파일을 다운로드 받거나 이미지를 불러올 때 특정 디렉토리에 있는 파일만 접근하도록 한다.

Path Traversal 을 이용한 파일 다운로드 취약점은 파일 이름을 직접 입력 받아서

임의 디렉토리에 있는 파일을 다운로드 받을 수 있는 취약점이다.

아래의 예시들은 파일 다운로드 취약점이 자주 발생하는 URL 패턴이다.

 

https://vulnerable-web.dreamhack.io/download/?filename=notes.txt
https://vulnerable-web.dreamhack.io/download/?filename=../../../../../../etc/passwd
https://vulnerable-web.dreamhack.io/images.php?fn=6ed0dd02806fa89e233b84f4.png

 

(간단한 실습)

 

환경 변수로부터 가지고 오는 Secret 값을 파일 다운로드 취약점을 이용해 획득하는 실습이다.

프로세스의 환경 변수는 /proc/[pid]/environ, /proc/self/environ 에서 확인할 수 있다.

만일 이용자가 프로세스를 호출하기 전에 환경 변수를 bash 의 명령어로 설정했다면, .bash_history 에서도 이를 알 수 있다.

 

 

 

<정리>

 

업로드 취약점 해결책 :

개발자는 업로드 디렉토리를 웹 서버에서 직접 접근할 수 없도록 하거나,

업로드 디렉토리에서는 CGI 가 실행되지 않도록 해야 하며,

업로드된 파일 이름을 그대로 사용하지 않고 basepath 와 같은 함수를 통해서 파일 이름을 검증 한 후 사용해야 한다.

그리고 허용할 확장자를 명시하여 그 외 확장자는 업로드 될 수 없도록 해야한다.

- 종류 : PathTraversal, 악성 파일 업로드(웹셸, 악의적인 웹 리소스)

 

다운로드 취약점 해결책 :

요청된 파일 이름을 basepath 와 같은 함수를 통해 검증하거나

파일 이름과 1:1 매핑되는 키를 만들어서 이용자로부터 파일 이름이 아닌 키를 요청하도록 해야한다.

- 종류 : PathTraversal

 

업로드 취약점 정리 :

파일 업로드 기능에서 발생하는 취약점으로 CGI 로 실행되는 파일을 업로드하여 시스템에 임의 명령어를 실행하거나,

HTML 로 해석되는 파일을 업로드하여 Cross-Site-Scripting(XSS) 공격을 수행할 수 있다. 그리고

Path Traversal 취약점과 연계하여 업로드 폴더를 벗어난 곳에 공격자의 파일을 저장하는 공격도 있다.

 

다운로드 취약점 정리 :

다운로드 기능에서 발생하는 취약점으로 Path Traversal 취약점과 함께 사용된다.

서버 파일 시스템에 존재하는 임의 파일을 다운로드해서

민감 정보가 포함된 파일(데이터베이스 백업본, 외부 API 서버의 비밀키 등이 포함된 설정 파일)을 탈취할 수 있다.