파일 업로드 파일명 검증 취약점
File Upload Lack of File Name Validation
설명
파일 업로드 기능에서 사용자 입력을 기반으로 파일명을 저장할 경우, 공격자가 조작된 파일명을 제출하여 원하지 않는 위치에 파일을 저장하거나 악성 파일을 실행할 가능성이 있습니다.
특히, ../ 또는 ..\\ 등의 경로 탐색(Path Traversal) 문자를 포함한 파일명이 허용되면, 애플리케이션이 의도하지 않은 경로에 파일을 저장하게 되어 보안 위험이 발생합니다.
잠재적 영향
임의 파일 저장: 공격자가 파일명을 조작하여 애플리케이션이 제한된 디렉터리가 아닌 임의의 위치에 파일을 저장하게 만들 수 있습니다.
파일 덮어쓰기: 기존 중요한 시스템 파일을 덮어쓸 가능성이 있습니다.
원격 코드 실행: 업로드된 파일이 실행 가능한 코드라면, 공격자가 이를 실행하여 원격 코드 실행(RCE)을 수행할 수 있습니다.
해결 방법
파일명을 직접 사용하지 않고 서버에서 생성된 안전한 파일명을 사용할 것
UUID 또는 안전한 해시값을 기반으로 파일명을 생성하여 사용합니다.
파일명 검증 및 필터링 수행
../,..\\등의 경로 탐색 문자를 제거하고, 허용된 형식의 파일명만 허용합니다.정규 표현식을 사용하여 안전한 파일명 패턴(
^[a-zA-Z0-9._-]+$)을 정의하고, 이를 벗어나는 입력을 차단합니다.
파일 저장 경로 제한
특정한 업로드 디렉터리(
/var/app/uploads등) 내에서만 파일을 저장하고, 해당 디렉터리를 벗어나지 않도록 검증합니다.
취약한 코드 및 안전한 코드 예시
취약한 코드
안전한 코드
설명:
취약한 코드:
사용자가 제공한 파일명을 검증 없이 그대로 사용하여, 공격자가
../../etc/passwd같은 파일명을 제출하면 중요한 시스템 파일을 덮어쓰거나 읽을 가능성이 있습니다.
안전한 코드:
sanitizeFileName()을 사용하여 경로 탐색 문자를 제거하고,isFileNameAllowed()로 허용된 패턴을 검증합니다.서버에서 UUID 기반의 안전한 파일명을 생성하여 사용합니다.
참조
Last updated