File Upload 취약점_webshell

1. File Upload 취약점 - 주로 게시판 등에서 파일 업로드 기능을 악용하여 시스템 권한을 획득 - 공격자는 서버 사이드 스크립트(ASP, JSP, PHP 등)을 이용하여 웹쉘(WebShell)을 제작 및 업로드 웹쉘(Web

ggonmerr.tistory.com

 

File Inclusion (DVWA실습)

1. File Inclusion - PHP로 구현된 웹 서버를 대상으로 PHP의 include 기능을 악용하는 방식 - PHP는 incude를 이용해 다른 PHP 파일을 현재 웹 페이지에 포함시킬 수(or 불러올 수) 있음 - 공격자는 악의적인 PH

ggonmerr.tistory.com

 

- File Upload 취약점_webshell 글 "2.4 File Upload (High Level)"에서 필터링 우회를 웹쉘 확장자에 jpg를 추가해 업로드

- 업로드한 웹쉘에 접근 시 jpg 확장자로 되어있어 웹쉘이 실행되지 않음

 

- File Inclusion 공격을 통해 웹쉘을 웹 페이지에 직접 삽입하여 File Upload (High Level) 필터링 우회가 가능함

- DVWA는 High Level로 설정되어 있기 때문에 File Inclusion의 High Level에 대한 우회도 필요함

 

[캡쳐 1] File Upload (High Level) 필터링 우회

- File Upload (High Level)에서 적용되는 필터링을 우회하기 위해 버프슈트를 통한 값 변경

- 확장자 검사를 우회하기 위해 확장자명을 .php.jpg로 변경 및 getimagesize() 우회를 위해 GIF89a 추가

 

- File Inclusion (High Level)에서 적용되는 필터링을 우회하기 위해 page 매개변수의 파라미터 변경

- 파라미터의 명이 file로 시작되도록 변경

 

- 현재 디렉터리의 위치를 모르기 때문에, 상위 디렉터리로 이동하기 위해 ../ 충분히 입력

 

- 최종 URL : hxxp://DVWA 주소/dvwa/vulnerabilities/fi/?page=file/../../../hackable/uploads/webshell.php.jpg

[캡쳐 2] File Upload (High Level) 우회

 

- 명령어 입력 후 Submit Query 시 ERROR 반환

[캡쳐 3] 에러 반환

 

- URL에 Query 파라미터로 명령을 입력해 전달 시 명령 수행 결과를 반환

[캡쳐 4] 공격 성공

 

- File Upload 공격과 File Inclusion 공격을 혼합해 File Upload High Level을 우회함

- 특정 기법만을 방어하기 보다는 다양한 방안을 고려해야 함

1. File Upload 취약점

- 주로 게시판 등에서 파일 업로드 기능을 악용하여 시스템 권한을 획득

- 공격자는 서버 사이드 스크립트(ASP, JSP, PHP 등)을 이용하여 웹쉘(WebShell)을 제작 및 업로드

웹쉘(Web Shell)
1. 웹페이지를 뜻하는 "웹(Web)"과 서버에게 명령을 내려 실행하기 위한 인터페이스 역할을 하는 "쉘(Shell)"의 합성어
2. 원격에서 웹서버에 명령어를 실행하기 위하여 만들어진 프로그램
3. 서버 사이드 스크립트(ASP, JSP, PHP 등)를 이용해 제작
4. 취약점을 이용해 웹 서버에 웹쉘 업로드 후 서버상의 정보 유출 및 변조, 악성코드 유포 등의 행위를 수행

- 업로드 파일에 대한 검증이나 환경 설정의 미흡으로 인해 발생할 수 있음

- 해당 공격을 성공하기 위한 조건은 3가지가 있음

공격 성공 조건
1. 파일 업로드가 가능해야 함
2. 파일이 업로드된 디렉터리의 경로를 알아야 함
3. 파일이 업로드된 디렉터리의 실행 권한이 있어야 함

2. 공격실습

2.1 웹쉘 제작

[캡쳐 1] webshell.php

- [캡쳐 1]은 HTTP form에서 입력된 값을 GET 방식으로 전달 받으며, 값이 설정된 경우 쉘 명령어를 수행하는 웹쉘임

 

2.2 File Upload (Low Level)

[캡쳐 2] DVWA

- 파일 업로드 기능이 구현된 페이지에 웹쉘 업로드 시도

[캡쳐 2] 웹쉘 업로드

- 파일 업로드 결과 php 파일이 업로드 되었으며, 파일이 업로드 된 경로 또한 알 수 있음 

- 파일 업로드 경로는 /dvwa/hackable/uploads/webshell.php임을 알 수 있음

1. 현재 디렉터리(/dvwa/vulnerabilities/upload)
2. 상위 디렉터리(../)로 2번 이동 후 /hackable/uploads/에 업로드

[캡쳐 3] 경로 접근

- 해당 경로로 접근 시 webshell.php 파일을 실행할 수 있으며, 임의의 명령을 수행할 수 있음

[캡쳐 4] 명령 수행

2.3 File Upload (Medium Level)

[캡쳐 5] 업로드 실패

- 웹쉘(PHP) 업로드 시 JPEG나 PNG 파일만 업로드 가능하다는 에러 메시지를 출력함

[캡쳐 6] 필터링

- 업로드 파일의 type과 size를 검사하여 JPEG와 PNG 파일이 맞는지 확인하여 필터링을 수행

- Content-Type 헤더 변조를 통해 우회할 수 있음

Content-Type : 클라이언트가 서버에 자원을 보낼 때 어떤 유형의 자원을 보내는지 알려주는 헤더 

[캡쳐 7] content-type 변경 전

- 버프슈트를 이용해 요청을 인터셉트하여 content-type 헤더를 [캡쳐 8]과 같이 변경

[캡쳐 9] content-type 변경 후

- 변경 후 업로드에 성공한 것을 확인할 수 있음

[캡쳐 10] 업로드 성공

- 해당 경로에 접근하여 임의의 명령 수행이 가능함

[캡쳐 11] 명령 수행

 

2.4 File Upload (High Level)

- 파일 업로드 시 [캡쳐 5]와 같이 JPEG나 PNG 파일만 업로드 가능하다는 에러 메시지를 출력함

[캡쳐 12] 필터링

- 업로드 파일명에서 .를 기준으로 나누어 확장자명만을 추출하여, 확장자가 JPG, JPEG, PNG가 맞는지, 업로드 파일 사이즈 검증getimagesize함수를 통해 업로드된 파일이 이미지인지 필터링

getimagesize() : 지정된 이미지 파일의 크기를 확인해서 파일타입과 이미지의 크기에 대한 정보를 배열 형태로 출력

- content-type 변조를 통한 우회 방법은 확장자명이 php를 유지하기 때문에 해당 방법은 통하지 않음

- 확장자 검사를 우회하기 위해 확장자명을 .php.jpg로 변경getimagesize() 우회를 위해 GIF89a 추가

GIF89a : GIF 이미지 파일 표준에 정의된 값으로 이미지 파일인 것처럼 속이는 것이 가능

[캡쳐 13] 정보 변경

- 버프슈트를 통해 파일명과 GIF89a를 추가하여 전송하면 파일 업로드에 성공함

[캡쳐 14] 업로드 성공

- 업로드 후 해당 경로에 접근하면 웹쉘이 실행되지 않는데, 이는 업로드한 파일이 jpg 확장자를 가지기 때문

- [캡쳐 12]에서 디렉터리 이동문자에 대한 필터링이 없으므로, ../를 추가하여 시도해 보았으나 실패함(추가적인 매개변수 등이 있는 것으로 판단됨)

[캡쳐 15] 웹쉘 접근 실패

2.5 File Upload (Impossible Level)

[캡쳐 16] 소스 코드

- Impossible Level의 소스코드를 확인하면 필터링을 2번 수행하는 것을 확인할 수 있음

- 2번의 검증을 통해 php 파일인 웹쉘이 본연의 역할을 수행하지 못하게 됨.

1. 업로드한 파일 이미지인지 확장자, Type, getimagesize함수를 이용해 검증
2. 1차 검증을 통과한 파일의 내용으로 이미지 파일 재생성
- imagecreatefromjpeg() : 파일 또는 URL에서 새 이미지 만들기
- imagejpeg() : 브라우저 또는 파일에 이미지 출력

 

추가 대응 방안

1. 업로드 파일의 이름을 랜덤하게 변경하여 공격자가 변경된 파일명을 알지못하게 한다

2. 업로드 디렉터리의 실행권한을 제거한다

3. 업로드 파일에 대한 필터링을 강화한다(시큐어 코딩 적용)

+ Recent posts