IT/영어 공부노트
File Upload / File Download 취약점 정리 본문
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://dreamhack.io/lecture/courses/15
https://owasp.org/www-community/vulnerabilities/Unrestricted_File_Upload