본문 바로가기

개념정리

14주차 SERVER SIDE SCRIPT / FILE UPLOAD / WEBSHELL / 파일 검증 우회


14주차 SERVER SIDE SCRIPT / FILE UPLOAD / WEBSHELL / 파일 검증 우회

 


 

 

FILE UPLOAD 취약점

- 공격자가 원하는 임의의 파일을 업로드 하는 것 -> 업로드 했을때 문제가 발생하는 파일 업로드

- 발생원인 -> 파일업로드시 검증 검사 누락

- 발생위치 -> 파일 업로드 할 수 있는 곳 (버프스윗으로 확인)


FILE UPLOAD 공격 종류

- 서버측 실행 파일 업로드

- PHISING -> HTML FILE

- DEFACE

- XSS

- DOS


서버측 실행파일 업로드 

- DDOS 공격 , 웹쉘, 악성코드 업로드, 백도어, 악성 프로그램 설치 파일 

- 서버에서 실행되는 언어를 업로드 한다

- 공격서버에 대한 언어와 구성정보를 같게 해서 올려야 서버가 해석하니까 서버가 사용하는 코드를 사용해야한다.

- PHP/ASP/JSP/PYTHON/NODEJS 링크확인한다

EX)

-> php등 서버에서 실행되는 코드를 업로드하고 요청한다

-> 서버는 코드를 실행하고 전달한다. 따라서 코드가 웹서버에서 실행하고 결과값을 클라이언트에게 전달한다.

-> 즉 서버측 실행파일을 업로드 할 수 있다. 

-> 서버에서 우리가 원하는 코드 및 명령을 내릴 수 있다. 서버 장악!


PHISING

- HTML 파일 업로드

-> 도메인에서 내가만든 LOGIN.PHP 파일 만들기


DEFACE 

- 임의 파일 OVERWRITE

- INDEX 파일 업로드, 기존 파일 변조

-> 메인페이지를 다른 파일로 덮어 쓴다


XSS

- Stored XSS

-> 스크립트 전송


DoS

- 대용량 파일 다량으로 업로드

-> 서버용량 과부하

 


WEB SHELL

- 서버에 임의의 명령을 내릴 수 있는 서버측 실행파일

- SERVER SIDE SCRIPT


SERVER SIDE SCRIPT

- 백엔드

- 서버실행 코드 -> 웹쉘


CLENT SIDE SCRIPT

- 프론트엔드

- 웹브라우저 실행 코드 -> XSS, CSRF 

 

 


WEB SHELL - FILE UPLOAD

- 웹쉘로 파일 업로드 

- 서버에서 실행할 수 있는 파일 업로드 가능해야 한다

- 업로드된 파일의 경로를 확인해야 한다.

EX)

<?php
echo system($GET['cmd']);
?>

-> CMD 창을 사용 할 수 있는 코드 업로드 - GET에서 cmd라는 함수를 받아 시스텝에서 실행하는 것  

-> 업로드한 파일 링크 주소복사 - 업로드 된 파일 경로 확인

-> 업로드된 파일 경로 요청 http://도메인/웹쉘파일경로/웹쉘명

-> 프록시 REQUEST의 링크값?cmd=명령어 입력

-> RESPONSE로 명령어 실행값 출력

 

* 컨설턴트에 따라 보안 필요 유무가 정해질 수 있다. 

* 루트 권한이 아닌 노바디 권한으로 실행하라고 서버에 요청 할 수 있다

* WINDOWS나 MICROSOFT 서버는 관리자 권한으로 실행하는 경우가 있어서 이게 취약점이기도 한다.

 

 


WEB SHELL - FILE UPLOAD 시나리오

1. 파일 업로드 기능 위치 확인

2. 파일 업로드 확인

3. 파일 출력확인 웹서버 경로 확인

4. 한줄 웹쉘 업로드

5. 웹쉘 업로드 확인

6. 업로드 경로 접속

+ 업로드 파일 다운(경로 확인용) / SQL INJECTION / HTML 소스코드 내 주석 확인

+ jsp면 java코드를 컴파일해서 클래스 파일을 올리기도 한다

 


FILE UPLOAD 보안

- MIME 검증

- 실행권한 설정 

-  블랙리스트 필터링 

- 화이트 리스트 필터링 

- 파일이름 난독화 

- DB내의 FILE ID 로 관리 

- DB내 파일저장(BLOB/CLOB) -> 원천 실행 방지

- NAS(파일저장 서버를 따로 생성) -> 원천 실행 방지


 

MIME (MULTIPURPOSE INTERNET MAIL EXTENSIONS)

- 웹 HTTP를 통헤 데이터를 전달할때의 데이터 타입

- 바이너리데이터 송수신시 바이너리를 텍스트로 변환하기위한 인코딩.

- 즉, 업로드 되는 파일을 검사하여 파일형식으로 인코딩해서 보내는것있다.

