본문 바로가기

KERT/HackHeat

파일 취약점(File Vulnerability)

파일 취약점은 업로드할 때 발생하는 취약점과, 다운로드할 때 발생하는 취약점으로 나뉜다.

 

🤯 File Upload Vulnerability

  • 공격자의 파일을 웹 서비스의 파일 시스템 상 임의 경로에 업로드하는 과정에서 발생하는 보안 취약점.
  • CGI 로 실행되는 파일을 업로드해 시스템에 임의 명령어를 실행하거나, HTML 파일을 업로드하여 XSS 공격을 수행할 수 있다.
  • Path Traversal 와 함께 쓰여 업로드 폴더를 벗어난 곳에 공격자의 파일을 저장하는 공격도 있다.

😱 File Download Vulnerability

  • 웹 서비스의 파일 시스템에 존재하는 파일을 다운로드 하는 과정에서 발생하는 보안 취약점.
  • 공격자는 웹 서비스의 파일 시스템에 존재하는 임의 파일(설정 파일, 패스워드 파일, 데이터 베이스 백업 본) 등을 다운로드 하여 민감한 정보를 탈취할 수 있고 2차 공격을 수행할 수 있습니다.
  • Path Traversal 취약점과 함께 사용됨

1. 업로드 취약점

- Path Traversal 악성 파일 업로드 로 분류됨

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

- 파일 업로드를 허용하는 대개의 서비스는 보안을 위해, 특정 디렉터리에만 업로드를 허용합니다.

- 이러한 제한이 없다면, 공격자는 웹 서버의 소스 코드나, 서버에 있는 중요한 시스템 파일을 덮어 쓸 수 있게 된다.

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

이 코드는 파일 업로드 기능이 취약한 웹 서비스의 코드이다.

 

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

 

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

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

. 현재 디렉터리를 나타냅니다. /var/www/./html --> /var/www/html
.. 상위 디렉터리를 나태냅니다. /var/www/../html --> /var/html

../ 을 통해 www 가 아닌 하나 상위인 var 에 html 을 저장할 수 있다.

 

2) 악성 파일 업로드

공격자가 임의의 악성 파일을 업로드 시키는 경우로, 파일에 대한 검사를 하지 않을 때 발생하는 취약점이다.

웹 셸 이란?

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

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

 

Common Gateway Interface(CGI) 란?

웹에서 동적인 컨텐츠를 처리하기 위해서 웹 서버와 php 같은 외부의 프로그램에 사이에서 인터페이스를 제공하는 프로토콜이 CGI입니다.

 

악의적인 웹 리소스

웹 브라우저는 파일의 확장자나 응답의 Content-Type에 따라 요청을 다양하게 처리합니다. 만약 요청한 파일의 확장자가 .html 이거나, 반환된 Content-Type 헤더가 text/html일 경우 응답은 HTML 엔진으로 처리됩니다. 또, 파일의 확장자가 .png, .jpg등의 이미지 확장자이거나, Content-Type이 image/png일 경우에는 이미지로 렌더링됩니다.
만약 공격자가 서버에 exploit.html을 업로드하고, 이에 접근하는 URL이 https://dreamhack.io/uploads/exploit.html 이라면, 브라우저는 이를 HTML로 해석됩니다. exploit.html에 악의적인 스크립트를 삽입하면, Cross-Site-Scripting (XSS) 공격으로 이어질 수 있습니다.

 

모듈 실습

임의의 명령어를 실행시키는 php 파일을 업로드하였다.

 

<?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 웹셸을 업로드할 수 있고, 

html 확장자를 입력하면 html 파일을 업로드하여 Stored XSS 를 수행하게 될 수도 있을 것이다.

 

파일 주소를 누르면 php 코드 실행이 감지되었다는 팝업이 뜬다.

 

다음으로 html 파일을 업로드 할 수도 있다.

업로드된 html 파일 주소를 클릭하면 팝업이 뜬다

<script>alert(1);</script> 라는 자바스크립트가 실행된 것이다.

파일 다운로드 취약점

웹 서비스를 통해 서버의 파일 시스템에 존재하는 파일을 내려 받는 과정에서 발생하는 보안 취약점

원인: 이용자가 다운로드할 파일의 이름을 임의로 정할 수 있을 때(Path Traversal 을 이용) 발생 

 

모듈 실습

 

download 함수를 보면 이 모듈은 uploads 디렉터리에서 읽기모드로 열어서 content 에 저장하고 그것을 반환하고 있다.

secret 변수를 확인하면 os.environ("Secret")이라고 되어있다.

 

모듈의 파일 디렉터리를 확인해보면 proc 에 environ 이 있고, 이 파일은 app 과 동일한 상에 있기 때문에

../ 로 상위로 이동함으로써 proc 에 접근할 수 있다.

 

../../../proc/self/environ 을 입력하여 Secret=Melon 이라는 값을 획득할 수 있게 된다.

'KERT > HackHeat' 카테고리의 다른 글

SSRF(Server-side Request Forgery)  (0) 2023.09.18
Command Injection  (0) 2023.08.14
NoSQL Injection  (0) 2023.07.27
NoSQL 개념과 MongoDB 기본 문법  (0) 2023.07.26
SQL Injection  (0) 2023.07.21