아임노드

실무 환경에서의 주요 취약점_File Upload 본문

[SK shieldus Rookies 23기] 공부 노트/취약점 진단 도구 및 활용법

실무 환경에서의 주요 취약점_File Upload

Noody 2024. 12. 16.

 

File Upload

크게 두 가지 방법으로 진행

- 게시판을 통해 악성파일(웹셸)이 업로드 되는 형태

- Method를 통해 업로드 (PUT)

 

악성파일 기준

- 악성파일 업로드까지만 (실행안됨) 취약하지 않음(민간기준) > 실행되면 무조건 취약

- 악성파일 업로드만 되도 취약(공공기준)

- 악성파일 : asp, jsp, php, html, sh, exe, py, go, svg 등 프로그래밍 언어 확장자

 

업로드 취약점에 따른 운영체제

- 진단하는 웹서버의 운영체제 식별에 따라 점검 시간 단축

- ex) 윈도우 서버인데, 내용은 웹셸, 파일 확장자는 jpg로 올리면 실행안됨(시간낭비)

- 운영체제 식별 : ping IP 해보면 됨(보통 유닉스 계열은 ping 허용)

- 유닉스 계열은 확장자 기반이 아닌 권한 기반으로 동작(+x만 있으면 실행된다.)

- 윈도우 계열은 확장자 기반으로 동작

 

진단 단계

- 운영체제 식별

- 운영체제에 따른 파일 업로드 선택

 ㄴ 윈도우 : 확장자 변경 불가 -> 확장자 막혀 있으면 우회 불가

 ㄴ 유닉스 : 확장자 변경 가능 -> 실행 가능한지 확인(권한 체크)

- 유닉스 계열일 경우 아래와 같은 우회 방법 사용

 ㄴ 확장자 변경 : jsp->jpg로 변경하여 업로드(실행체크)

 ㄴ Content Type 변경 > Body 구조에 ContentType(MIME Type)이 나옴(File Upload시)

 ㄴ 파일 Header를 추가 (파일은 16진수로 확인 가능, 파일 16진수로 볼때, 보통 8바이트 이내를 Header라고 부름)

     보통, 확장자를 가지는 파일은 모두 Header구조를 가짐

     * txt는 header 구조가 없음

 

>> 악성파일 실행 조건 : 1) 업로드 경로(폴더)의 실행권한 필요

                                     2) 업로드 된 파일의 경로 노출

      ㄴ 둘 중 하나만 안되도 실행이 안됨


 

1. 운영체제 식별

> 대상 주소

[nslookup + 도메인 주소]

 

> 운영체제 확인

ping 날려보가 [ping + ip]

반환되지 않음

ping 반환시 유닉스

ping 반환되지 않으면 윈도우 서버

물론 방화벽이나 보안장비에 의해 차단되는 걸 수도 있음!

 

* ping이 되었을 때 ttl 값을 가지고 식별도 가능

ttl값 128 -> 윈도우 계열

        64  -> 유닉스 계열

 

이렇듯 ping을 막는 이유는 운영체제에 대한 정보를 주지 않기 위해서 막기도 한다.

 


 

1. 운영체제에 따른 실행권한 (유닉스의 경우)

> 임의의 파일 하나 만들기

내용은 echo 'test'

 

입력 잘 됬는지 cat으로 확인

 

> 파일 권한 확인

x라는 문자가 없으므로 실행권한이 빠져있다.

 

> chmod로 실행권한 주기

권한 설정 및 확인

 

 

2. 확장자 변경하고 실행되는지 확인

실행 가능

 


 

* 윈도우의 경우에는 확장자를 변경하면 실행이 안됨

(확장자 기반으로 움직이기 때문)

따라서 윈도우 시스템이라면 판명이 되면,

 

뒤에 널문자를 넣었을 때 실행이 되는지

 

또는 이중확장자로 했을 때 인식이 되는지

 

테스트 해보면 된다.

 

=> file upload의 경우 유닉스보다 윈도우가 훨씬 보안성이 높다.


본격 실습

1. dvwa에서 실습

file upload(low) 탭

 

 

2. 명령어 입력

cp /usr/share/webshells/php/php-reverse-shell.php ./php.php

 

 

3. 사용하고 있는 칼리 ip 확인

 

4. 방금 cp로 복사한 php 파일 오픈

 

> 오픈된 파일에 해당 ip 부분을 자신의 칼리 ip로 변경

변경 전
변경 후

 

-- 여기까지 웹셸(악성파일) 준비 완료

* 우리가 사용할 ReverseShell : 타겟 시스템 >> 공격자(진단원) 시스템으로 셸 연결(아웃바운드 형태)

 ㄴ 악성파일이 업로드 되면 칼리로 셸 연결 가능


5. 다시 dvwa로 돌아와서..

 

> Browse...버튼 클릭

> Desktop에 있는 php.php 클릭 > 오픈

> Upload 버튼 클릭

> 경로 노출 확인 (악성 파일 실행 조건 2_충족)

> 주소 복사

> 홈페이지 주소 복사 (http:// 반드시 붙여주기)

 

> 실행권한 확인(악성 파일 실행 조건 1_충족)

실행 권한이 있기 때문에 Connection refused가 뜬 것!

(보통 실행이 안되면 빈 화면만 뜬다)

 

6. 터미널로 들어오기

>

 

> 포트 1234 연 상태에서 주소 다시 enter 접속

셸 연결 확인

 

> bash 셸이라 명령어 입력 가능

웹 서버 설치 경로 확인 (cd /var/www/html)

 

> 실질적으로 웹 서버가 설치된 곳이 이곳(vulnerabilities) 이므로 이곳으로 이동해 ls 확인

 

> 리스트 중 upload 폴더 확인

> cd upload

> ls

> source 코드 파일 확인

 

 

> dvwa 디렉토리도 확인해보자

우리가 올린 php.php 파일이 어딘가에 있을듯!

 

=> 이렇게 도커 시스템 내부에 들어왔기 때문에 여러가지 것들을 확인할 수 있다.

 


dvwa

medium 레벨도 확인!

(burpsuite content type 변경)

 

high 레벨 ( 모두 안됨 )

(여러가지 조합_

+header 추가_GIF89a or png

--> 헤더를 더 길게도 해보기 GIF89aGIF89aGIF89aGIF89a

+content type 변경

+확장자에 널문자 추가(&00) or 이중확장자(;php))

 

*php 확장자의 경우 숫자를 붙여 사용 가능

ex) test.php1~7와 같이 사용 가능

--> 따라서 다시 filename="php.php7" 이외 숫자도 테스트

 

=> 소스코드를 보면 jpg,jpeg,png 확장자가 아니면 안되게끔 해놨음

 

따라서 터미널에서 mv php.php php.jpg로 변경

그 상태에서 burp에서 filename을 php.php로 변경해보면 업로드가 될 가능성이 있음

(이렇게 해도 업로드 안되긴 함)