- PROXY REQUEST - Content-Type에 인코딩 종류가 나오고 형식지정을 해논것이다. 형식이 다르면 업로드 불가

- 서버측 코드에서 $uploaded_type = $_FILES['uploaded']['name']; if ($uploaded_type == "image/jpeg") 식으로 체크


실행 권한 설정

- 파일이 저장되는 위치,디렉토리에서 실행하지 못하게 한다.

- 파일이 업로드 되는 디렉토리에 실행권한을 제거하는 것

-> 파일이 업로드 되는 디렉터리에 그대로 저장

-> 실행 안됨

 


 

블랙리스트 필터링

- 서버실행 코드 확장자 필터링


화이트 리스트 필터링

- 서버에서 실행되는 코드만 허용


파일이름 난독화 

- 경로 찾기어렵게 만들기 


DB내의 FILE ID 로 관리 

- DB내의 파일 아이디를 만들어 이를 통해 코드를 실행

- 경로 찾기 어렵게 만들기


DB내 파일저장

- BLOB/CLOB

- 원천 실행 방지


NAS

- 파일저장 서버를 따로 생성

- 원천 실행 방지


 

FILE UPLOAD 취약점 보안 우회

- MIME -> Content-Type 변조

- 실행권한설정 -> 디렉토리 트레버져

- 블랙리스트 필터링 우회 -> 다른확장자, 이중확장자, HTACCESS , NULL BYTE , FILE SIGNATURE,

 


 

Content-Type 변조

 

 

 

 

-> text/php에서 

-> image/jpeg등 으로

 

 


 

디렉토리 트레버져

- 가장 많이 사용하는 우회 방법

- 파일이 저장되는 위치의 다른곳에 파일을 저장한다

- 즉, 파일 업로드 경로 조작

- ../ 사용

-> Content-Disposition: 에서 "../웹쉘 파일 명"

-> Content-Disposition: 에서 ../ 특수문자 인코딩

-> 실행 확인

 


다른확장자

 

 

 - PhP pHp pHP


 

이중 확장자

- .jpg.php -> php파일이되어 서버에서 실행 가능  (마지막이 서버실행코드로 끝나야 한다.)

- .php.jpg -> jpg확장자는 서버에서 실행 불가

                    근데 이렇게 올려서 가능한 부분도있는데 

                    webshell.jpg.php 웹애플리케이션을 개발 할 때 파일업로드 저장기능 구현할때

                    첫.뒤의 jpg만 확인해서 실제 저장될때 webshell.jpg.php로 저장

 


.htaccess 바꾸기

- 특정 확장자를 실행하는 규칙이 담긴 서버측 코드이다.

- 이를 덮어쓴다

- .임의의확장자명 이라는 확장자 명 파일을 실행 시킬 수 있다.

1. AddType application/x-httpd-php .normaltic 파일을 업로드하여 규칙을바꾼다

2. 지정한 확장자명의 php파일 업로드

3. 지정한 확장자명의 php 파일 실행 

 

 

 

 1. AddType application/x-httpd-php .normaltic 파일을 업로드하여 규칙을바꾼다

AddType application/x-httpd-php .normaltic


2. 지정한 확장자명의 php파일 업로드

<?php echo system($_GET['cmd']); ?>

 

 

3. 지정한 확장자명의 php 파일 실행 

 

 

+ 확장자 속이기 

normaltic.pdf.exe 에서 exe숨김처리해서

normaltic.pdf로 보이게 함

 

+  web page . 파라미터의 값에따라서 다른 페이지를 보여줄거야

    ?lang=ko.php 일때

<?php
include($_GET['lang']);
?>

 

NULL BYTE INJECTION

- 삽입 값이 없을 때 리눅스에서 명령어가 분리되는 것을 이용 마지막만 허용되는 확장자로 입력

- .asp;.jpg / .asp%00.jpg


 

COMMON FILE SIGNATURE

- 이미지파일 jepg, png 등등에서 시그니처 값을 맨 앞에 hex값으로 적어놈

- 정상적인 이미지에 hex editor를 사용하여 맨위에 php 코드를 삽입한 후 확장자명을 .php로 변경하면 된다.

- 파일 시그니처가 정상임을 이용

 


컨설턴트 판단기준

- 서버측 코드 업로드,실행O -> 취약

- 서버측 코드 업로드,저장위치 모름 -> 권고! 경고!

- 서버측 코드 업로드/실행X -> 양호

- 대용량 파일 업로드 -> 권고! 경고! (DoS 공격 가능)

- 허용되지 않은 파일 확장자 업로드 -> 권고! 경고


 

파일업로드 모의해킹 시 주의점

* 웹쉘을 올리면 안된다.  

- 업로드한 파일을 실행 할 수 있는 지 체크만 하면 된다

- 즉 POC 사용 

  echo "hello"만 하면 된다. 

  이런식으로 증명하고 전달후 필요할 경우 담당자에세허락 맡는다.

  그다음에 웹쉘을 꼭꼭 삭제