gyumin.log

파일 업로드 취약점과 웹셸

프로필 사진 하나 올리는 기능이 어떻게 서버를 통째로 내주는 문이 되는지. 오늘은 파일 업로드 취약점과 그 끝에 있는 웹셸을 정리한다.

정의

업로드 파일의 종류·내용을 제대로 검증하지 않아, 공격자가 서버에서 실행되는 악성 파일을 올려 서버를 장악하는 취약점.

왜 생기나

첨부파일·프로필 사진 기능에서 확장자나 파일 형식을 검사하지 않거나, 검사를 우회할 수 있게 허술하게 만들 때 생긴다.

웹셸이 핵심

웹셸은 웹으로 서버 명령을 실행하는 악성 파일이다. 흐름은 이렇다.

  1. shell.php 같은 서버 실행 파일을 업로드한다.
  2. 업로드된 파일의 실제 경로를 찾는다. (예: /uploads/shell.php)
  3. 그 주소로 접속하면 브라우저에서 서버 명령을 실행할 수 있다.

이 순간 공격자는 사실상 서버를 원격 조종하게 된다. SQL 인젝션이 데이터를 노린다면, 웹셸은 서버 자체를 가져간다.

검증 우회 수법

확장자만 막으면 이런 식으로 뚫린다.

수법
이중 확장자shell.php.jpg
대소문자shell.pHp
이미지 위장파일 앞에 이미지 시그니처를 붙여 .jpg로 통과
화이트리스트 우회서버 설정에 따라 실행되는 다른 확장자(.phtml 등)

실제 사례

  • 차이나 초퍼(China Chopper): 크기가 몇 바이트밖에 안 되는 초경량 웹셸. 여러 공격 그룹이 파일 업로드나 웹 서버 취약점으로 이 웹셸을 심어 서버를 장악한 사례가 꾸준히 보고됐다.
  • 국내 웹사이트 변조(디페이스) 사고: 상당수가 게시판 첨부파일의 업로드 검증 미흡에서 시작됐다. KISA 진단 항목에서 업로드·다운로드가 고위험으로 분류되는 이유다.

막는 법

  • 확장자 화이트리스트(허용 목록)로만 받는다. 블랙리스트(금지 목록)는 우회당하기 쉽다.
  • 파일 내용(시그니처)까지 검사한다.
  • 업로드 폴더에서 스크립트 실행 자체를 차단한다. 올라와도 실행이 안 되면 웹셸은 무력하다.
  • 업로드된 파일명을 서버가 새로 지어(랜덤) 경로를 추측 못 하게 한다.

용어: 디페이스(deface)는 웹사이트 화면을 임의로 바꿔치기하는 공격. 시그니처는 파일 종류를 식별하는 앞부분의 고유 바이트값.