[WEBHACKING] DreamHack 웹해킹1 로드맵 / File Vulnerability

jckim22·2022년 10월 15일
0
post-custom-banner

1.파일 업로드 취약점

파일 업로드 취약점(File Upload Vulnerability)은 웹 서비스를 통해 이용자의 파일을 서버의 파일 시스템에 업로드하는 과정에서 발생하는 보안 취약점이며, 이용자가 업로드될 파일의 이름을 임의로 정할 수 있을 때 발생합니다. 파일 이름에 이용자가 입력한 문자열을 그대로 사용하거나, 이용자의 이메일, 닉네임 등을 포함시키는 등의 소스 코드 패턴이 이러한 취약점을 발생시킬 수 있습니다.

파일 업로드 취약점은 크게 Path Traversal과 악성 파일 업로드로 분류됩니다. 파일 업로드를 허용하는 대개의 서비스는 보안을 위해 특정 디렉토리에만 업로드를 허용합니다. 만약 이러한 제한이 없다면, 악의적인 이용자가 웹 서버의 소스 코드나 서버에 있는 중요 시스템 파일을 덮어 쓸 위험이 있습니다. Path Traversal 취약점은 업로드에 존재하는 이러한 제약을 우회하여, 임의 디렉토리에 파일을 업로드할 수 있는 취약점을 말합니다.

1-a Path Traversal 예시 코드

다음 코드는 파일 업로드에 취약점이 있는 코드이다.
왜냐하면 파일 이름을 필터링 없이 받기 때문이다.
이용자가 혹여나 ../ 같은 메타문자라도 넣게 되면 상위 디렉토리에 파일을 업로드할 수도 있다.

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()

아래는 정상적으로 파일을 업로드 했을 때 가는 http 요청이다.

Content-Disposition: form-data; name="file";
filename="test.txt"
Content-Type: text/plain

하지만 우리가 이렇게 요청을 조작한다면 파일은 아주 중요한 상위 디렉토리에 저장되어서 다른 파일을 덮어 씌을 수도 있다.

Content-Disposition: form-data; name="file"; filename="../hack.py"
Content-Type: text/plain

1-b 악성 파일 업로드 취약점 예시 코드

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

아래 코드는 파일 업로드를 받는 php 코드이다.
파일명의 형식이 정해져 있어서 path를 이용한 공격은 할 수 없지만 파일에 대한 제대로 된 검사가 없기 때문에 웹셸과 악성 html 파일을 업로드 할 수 있다.

<?php
if(!empty($_FILES['file'])){
  $filename = "user_uploaded_file_".time();
  $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
  }
}
?>

2. 파일 다운로드 취약점

파일 다운로드 취약점(File Download Vulnerability)은 웹 서비스를 통해 서버의 파일 시스템에 존재하는 파일을 내려 받는 과정에서 발생하는 보안 취약점이며, 이용자가 다운로드할 파일의 이름을 임의로 정할 수 있을 때 발생합니다.

웹 서비스는 이용자가 업로드한 파일을 다운로드 받거나 이미지를 불러올 때 특정 디렉토리에 있는 파일만 접근하도록 해야 합니다. Path Traversal을 이용한 파일 다운로드 취약점은 파일 이름을 직접 입력 받아 임의 디렉토리에 있는 파일을 다운로드 받을 수 있는 취약점을 말합니다.

2-a 예시 URL, 코드

아래같은 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

3. 정리

파일 취약점 (File Vulnerability): 파일을 업로드하거나 다운로드 할 때 발생하는 취약점 업로드와 다운로드 과정에서 발생하는 취약점으로 구분됨.

업로드 취약점(Upload Vulnerability): 파일 업로드 기능에서 발생하는 취약점으로 CGI로 실행되는 파일을 업로드해 시스템에 임의 명령어를 실행하거나, HTML로 해석되는 파일을 업로드하여 Cross-Site-Scripting(XSS) 공격을 수행할 수 있음. Path Traversal 취약점과 연계하여 업로드 폴더를 벗어난 곳에 공격자의 파일을 저장하는 공격도 있음.

다운로드 취약점(Download Vulnerability): 다운로드 기능에서 발생하는 취약점으로 Path Traversal 취약점과 함께 사용됨. 서버 파일 시스템에 존재하는 임의 파일을 다운로드하여 민감 정보가 포함된 파일, 예를 들어 데이터베이스 백업본, 외부 API 서버의 비밀키 등이 포함된 설정 파일등을 탈취할 수 있음.

profile
개발/보안
post-custom-banner

0개의 댓글