IT/영어 공부노트

File Upload / File Download 취약점 정리 본문

🛡️ security/web

File Upload / File Download 취약점 정리

소저어엉 2023. 7. 31. 11:32
반응형

File Upload

파일 업로드 기능이 존재하는 웹 상업로드 파일에 대한 제어(필터링, 개수 및 크기 제한 등) 미흡으로 부에서 파일이 업로드 될 수 있는 취약점이다. 

파일 업로드 취약점으로 서버 파일시스템에 파일 경로/파일 명을 업로드 할 수 있다 -> 공격자가 파일을 업로드하여 공격에 사용할 수 있다.

CGI(Common Gateway Interface): 사용자의 요청을 받은 서버가 동적인 페이지를 구성하기 위해 엔진에 요청을 보내고 엔진이 처리한 결과를 서버에서 반환하는 기능 
php, jsp, asp 등과 같이 CGI를 통해 서비스를 하는 형태에서는 확장자를 통해 웹 어플리케이션 엔진에 요청 여부를 판단한다. 
※ .php확장자 외에도 .php3/4/5/7, .pht, .phtml 등의 확장자를 가진 파일이라면 php에서 처리되도록 핸들링

 

예시 

애플리케이션 플랫폼에 대한 공격

  • 웹 트리에 .jsp 파일 업로드 - 웹 사용자로 실행되는 jsp 코드
  • 크기를 조정할 .gif 파일 업로드 - 이미지 라이브러리 결함 악용
  • 대용량 파일 업로드 - 파일 공간 서비스 거부
  • 악성 경로 또는 이름을 사용하여 파일 업로드 - 중요한 파일 덮어쓰기
  • 개인 데이터가 포함된 파일 업로드 - 다른 사용자가 액세스
  • "태그"가 포함된 파일 업로드 - 태그는 웹 페이지에 "포함"되는 일부로 실행
  • 바이러스 백신으로 검사할 .rar 파일 업로드 - 취약한 바이러스 백신 소프트웨어를 실행하는 서버에서 실행되는 명령

다른 시스템에 대한 공격

  • .exe 파일을 웹 트리에 업로드 - 피해자가 트로이목마 실행 파일을 다운로드
  • 바이러스에 감염된 파일 업로드 - 피해자의 컴퓨터 감염
  • 스크립트가 포함된 .html 파일 업로드 - 피해자가 XSS를 경험
  • Flash 개체가 포함된 .jpg 파일 업로드 - 피해자가 Cross-site Content Hijacking 경험 
  • 바이러스 백신으로 검사할 .rar 파일 업로드 - 취약한 바이러스 백신 소프트웨어를 실행하는 클라이언트에서 실행되는 명령

 

1. Path Traversal

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

- 보안을 위해 특정 디렉토리에만 업로드를 허용하는 제약

@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>
		"""

파일업로드 시 이용자가 입력한 파일 이름 f.filename을 그대로 사용하기 때문에 취약점 발생

 

ex) .. 를 통해 우회해 상위 디렉토리에 파일 저장

 

2. 악성 파일 업로드

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

웹셸 업로드, Stored XSS로 활용 가능 

 

해결방법

  • 개발자는 업로드 디렉터리를 웹 서버에서 직접 접근할 수 없도록 하거나, 업로드 디렉터리에서는 CGI가 실행되지 않도록 해야 한다. 
  • 업로드된 파일 이름을 그대로 사용하지 않고, basepath와 같은 함수를 통해 파일 이름을 검증한 후 사용해야 한다. 
  • 허용할 확장자를 명시해 그 외 확장자는 업로드될 수 없도록 해야 한다. 

File Download

파일이름을 검증하지 않은 채 다운로드를 제공하는 행위로, 원 디렉토리 보다 더 상위 경로에 존재하는 중요정보를 담은 디렉토리의 정보를 다운로드 할 수 있게 된다. 

이는 다른 공격을 사용하기 위한 전 단계로 많이 쓰인다. 
설정파일, 패스워드 파일, 데이터 베이스 백업 본 등을 다운로드 하여 민감한 정보를 탈취하고 2차 공격을 수행할 수 있다. 


인자에 다운로드 받으려는 파일의 경로나 이름을 넘기지 않는게 좋다. 
-> 반드시 사용해야 한다면, .. / \\ 를 필터링 해야한다. 

 

파일 다운로드 취약점이 자주 발생하는 URL 패턴 

https://vulnerable-web.dreamhack.io/download/?filename=notes.txt
https://vulnerable-web.dreamhack.io/download/?filename=../../../../../../etc/passwd
https://vulnerable-web.dreamhack.io/images.php?fn=6ed0dd02806fa89e233b84f4.png

참조

https://dreamhack.io/lecture/courses/15

https://owasp.org/www-community/vulnerabilities/Unrestricted_File_Upload

https://isc9511.tistory.com/107

반응형