웹 응용프로그램을 포함하여 파일 업로드를 허용하는 자바 응용프로그램들은 공격자가 악성 파일을 업로드하거나 전달할 수 없도록 보장해야 한다.
만약 코드를 포함한 제한되어야 할 파일이 대상 시스템에서 수행된다면, 응용계층의 방어책을 무력화시킬 수 있다.
XSS 공격
HTML 파일을 업로드하도록 허용하는 응용프로그램은 악성 코드의 수행을 허용한다.
만약 출력에 대한 이스케이핑 루틴이 없을 경우에, 공격자는 크로스-사이트(XSS) 스크립팅 페이로드를 가지고 있는 HTML 파일을 보내서 공격을 수행할 수 있다.
공격 과정
1. HTML 파일 업로드
- 웹 응용프로그램이 사용자가 업로드한 HTML 파일을 저장하고, 다른 사용자들이 이 파일을 볼 수 있도록 한다.
- 이때 파일은 일반적인 텍스트 파일처럼 저장되는 것이 아니라, 웹 페이지로 인식되어 브라우저에서 렌더링 된다.
2. 출력 이스케이핑의 부재
- 출력 이스케이핑은 사용자 입력이나 외부 데이터를 웹 페이지에 삽입할 때, 해당 데이터에 포함된 HTML, JavaScript 등의 코드가 브라우저에 의해 해석되는 것을 방지하기 위한 기술이다.
- 만약 출력 이스케이핑 루틴이 없다면, 웹 애플리케이션은 사용자가 업로드한 HTML 파일을 그대로 브라우저에 출력할 것이다.
3. XSS 공격
- 공격자는 악의적인 스크립트 코드를 HTML 파일에 삽입하여 업로드한다.
- 이 스크립트는 사용자의 브라우저에서 실행될 것이며, 사용자의 세션 정보나 쿠키 등을 탈취하거나 악성 행동을 수행할 수 있다.
공격 방어책
1. 입력 검증 및 제한
- 업로드 되는 파일을 검증하여 허용된 파일 형식만 허용하도록 한다.
2. 출력 이스케이핑
- 출력되는 모든 사용자 데이터는 이스케이핑하여 HTML, JavaScript 등의 코드가 실행되지 않도록 해야 한다.
3. 콘텐츠 보안 정책
- 브라우저에서 실행 가능한 스크립트의 실행을 제한하는 콘텐츠 보안 정책을 설정해야 한다.
파일 업로드 제한
서버쪽 응용프로그램에서 아무 코드나 수행시킬 수 있는 .exe 또는 sh 같은 위험한 확장자를 가진 파일의 업로드도 제한해야 한다.
HTTP 헤더에 Content-Type 필드에 대해서만 제한하는 응용프로그램은 이러한 공격에 취약하다.
이러한 취약점에 대한 완화책은 메타데이터 속성 중에서 파일 크기(file size), 내용 타입(content type), 파일 내용(file contents)을 점검하는 것 등이다.
1. 파일 업로드 폼에서 제한
- 사용자 측에서 체크 : 사용자가 업로드하기 전에 파일 형식과 크기를 확인하고 올바른 파일만 선택할 수 있도록 도움
- 전송 전 검사 : 서버로 파일을 전송하기 전에 브라우저에서 클라이언트 측에서 제한된 파일을 선택하도록 하여, 서버의 부하를 줄일 수 있다.
부적절한 코드 - 전형적인 파일 업로드 폼
솔루션 - 파일 크기, 내용 타입 등을 제한
2. 컨트롤러에서 제한
- 보안 강화 : 사용자가 파일 업로드 폼을 조작하여 제한 조건을 우회하려는 시도를 방지할 수 있다. 사용자가 악의적인 파일을 선택하더라도 서버 측에서 제한을 체크하여 처리한다.
- 검증과 로직 분리 : 서버에서 파일 제한 조건을 검사하므로, 업로드되는 파일의 검증 로직과 실제 파일 처리 로직을 분리할 수 있다.
서버 측 파일 내용 검사
- 서버 측에서 파일의 내용 타입을 검사하고 거부하면, 공격자가 프록시 도구 등을 사용하여 HTTP 요청을 조작하여 내용 타입을 변경하더라도, 서버 측의 검사로 해당 내용 타입이 허용되지 않으면 악성 파일을 업로드하는 것을 막을 수 있다.
보안 및 사용자 경험 측면에서 컨트롤러에서 제한하는 방법이 더 강력하고 안전하다.
클라이언트 측에서의 제한은 사용자 경험 개선에 도움이 되지만, 보안 측면에서는 서버 측에서 제한하는 로직을 반드시 추가해야 한다.
일반적으로는 클라이언트 측에서 검증은 보조적인 역할을 하며, 실제 보안 검증은 서버 측에서 이루어져야 한다.
'Java > Secure Coding' 카테고리의 다른 글
[Secure Coding] 코드 인젝션을 방지하라 (0) | 2023.09.02 |
---|---|
[Secure Coding] 출력을 적절하게 인코딩하거나 이스케이핑하라 (0) | 2023.08.11 |
[Secure Coding] 보안에 민감한 메서드들이 검증된 매개변수를 가지고 호출되도록 보장하라 (0) | 2023.08.06 |
[Secure Coding] 민감한 가변적 클래스에 수정이 불가능한 래퍼를 제공하라 (0) | 2023.08.04 |
[Secure Coding] 클라이언트에 암호화되지 않은 민감-데이터를 저장하지 말라 (0) | 2023.08.03 |