1. 파일 업로드 취약점의 위험성
CWE-434는 공격자가 서버에서 실행 가능한 형태의 파일(예: .jsp, .php, .asp, .exe 등)을 업로드하여 서버의 제어권을 탈취하는 취약점입니다. 공격자가 업로드에 성공하고 해당 파일의 경로를 알아내어 실행시키면, 서버 내부에서 임의의 명령을 수행하는 웹쉘(WebShell) 공격으로 이어집니다. 이는 시스템 파괴, 데이터 유출, 내부망 침투의 교두보가 되는 매우 치명적인 위협입니다.
2. 흔히 발생하는 불충분한 검증 패턴
가장 위험한 방식은 클라이언트 사이드(JavaScript)에서만 확장자를 체크하거나, 서버에서 단순히 파일명의 끝부분(.jpg 등)만 확인하는 경우입니다. 공격자는 프록시 도구를 사용하여 확장자를 위조하거나, test.jsp.jpg와 같은 이중 확장자, 또는 대소문자 변조(test.JSP) 등을 통해 이러한 허술한 검증을 손쉽게 우회합니다.
3. 실무적 대응: 다중 방어 전략(Defense in Depth)
단순한 이름 체크를 넘어 다음과 같은 다중 방어막을 구축해야 합니다.
• 화이트리스트 확장자 검증: 허용된 확장자(.jpg, .pdf 등) 외에는 모두 차단합니다.
• Magic Number 체크: 파일의 헤더(바이트 배열)를 읽어 실제 파일 형식이 확장자와 일치하는지 검증합니다.
• 업로드 경로 격리: 업로드된 파일이 웹 서버의 실행 권한이 없는 별도의 스토리지나 디렉터리에 저장되도록 설정합니다.
• 파일명 변경: 저장 시 원래 파일명 대신 서버에서 생성한 난수(UUID 등)로 이름을 변경하여 공격자가 업로드 경로를 추측하지 못하게 합니다.
4. CWE-434 대응 및 안전한 파일 업로드 자바 코드 예시
코멘트: 파일 업로드 기능은 서버의 대문을 열어주는 것과 같습니다. 사용자가 보내는 파일의 이름과 내용을 절대 신뢰하지 마십시오. 확장자 화이트리스트 검증과 파일명 난수화는 기본이며, 가능하다면 파일 헤더 검증까지 포함하는 꼼꼼함이 필요합니다. logger.debug()를 통해 의심스러운 업로드 시도를 기록하되, 공격자의 악성 스크립트가 서버에서 실행될 수 있는 단 1%의 가능성도 차단하는 것이 시큐어 코딩의 핵심입니다.
댓글 달기