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 Inclusion

- PHP로 구현된 웹 서버를 대상으로 PHP의 include 기능을 악용하는 방식

- PHP는 incude를 이용해 다른 PHP 파일을 현재 웹 페이지에 포함시킬 수(or 불러올 수) 있음

- 공격자는 악의적인 PHP 파일을 생성해 대상 웹 페이지에 include의 파라미터로 전송해 악성 파일을 실행시키거나, 시스템의 로컬 파일에 접근한다.

- 시스템의 로컬 파일에 접근하는 LFI(Local File Inclusion) 방식과, 외부 파일을 불러오는 RFI(Remote File Inclusion) 방식이 존재

 

2. DVWA 실습 - Low Level

2.1 RFI 방식

[캡쳐 1] 최초 페이지

- file1.php, file2.php, file3.php에 접속 시 page 매개변수의 인자값만 변경됨

[캡쳐 2] 악성 PHP 파일 생성

- 웹에서 접근이 가능하도록 /var/www/html에 악성 PHP 파일 생성

[캡쳐 3] /etc/passwd 파일 노출

- 취약한 웹 페이지에서 page 매개변수로 악성 PHP 파일 경로를 전달하면, 해당 PHP이 삽입되어 실행됨

 

2.2 LFI

[캡쳐 4] /etc/passwd 파일 노출

- 로컬 시스템의 파일에 접근 및 파일 내용 노출

 

3. DVWA 실습 - Medium

[캡쳐 5] RFI 공격 실패

- 취약한 웹 페이지에서 RFI를 시도해 보았을 때 공격에 실패한 것을 확인

[캡쳐 6] 입력값 필터링

- page 매개변수로 전달 받은 값에서 http://, https://(File Inclusion 대응), ../, ..\(Directory Traversal 대응)를 공백으로 치환을 수행

[캡쳐 7] 필터링 우회

- http:// 사이에 http://를 입력(hthttp://tp://) 시 필터링에 의해 http://가 공백으로 치환되어 최종적으로 http://가 완성됨.

 

4. DVWA 실습 - High Level

[캡쳐 8] RFI 공격 실패

- page 매개변수를 통해 RFI를 시도하면 ERROR가 출력되며, 필터링을 우회하기 위해 hthttp://tp://를 전달하여도 ERROR가 출력됨.

[캡쳐 9] 입력값 필터링

- 파라미터의 명이 file로 시작하지 않거나, include.php가 아니면 에러를 반환하도록 필터링이 적용됨.

[캡쳐 9] 필터링 우회

- 파라미터를 file로 시작하고, ../를 충분히 입력해 root 디렉터리로 이동 후 /etc/passwd에 접근 시 파일 내용을 확인할 수 있음

- [캡쳐 9]에 적용된 필터링으로는 Directory Traversal 공격에 대응하지 못함.

 

5. DVWA 실습 - Impossible Level

[캡쳐 10] RFI 공격 실패

- 앞서 확인한 필터링을 우회하기 위한 다양한 방법을 시도해 보았지만 ERROR를 출력함

[캡쳐 11] 입력값 필터링

- 소스코드를 확인해 보면 꼭 필요한 파일만 include 될 수 있도록 파일을 지정

 

6. 대응방안

6.1 RFI

1. 원격지 파일을 열지 못하도록 php.ini(php 환경설정 파일) 수정

- allow_url_fopen = OFF
- allow_url_include = OFF

 

6.2 공통

1. 입력값에 대한 필터링을 강화한다(시큐어 코딩 적용)

- hthttp://tp://, ../ 등 필터링을 우회하지 못하도록 필터링 적용

- 중요정보가 저장된 디렉터리나 파일(ex. /etc/passwd, /etc/shadow 등)에 대한 필터링

 

2. include 관련한 에러를 출력하지 않도록 php.ini 수정

- display_errors = OFF

 

3. 파일 존재 유무를 확인하는 코드 삽입

function check_validation($filename){
if (file_exists("$DOCUMENT_ROOT/common/$filename){
echo $filename;
}
else{
echo "접근경로가 올바르지 않습니다.";
exit;
}

 

4.  정기적 로그 분석 진행

 

5. 공격 IP를 탐지 및 차단할 수 있도록 Snort 정책 등 규칙 적용

+ Recent posts