Bazinga!
웹 애플리케이션 파일 확장자 우회 & 방어 방법에 대하여 본문
해당 웹사이트는 이미지 파일은 게시글에 보이도록, 이미지 형식이 아닌 파일은 다운로드 받을 수 있도록 만들어졌다.
<?php if(isset($_GET['cmd'])) { system($_GET['cmd']); } ?>
이 PHP 코드는 서버에서 원격 명령을 실행할 수 있는 단순한 웹 셸이다.
shell.jpg.php의 이름으로 .jpg 같은 확장자와 .php를 조합하여 업로드 하였더니 이미지가 아닌 파일 형식으로 게시글에 업로드 되었다.
Uploads파일에 php파일이 저장된 것을 확인가능
whoami 명령어가 실행되고 서버에서 반환되는 결과로 사용자 계정(www-data)이 출력되었다.
이는 서버가 PHP 파일을 정상적으로 실행하고 있는 것이며, 악성 코드가 실행될 수 있는 상태이다.
위와 같은 공격을 통해 공격자는 서버에 대한 완전한 제어권을 획득할 수 있게 된다.
업로드 관련 취약점을 방어하기 위해서는 어떻게 해여할까?
1. 파일 업로드 필터링 강화
- 업로드 파일의 확장자를 철저히 확이해야하며, 이미지 파일인지 MIME 타입 검사를 수행해야한다.
- 업로드된 파일에 실행 권한을 제거해야한다.
2. 파일명 검증 및 저장 경로 보호
- 사용자 입력에 따라 파일 이름을 변경하지 말고, 서버에서 무작위 파일명을 생성하여 저장하도록 한다,.
- 업로드 디럭터리를 웹 루트 웨부에 두거나 .htaccess를 사용해 php 실행을 차단한다.
3. 입력값 필터링을 철저히 수행한다.
4, 웹 방화벽(WAF)사용
5, 권한 분리 및 로그 모니터링
- 웹 서버와 파일 업로드 경로에 대한 접근 권한을 제한한다.