파일 업로드 취약점

IT 위키
File Upload Vulnerability
서버가 업로드 파일의 형식과 저장 위치를 제대로 통제하지 않아, 실행 가능한 파일이 올라가 서버에서 동작하게 되는 취약점

공격자가 웹셸을 올리면 중요 정보 탈취, 시스템 명령 실행, 다른 서버로의 확산까지 이어진다. OWASP Top 10 의 상위 항목에 꾸준히 들어 있다.

검증 로직 우회 기법

[편집 | 원본 편집]
기법 내용
파일 타입 변조 프록시 도구로 요청 헤더의 Content-Type 을 `image/jpeg` 등으로 바꾼다. 서버가 이 값만 믿으면 통과한다
확장자 대소문자 섞기 `test.PhP`, `test.pHp`. 비교가 대소문자를 구분하면 뚫린다
이중 확장자 `test.php.jpg` 또는 `test.jpg.php`. 서버의 확장자 판정 위치(앞/뒤)에 따라 한쪽이 통과한다
널 바이트 삽입 `test.php%00.jpg`. 검증 로직은 `.jpg` 로 보지만, 저장할 때 C 문자열 처리가 `%00` 을 끝으로 해석해 `test.php` 로 저장된다
대체 확장자 `.phtml`, `.php3`, `.php5`, `.inc`, `.shtml` 처럼 서버가 함께 실행하는 확장자를 쓴다
경로 조작 파일명에 `../` 를 넣어 웹 루트 밖이나 실행 가능한 디렉터리에 저장시킨다
시그니처 위조 파일 앞에 JPEG 파일 시그니처(FF D8 FF)를 붙이고 뒤에 코드를 이어 붙인다

공격이 성공하기 위한 조건

[편집 | 원본 편집]
  1. 변조한 타입이나 확장자가 서버의 필터링을 통과해야 한다
  2. 업로드 용량 제한(`LimitRequestBody`, `upload_max_filesize`)에 걸리지 않아야 한다
  3. 저장된 파일이 웹으로 접근 가능한 경로에 있어야 한다
  4. 그 경로에서 스크립트 실행이 허용되어야 한다. `AddType` 으로 MIME 을 `text/html` 로 재지정했거나 `FilesMatch` 로 직접 호출이 금지돼 있으면 실행되지 않는다
  • 확장자 허용 목록(Whitelist)으로 검증한다. 차단 목록은 언제나 빠진 것이 생긴다
  • 서버 측에서 검증한다. 클라이언트 검증은 우회된다
  • Content-Type 을 믿지 않고 파일 시그니처를 직접 확인한다
  • 저장 파일명을 무작위로 재생성하고 원본 이름은 DB 에만 둔다
  • 웹 루트 밖에 저장하고, 다운로드는 별도 스크립트로 중계한다
  • 업로드 디렉터리에서 스크립트 실행을 차단한다 (`php_flag engine off`, `Options -ExecCGI`)
  • 용량·개수 제한, 백신 검사, WAF

같이 보기

[편집 | 원본 편집]