- 공격자는 서버 사이드 스크립트(ASP, JSP, PHP 등)을 이용하여 웹쉘(WebShell)을 제작 및 업로드
웹쉘(Web Shell) 1. 웹페이지를 뜻하는 "웹(Web)"과 서버에게 명령을 내려 실행하기 위한 인터페이스 역할을 하는 "쉘(Shell)"의 합성어 2. 원격에서 웹서버에 명령어를 실행하기 위하여 만들어진 프로그램 3. 서버 사이드 스크립트(ASP, JSP, PHP 등)를 이용해 제작 4. 취약점을 이용해 웹 서버에 웹쉘 업로드 후 서버상의 정보 유출 및 변조, 악성코드 유포 등의 행위를 수행
- 업로드 파일에 대한 검증이나 환경 설정의 미흡으로 인해 발생할 수 있음
- 해당 공격을 성공하기 위한 조건은 3가지가 있음
공격 성공 조건 1. 파일 업로드가 가능해야 함 2. 파일이 업로드된 디렉터리의 경로를 알아야 함 3. 파일이 업로드된 디렉터리의 실행 권한이 있어야 함
2. 공격실습
2.1 웹쉘 제작
- [캡쳐 1]은 HTTP form에서 입력된 값을 GET 방식으로 전달 받으며, 값이 설정된 경우 쉘 명령어를 수행하는 웹쉘임
2.2 File Upload (Low Level)
- 파일 업로드 기능이 구현된 페이지에 웹쉘 업로드 시도
- 파일 업로드 결과 php 파일이 업로드 되었으며, 파일이 업로드 된 경로 또한 알 수 있음
- 파일 업로드 경로는 /dvwa/hackable/uploads/webshell.php임을 알 수 있음
1. 현재 디렉터리(/dvwa/vulnerabilities/upload) 2. 상위 디렉터리(../)로 2번 이동 후 /hackable/uploads/에 업로드
- 해당 경로로 접근 시 webshell.php 파일을 실행할 수 있으며, 임의의 명령을 수행할 수 있음
2.3 File Upload (Medium Level)
- 웹쉘(PHP) 업로드 시 JPEG나 PNG 파일만 업로드 가능하다는 에러 메시지를 출력함
- 업로드 파일의 type과 size를 검사하여 JPEG와 PNG 파일이 맞는지 확인하여 필터링을 수행
- Content-Type 헤더 변조를 통해 우회할 수 있음
Content-Type : 클라이언트가 서버에 자원을 보낼 때 어떤 유형의 자원을 보내는지 알려주는 헤더
- 버프슈트를 이용해 요청을 인터셉트하여 content-type 헤더를 [캡쳐 8]과 같이 변경
- 변경 후 업로드에 성공한 것을 확인할 수 있음
- 해당 경로에 접근하여 임의의 명령 수행이 가능함
2.4 File Upload (High Level)
- 파일 업로드 시 [캡쳐 5]와 같이 JPEG나 PNG 파일만 업로드 가능하다는 에러 메시지를 출력함
- 업로드 파일명에서 .를 기준으로 나누어 확장자명만을 추출하여, 확장자가 JPG, JPEG, PNG가 맞는지,업로드 파일 사이즈 검증 및 getimagesize함수를 통해 업로드된 파일이 이미지인지 필터링
getimagesize() : 지정된 이미지 파일의 크기를 확인해서 파일타입과 이미지의 크기에 대한 정보를 배열 형태로 출력
- content-type 변조를 통한 우회 방법은 확장자명이 php를 유지하기 때문에 해당 방법은 통하지 않음
- 확장자 검사를 우회하기 위해 확장자명을 .php.jpg로 변경 및 getimagesize() 우회를 위해 GIF89a 추가
GIF89a : GIF 이미지 파일 표준에 정의된 값으로 이미지 파일인 것처럼 속이는 것이 가능
- 버프슈트를 통해 파일명과 GIF89a를 추가하여 전송하면 파일 업로드에 성공함
- 업로드 후 해당 경로에 접근하면 웹쉘이 실행되지 않는데, 이는 업로드한 파일이 jpg 확장자를 가지기 때문임
- [캡쳐 12]에서 디렉터리 이동문자에 대한 필터링이 없으므로, ../를 추가하여 시도해 보았으나 실패함(추가적인 매개변수 등이 있는 것으로 판단됨)
2.5File Upload (Impossible Level)
- Impossible Level의 소스코드를 확인하면 필터링을 2번 수행하는 것을 확인할 수 있음
- 2번의 검증을 통해 php 파일인 웹쉘이 본연의 역할을 수행하지 못하게 됨.
1. 업로드한 파일 이미지인지 확장자, Type, getimagesize함수를 이용해 검증 2. 1차 검증을 통과한 파일의 내용으로 이미지 파일 재생성 - imagecreatefromjpeg() : 파일 또는 URL에서 새 이미지 만들기 - imagejpeg() : 브라우저 또는 파일에 이미지 출력