본문 바로가기
Web hacking/개념 정리 & 심화

[Dreamhack] W - STAGE 8 File Vulnerability

by m_.9m 2023. 5. 4.

1. Server Side: File Vulnerability


파일 업로드 취약점은 웹 서비스의 파일 시스템에 업로드 하는 과정에서 발생하는 보안 취약점이다. 파일 시스템 상 임의의 경로에 원하는 파일을 업로드 하거나 악성 확장자를 갖는 파일을 업로드 할 수 있을 때 발생한다. 이를 통해 원격 코드 실행 취약점까지 연계가 가능하다.

파일 다운로드 취약점은 웹 서비스의 파일을 다운로드 하는 과정에서 발생한다. 파일 시스템에 존재하는 설정 파일, 패스워드 파일, 파일 데이터 베이스 백업 본 등을 다운로드 하여 민감한 정보를 탈취할 수 있고 2차 공격을 수행할 수 있다.

1.1 File Upload Vulnerability


파일 업로드 취약점은 웹 서비스를 통해 이용자의 파일을 서버의 파일 시스템에 업로드 하는 과정에서 발생하는 보안 취약점이며, 이용자가 파일의 이름을 임의로 정할 수 있을 때 발생한다. 파일 업로드 취약점은 크게 Path Traversal과 악성 파일 업로드로 분류된다.

1.1.1 Path Traversal

파일 업로드는 보통 보안을 위해 특정 디렉토리에만 업로드를 허용하는데 Path Traversal은 업로드에 존재하는 이런 제약을 우회하여, 임의의 디렉토리에 파일을 업로드 할 수 있는 취약점을 말한다.


Figure 1. 파일 업로드 기능이 취약한 웹 서비스 코드


from flask 
import Flask, request

app = Flask(__name__)@app.route('/fileUpload', methods = ['GET', 'POST'])
def upload_file():	
	if request.method == 'POST':		
			f = request.files['file']		
			f.save("./uploads/" + f.filename)		
			return 'Upload Success'	
	else:		
			return """		
			<form action="/fileUpload" method="POST" enctype="multipart/form-data">
			<input type="file" name="file" />
			<input type="submit"/>		</form>
		"""

if __name__ == '__main__':	
app.run()

위는 filename을 사용자에게 받아 아무런 검증업이 파일에 업로드하기 때문에 ../와 같은 메타문자를 사용하면 상위 디렉토리에도 파일을 업로드할 수 있다.

1.1.2 악성 파일 업로드


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

웹 셸

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

Figure 6. Apache 설정 파일


<FilesMatch ".+\\.ph(p[3457]?|t|tml)$">
    SetHandler application/x-httpd-php
</FilesMatch>

Figure 6은 이용자가 요청한 파일의 확장자가 정규 표현식 “.+\\.ph(p[3457]?|t|tml)$”를 만족하면, x-httpd-php로 핸들링 하게하는 Apache의 설정파일이다. x-httpd-php는 PHP 엔진이며 요청한 파일을 실행하고 결과를 반환합니다. .php, .php3, .phtml이 위의 정규 표현식을 만족한다.

악의적인 웹 리소스

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

1.2 File Download Vulnerability


파일 다운로드 취약점은 웹 서비스를 통해 서버의 파일 시스템에 존재하는 파일을 내려받는 과정에서 발생하며 이용자가 다운로드할 파일의 이름을 임의로 정할 수 있을 떄 발생한다.

웹 서비스는 이용자가 파일을 다운로드하거나 이미지를 불러올 때 특정 디렉토리에 있는 파일만 접근하도록 해야한다. 다음은 파일업로드가 발생할 수 있는 URL 패턴이다.

Figure 12. 파일 다운로드 취약점이 자주 발생하는 URL 패턴


1. <https://vulnerable-web.dreamhack.io/download/?filename=notes.txt>
2. <https://vulnerable-web.dreamhack.io/download/?filename=../../../../../../etc/passwd>
3. <https://vulnerable-web.dreamhack.io/images.php?fn=6ed0dd02806fa89e233b84f4.p>

1.3 퀴즈

실행 중인 프로세스의 전체 메모리 구조는 /proc/pid(self)/maps에서 확인할 수 있다. 실행했던 프로세스 id에 메모리 구조를 나타내는 파일이다.