본문 바로가기

해킹/Web Hacking

[10주차] 해킹 스터디 정리 - File Upload 공격

** 모의해킹

워라벨

 

-> 정보보안팀

 

모의해킹 팀.

보안컨설팅.

 

IT

 


-- File Upload

 

What : 공격자가 임의의 파일을 업로드 할 수 있는 공격

 

-> 웹 쉘.

-> 서버 장악.

 

웹 쉘이라는 건 사실 한 줄로도 만들 수 있음

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

 

 

** Point **

1. 우리가 웹 서버에서 실행할 수 있는 파일

2. 그걸 실행할 수 있어야함. (가장 중요)

-> 업로드된 파일의 위치를 알아야 함.

 

만약 mal.php 라는 파일이 있다면?

 

웹 브라우저로 우리가 올린 파일을 요청하면 됨.

그럼 was에서 php 파일을 실행하고 우리(요청자)에게 전해주게 됨

 

웹 쉘을 띄웠을 때 가장 먼저 대부분 어떤 일을 할까?

대부분 소스코드를 탈취함

 

** 소스코드 탈취.

-> DB를 탈취 한다는 말과 동일

> 왜냐면 DB의 계정 정보는 반드시 소스코드 내부에 들어가있을 수 밖에 없기 때문

 

** Reverse Shell

(실제 공격할 때 많이 사용 / 실습 때는 안했음)

 

Inbound 정책은 뚫기 어렵지만, Outbound 정책은 막기 힘듬

특히 443번 포트는 HTTP 포트이기 때문에 거의 항상 열려있음

(nc - nvlp 443 을 하면 reverse shell 연결이 될 때가 많음)

 

파일의 위치를 알아내는 법

> 내가 올린 파일을 직접 다운로드 받아보는 것

(서류 제출, 이미지 첨부, 게시판 등등등)

 

다운로드를 못할 때 쓰는 방법

1. SQL Injection을 시도해서 게시판 table의 file 컬럼 확인

 

2. HTML 소스코드 주석 살펴보기

 

GitHub에 Reverse cheat sheet 라는 게 있음

또는 구글링으로 php reverse shell

 


* Bypass Trick

-- Content-type

> 컨텐트 타입이라는 건 파일의 인코딩 방식을 알려주는 것임

 

확장자가 아니라 클라이언트가 보내는 요청의 정보 안에

Content-type이라는 부분이 있음

 

만약 jpeg image파일을 업로드하면 Content-type에 image/jpeg라고 적힌다.

php 파일을 올리면 text/php라고 적힌다.

이 부분을 변조한다고 해서 우리한텐 아무런 일도 일어나지 않기 때문에 

(순전히 서버에게 어떤 파일인지를 알려주는 용도)

Burp Suite의 intercept를 켜서 바꿔 보내면 됨

 

-- 업로드 되는 디렉토리 실행

어떤 환경에서는 아무리 업로드를 해도 파일이 실행되지 않고

내가 적은 코드 텍스트 그대로를 문자열처럼 출력하는 환경일 수가 있다.

이럴 때 만약 webshell.php라는 파일을 올린다면 filename="../webshell.php"로

올리는 것이다. 그럼 상위 디렉토리에 저장되는 것이다.

../를 필터링 하고 있을 수도 있음

그럼 / 를 %2f라는 걸로 인코딩 시켜서 ..%2fwebshell.php로 업로드할 수 있음

 

-- 블랙리스트 기반 필터링 우회

php 파일이라고 해서 php 확장자만 실행하는 게 아님

php3, php5 같은 확장자도 존재

jsp 같은 경우도

jsp, jspx 같은 것들이 있다.

 

결국 필터링 하는 그 단어만 안 쓰면 됨

 

-- 확장자 우회

우리가 올리려는 파일의 맨 뒷부분만 보는 거임

test.png.php

 

test.php%00.png

(여기서 %00은 null data임)

 

test.php.png -> 이건 실행이 안 됨(인터넷에 잘못 나와있음)

끝이 무조건 php라고 끝나야 컴퓨터에서 php라고 인식하고 실행함

test.php.png 가 실행되게 하려면 설정 파일을 건드는 것임

 

AddType application/x-httpd-php .bokyu

이라고 하는 것이다. 이건 bokyu라는 확장자도 php로 실행하세요 라는 의미

애초에 이렇게 하면 test.png 라고 해도 실행됨 test.php.png는 의미없음

 

-- File 시그니쳐

> 이미지 파일.

> 맨 뒤에 웹쉘 코드 넣으면 됨

이미지파일 아무거나 하나 가져와서 그 뒤에 그대로 웹쉘 복붙

(jpeg 파일의 시그니쳐에 한 줄 웹쉘을 그대로 넣고 Burp Suite으로 전송)

 

 

-------------------------------------

 

- PUT Method

 

대부분 GET과 POST만 쓰고 있지만 사실 HTTP 에는 PUT이라는 통신 방식도 존재

그래서 PUT webDAV이 켜져있다면 PUT으로도 파일을 업로드할 수 있음

 

그런데 PUT 은 조심해야 함

메인 페이지 전체가 날라갈 수도 있음


** 모의해킹 시 주의해야할 점.

 

XSS 시에, 제목 <script>console.log();</script>

자주 이용하기

alert 보다는 console.log가 매너있게 xss를 테스트할 수 있음

 

게시판 글 쓸때, 수정기능 이용하기

 

반드시 Repeater를 이용해서 스크립트를 삽입하기

 

** 파일 업로드

(1) 실제 웹 쉘 x (다른 해커가 사용할 수도 있기 때문에)

 

<?php 

    echo "Script Run";

    or 날짜 출력.

?>

 

(2) 업로드 테스트 파일 내역.

- upload/test.html

- upload/test.php

 

**** WebShell 직접 만들기.

 

<?php ?>