파일 업로드 취약점과 웹셸
프로필 사진 하나 올리는 기능이 어떻게 서버를 통째로 내주는 문이 되는지. 오늘은 파일 업로드 취약점과 그 끝에 있는 웹셸을 정리한다.
정의
업로드 파일의 종류·내용을 제대로 검증하지 않아, 공격자가 서버에서 실행되는 악성 파일을 올려 서버를 장악하는 취약점.
왜 생기나
첨부파일·프로필 사진 기능에서 확장자나 파일 형식을 검사하지 않거나, 검사를 우회할 수 있게 허술하게 만들 때 생긴다.
웹셸이 핵심
웹셸은 웹으로 서버 명령을 실행하는 악성 파일이다. 흐름은 이렇다.
shell.php같은 서버 실행 파일을 업로드한다.- 업로드된 파일의 실제 경로를 찾는다. (예:
/uploads/shell.php) - 그 주소로 접속하면 브라우저에서 서버 명령을 실행할 수 있다.
이 순간 공격자는 사실상 서버를 원격 조종하게 된다. SQL 인젝션이 데이터를 노린다면, 웹셸은 서버 자체를 가져간다.
검증 우회 수법
확장자만 막으면 이런 식으로 뚫린다.
| 수법 | 예 |
|---|---|
| 이중 확장자 | shell.php.jpg |
| 대소문자 | shell.pHp |
| 이미지 위장 | 파일 앞에 이미지 시그니처를 붙여 .jpg로 통과 |
| 화이트리스트 우회 | 서버 설정에 따라 실행되는 다른 확장자(.phtml 등) |
실제 사례
- 차이나 초퍼(China Chopper): 크기가 몇 바이트밖에 안 되는 초경량 웹셸. 여러 공격 그룹이 파일 업로드나 웹 서버 취약점으로 이 웹셸을 심어 서버를 장악한 사례가 꾸준히 보고됐다.
- 국내 웹사이트 변조(디페이스) 사고: 상당수가 게시판 첨부파일의 업로드 검증 미흡에서 시작됐다. KISA 진단 항목에서 업로드·다운로드가 고위험으로 분류되는 이유다.
막는 법
- 확장자 화이트리스트(허용 목록)로만 받는다. 블랙리스트(금지 목록)는 우회당하기 쉽다.
- 파일 내용(시그니처)까지 검사한다.
- 업로드 폴더에서 스크립트 실행 자체를 차단한다. 올라와도 실행이 안 되면 웹셸은 무력하다.
- 업로드된 파일명을 서버가 새로 지어(랜덤) 경로를 추측 못 하게 한다.
용어: 디페이스(deface)는 웹사이트 화면을 임의로 바꿔치기하는 공격. 시그니처는 파일 종류를 식별하는 앞부분의 고유 바이트값.