웹 진단/게시판 실습

[게시판 실습] - 파일 업로드 (1) 웹쉘 파일 업로드 확인

보안개구리 2024. 6. 16. 18:45

[설 명]

 파일 업로드 기능을 이용하여 시스템 명령어를 실행하는 웹 프로그램을 업로드할 수 있는 취약점으로, 해당 취약점이 존재할 경우 공격자는 조작된 *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) 소스코드 수정 후 게시글 작성 시 '해당 확장자는 업로드가 불가능합니다.' 메시지가 출력되며 업로드가 불가함을 확인하였습니다.

파일 업로드 실패