Web/Web 보안

[File Upload ] 대응방안 정리

Mr.robot 2 2022. 6. 3. 19:35

File Upload와 File Download 공격 및 대응방안 정리

https://knowledge-base.secureflag.com/vulnerabilities/unrestricted_file_download/unrestricted_file_download_vulnerability.html

File upload의 대응방안

(1) DB에 파일 명과 그 안의 데이터를 올린다.

일반적으로 서버에서 파일이 실행되어 결과를 출력하기 위해서는 서버에서 실행되는 확장자를 가지고 있어야한다. 그 후 파일 위치를 찾아서 실행을 해야하면 어떤 코드인지에 따라 서버의 데이터를 가져올 수도 있다. 그렇다면 이 파일이 실행되지 않게 파일명은 과 데이터를 byte 코드로 db에 저장해버리는 것이다. 이렇게 되면 해당 파일을 실행할 수 없게 되기 때문에 우회가 어려워 진다.

(2) DB로 파일 경로를 저장한다.

서버에 만약 실행가능한 파일을 업로드한다고 해도 실행을 하지 못한다면 말짱도루묵일 것이다. 이를 해결하기 위해서는 업로드되는 파일의 경로를 DB에 저장해서 실행자체를 못하게 하는 것이다. 다만 문제점이 있다. DB의 취약점이 있다면 이는 우회가 가능하기 때문이다. 즉 SQL Injection이 가능하다면 DB를 장악해서 데이터를 뽑아내서 우회가 가능해진다.

(4) 파일이 저장되는 곳의 Directory의 실행 권한을 제한한다.

Directory는 권한을 설정할 수 있는 폴더이기 때문에 파일을 저장할때 실행이 불가능하도록한다면 우회가 어려워진다. 다만 저장되는 위치를 변경가능하다면 우회가 가능하기 때문에 코드를 짤때 이 점을 유의해야한다.

(5)Filde upload시 화이트리스트 기반으로 확장자를 필터링 한다.

가장좋은 것은 DB로 파일을 관리하는 것이지만 그에 차선책으로 white list filtering 또한 좋은 필터링이다. 확장자 명을 잘 구분하여 가져온 다음에 해당 확장자가 허용하는 확장자가 아닐경우에 업로드를 막는 것인데 여기서 한가지 주의해야할 점이 있다. 확장자를 가져올때 서버에 임시적으로 파일을 가져와 임시폴더에 저장 후 판별 한다음에 삭제할지 아니면 그대로 저장할 것인지를 판별하게 되는데 이 방법이 취약점이 될 수 있다. burp suit에서 turbo intruder가 있다. turbo inruder는 원하는 요청을 매우 짧은시간에 여러번 보내게 되는 것인데. 파일의 확장자를 판별하기위해 서버로 올릴때는 서버에 해당 파일이 있기 때문에 파일이 존재하는 짧은시간동안 다운로드 요청을 여러번 보내는 것이다. 이 경우 파일이 다운로드 되거나 실행이 될 수 있기 때문에 이점도 고려해야할 점이다.

 

LFI(Local File Inclusion)

이미지 파일을 올리기만 해도 실행이 된다면 얼마나 좋을까? 하지만 그것이 불가능하기 때문에 위와 같이 여러 경로로 우회를 하게되는 것이다. 하지만 한가지 우회방법이 존재한다. 그것은 include를 이용하는 것이다.

페이지를 만들때 사용되는 이미지는 수정할때 모든 파일을 수정하기 어렵기 때문에 이미지를 불러오는 코드를 작성하여 따로 저장하게 된다. 즉 하나를 수정해도 사이트 전체가 수정이 되는 것이다. 

아래와 같이 image.php에서 이미지 파일을 불러오는 include함수가 있다고 하자 이 경우에는 include()가 <?php ?> 묶이게 되고  image.php에 의해 불러오는 이미지 내부 데이터가 php 안에 들어가서 실행되게 된다. 즉 image 파일이여도 파일이 실행되게 되는 것이다.

<?php
	
	include('./image.php')
	

	.....
    ...
    ..

?>

이렇게 include가 있는곳은 대게 어디일까? 바로 언어별로 해석하는 경우 php 를 참고하기 때문에 이 경로를 burp suit으로 바꿔서 악성 코드를 업로드하게 되는 것이다.