본문 바로가기

웹해킹

ServerSide: File Vulnerability

이미지나 문서 등의 파일 업로드 기능이 존재하는 웹 서비스에는 파일과 관련된 취약점이 존재한다.

파일 업로드와 관련된 취약점은 파일 업로드 취약점(File Upload Vulnerability)이고,

파일 다운로드와 관련된 취약점은 파일 다운로드 취약점(File Download Vulnerability)라고 한다.

 

<File Upload Vulnerability>

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

이런 코드로 구성된 웹 서비스에서 파일 이름에 ../ 등을 이용해서 원하는 파일 위치로 이동할 수 있다.

 

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

공격자가 임의의 php 파일을 .php 확장자로 업로드하고, GET 요청을 보내면 해당 코드가 실행되게 할 수 있다.

<?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
  }
}
?>

이렇게 구성된 시스템에 파일 확장자를 .php로 하고

<?php
  system("ls");
  system($_GET[x]);
?>

이런 식으로 php 코드를 올려서 실행시킬 수 있다.

 

<File Download Vulnerability>

파일 다운로드 취약점은 웹 서비스를 통해 서버의 파일을 다운로드하는 과정에서 발생하는 취약점이다.

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

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

이렇게 다운받을 파일 이름을 조작해서 원하는 파일을 받을 수 있다.

'웹해킹' 카테고리의 다른 글

드림핵 file-download-1 롸업  (0) 2023.11.05
드림핵 image-storage 롸업  (0) 2023.11.05
드림핵 command-injection-1 롸업  (0) 2023.11.04
ServerSide: Command Injection  (0) 2023.11.04
드림핵 Mango 롸업  (0) 2023.11.04