[게시판 실습] - 파일 업로드 (1) 웹쉘 파일 업로드 확인
[설 명]
파일 업로드 기능을 이용하여 시스템 명령어를 실행하는 웹 프로그램을 업로드할 수 있는 취약점으로, 해당 취약점이 존재할 경우 공격자는 조작된 *Server Side Script 파일을 서버에 업로드 및 실행하여 시스템 관리자 권한 획득 또는 인접 서버에 대한 침입을 시도할 수 있으므로 업로드되는 파일의 확장자에 대한 적절성 여부를 검증하는 로직을 통해 공격자가 조작된 Server Side Script 파일 업로드 방지 및 서버 상에 저장된 경로를 유추하여 해당 Server Side Script 파일 실행을 불가능하게 하여야 한다.
[점검 내용]
웹 사이트의 게시판, 자료실 등에 조작된 Srever Sdie Script 파일 업로드 및 실행 가능 여부 점검
[점검 기준]
업로드되는 파일에 대한 확장자 검증이 이루어지지 않는 경우 취약
[대응 방법]
* 화이트 리스트 방식으로 허용된 확장자만 업로드 간으토록 서버 측 통제 적용
* 업로드되는 파일을 디렉터리에 저장할 때 파일명과 확장자를 외부 사용자가 추측할 수 없는 문자열로 변경하여 저장(파일 이름은 DB에 저장)
* 업로드 파일을 위한 전용 디렉터리를 별도로 생성하여 웹 서버 데몬 설정 파일(httpd.conf 등)에서 실행 설정을 제거함으로써, Server Side Script가 업로드되더라도 웹 엔진이 실행하지 않는 환경을 설정함
※ 사용자가 파일을 업로드할 수 있는 모든 모듈에 적용
[진단 과정]
1) 'hacker' 계정으로 로그인 후 게시글 작성 시 임의의 파일을 업로드합니다.
2) 프록시 도구를 통하여 확인 시 응답값 내 파일 경로 및 저장된 파일명이 노출되는 것을 확인하였습니다.
3) 2번 과정에서 획득한 파일 경로로 접속하여 확인한 결과 정상적으로 접근이 되는 것을 확인하였습니다.
4) 이번에는 웹쉘 파일(webshell.jsp)을 업로드하였습니다.
5) 프록시 도구를 통하여 응답값 내 파일 저장 경로와 파일명으로 획득한 후 획득한 URL을 통하여 접속을 시도하였습니다. 접속 시 커맨드를 입력할 수 있는 창이 출력되며 명령어 입력 시 명령어가 정상적으로 수행되는 것을 확인하였습니다.
6) 취약전 진단 결과 서버단에서 실행되는 파일(jsp, php, asp등)이 업로드가 된다는 점과 응답값 내 업로드 파일 경로가 노출된다는 문제가 발견되었습니다. 먼저 파일 경로가응답값 내 노출되지 않도록 해당 코드를 삭제하였습니다.
7) 소스코드 수정 시 응답값 내 경로와 파일명이 출력되지 않는 것을 확인하였습니다.
8) 이번에는 화이트리스트를 사용하여 사용 가능한 확장자를 지정하고(jpg, jpeg, png, gif, txt, pdf, xls, hwp) 그 외 모든 확장자는 사용하지 못하도록 코드를 수정하겠습니다.
9) 먼저 게시글 작성 페이지 아래에 "※ jpg, jpeg, png, gif, txt, pdf, xls, hwp 이외의 확장자는 업로드가 불가능합니다"라는 메시지가 출력되게 한후 파일 선택 시 해당 파일의 확장자만 추가되도록 코드를 추가하였습니다. (해당 소스코드는 확장자 검증 로직이 아닌 사용자의 편의성을 위한 코드입니다)
10) 클라이언트단에 파일 업로드 시 업로드 되는 파일의 확장자를 검증하는 로직을 추가하였습니다.
11) 소스코드 수정 후 게시글 작성 시 아래에 허용되는 확장자에 대한 언급과 파일 선택 시 사용자 지정 파일만 선택되어 있는 것을 확인하였습니다. webshell.jsp 파일 선택 후 게시글을 저장합니다.
12) 게시글 저장 시 '해당 확장자는 업로드가 불가능합니다.' 메시지가 출력되며 업로드가 불가능함을 확인하였습니다. 그렇다면 해당 검증 로직을 우회해 보도록 하겠습니다.
13) 게시판 메뉴 내 글쓰기 버튼 클릭 시 프록시 도구를 통하여 응답값을 확인하였습니다. 응답값 내 <script> 태그로 이루어진 검증 로직이 존재함을 확인할 수 있는데 해당 검증로직을 제거하였습니다.
14) 검증로직을 제거 후 webshell.jsp파일을 업로드 후 게시글 작성을 시도하였습니다.
15) 게시글이 정상적으로 작성되었으며 작성된 게시글 확인시 jsp 파일이 정상적으로 업로드됨을 확인할 수 있습니다. 이처럼 검증로직을 클라이언트단에 구성하는 것은 보안적으로 취약하기 때문에 서버단에 검증로직을 구현하도록 하겠습니다.
16) 서버단 소스코드 내 해당 확장자를 제외한 다른 파일 업로드 시 업로드되지 않도록 수정하였습니다.
17) 소스코드 수정 후 게시글 작성 시 '해당 확장자는 업로드가 불가능합니다.' 메시지가 출력되며 업로드가 불가함을 확인하였습니다.