본문 바로가기

웹 해킹

웹 해킹 공부 일기장 10 - 1 (File Upload 취약점)

이번 시간에 공부해볼 취약점은 파일 업로드 취약점입니다.

 

이 취약점은 이름에서 알 수 있듯 공격자가 원하는 임의의 파일을 서버에 업로드하는 공격입니다.

발생 원인을 알아보면 임의의 파일을 업로드 하는 것이기 때문에 파일 업로드 시 제대로된 검증이 이루어지지 않을 경우 발생하게 됩니다.

발생 위치 또한, 파일을 업로드 할 수 있는 곳입니다.

 

그럼 만약에 어떤 파일이든 업로드할 수 있다면 어떤 일이 일어날까요??

1. 서버측 실행 파일을 업로드하여 파일을 실행시킨다.

2. HTML 파일을 업로드하여 서버의 도메인을 가지는 파일이 생성되어 피싱유도를 한다.

3. Deface 공격. 이는 index파일을 변경시키는 공격으로 메인페이지를 변경시킵니다. (자신이 공격을 성공함을 알림)

4. XSS 공격. XSS 취약점을 삽입한 파일을 업로드시켜 해당 페이지에 접속한 이용자들을 대상으로 스크립트를 실행시킵니다.

5. DoS 공격. 계속하여 파일을 업로드하여 서버의 저장공간 자원을 소모시켜 서비스를 이용하지 못하게 합니다.

 

이러한 공격들을 할 수 있는데 서버측 실행 파일을 업로드하면 원하는 악성코드를 실행시키며 서버를 장악할 수 있기때문에 보통 서버측 실행 파일 업로드를 많이합니다. 그렇기 때문에 1번에 대해 자세히 알아보겠습니다.

 

일단, 우리가 웹 서버 개발을 php로 했기 때문에 php를 예시로 설명하겠습니다.

만약 업로드시 우리가 임의의 test.php를 만들어서 업로드를 합니다.

<?php
    매우 질나쁜 코드
    실행하면 아주 위험한 코드
    ...
    ...
?>

 

웹 개발에서 설명했듯이 php는 서버측 코드이기 때문에 WAS에서 처리한다고 했습니다. 그렇기 때문에 해당 코드를 실행하게 됩니다.

 

그래서 우리는 서버측에서 실행할 수 있는 파일 Web Shell을 업로드하면 서버측에 명령을 내릴 수 있는 파일을 업로드합니다.

진짜 간단하게 만들 수 있습니다.

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

 

system은 매개변수로 명령어를 넣어주면 해당 명령어를 실행해주고 결과값을 반환해주는 php 함수입니다. 

이것을 통해 cmd에 원하는 명령어를 넣어서 해당 파일을 요청을 하면 서버측에서 php 코드들을 처리하면서 system 함수를 실행하여 원하는 명령어를 서버에서 실행시킬 수 있습니다.

 

여기서 중요한 점은 파일을 만든 언어가 서버에서 처리할 수 있는 언어여야 합니다. php로 만들어진 웹 서버는 php파일, jsp는 jsp 파일, asp는 asp파일을 업로드하여야 합니다. 안 그러면 서버에서 해당 파일을 실행하지 못하기 때문에 업로드해도 실행시킬 수 없습니다.

 

그럼 이제 어떻게 웹쉘 파일을 실행할까요??

우리가 웹 서버에 파일을 요청하듯 웹쉘 파일을 웹 서버에서 요청하기만 한다면 서버에서 실행시킬 수 있을 것입니다.

 

그렇기 때문에 웹쉘 공격의 핵심이 되는 것이

첫째, 웹 서버측에서 실행가능한 파일을 업로드 할 수 있어야 합니다.

둘째, 업로드된 파일의 경로를 알아야합니다.

 

제가 만든 웹 서버에서 실습해보며 실제로 수행되는지 확인해보겠습니다.

파일 업로드

 

게시글에서 원하는 파일 웹 쉘을 업로드했습니다.

이제 파일 경로만 알고 해당 파일을 찾으면 될 것같습니다.

파일 경로 확인

 

링크로 연결되는 거라 왼쪽 밑에 파일 경로가 포함되어있네요 해당 파일을 요청해보겠습니다.

 

명령어 실행

 

해당 파일을 요청하며 cmd 파라미터에 원하는 명령어를 넣어주니 화면에 출력되는 것을 확인할 수 있습니다.

 

이렇게 파일업로드 취약점이 발생하면 원하는 명령어를 실행시킬 수 있으며 명령어를 실행할 수 있으면 서버를 장악할 수도 있습니다.

 

파일 업로드 취약점에 대해 알아보았고 그럼 대응 방안이 무엇이 있을까요?

일단 약한 대응들을 알아보겠습니다. 

 

1. 업로드 되는 파일을 검사하자!! 우리가 업로드를 허용한 파일 유형에 대해서만 허용시키고 나머지는 차단

이 경우 파일마다 content-type이라는 헤더로 http에서 업로드되는 파일들에 대해 타입을 지정해주는 데 이것을 그냥 만약 이미지파일만 허용한다면 image/jpeg처럼 바꿔주면 우회가 가능합니다.

Content-Type: text/php

 

파일을 php라 인식하고 php 파일 타입을 올린다고 되어있는 곳을 jpeg라고 변경해보겠습니다.

 

Content-Type: image/jpeg

 

변경하고 업로드 해보겠습니다.

web shell 실행

파일이 정상적으로 업로드되며 php 파일로 사용되는 것도 문제없이 됩니다.

 

2. 실행을 못하게 하자. 해당 폴더에 있는 파일은 실행을 못하게 만드는 방법입니다.

웹 서버의 upload/uploadfile/ 위치에 업로드된 파일이 저장되는데 uploadfile 폴더에 있는 파일은 실행을 못하게 만드는 것입니다.

하지만 이 방법은 업로드 시 해당 파일명앞에 ../ 를 붙히는 방법으로 부모폴더에 저장되어 upload/ 폴더 위치에 업로드되어 우회할 수 있습니다.

 

3. 서버에서 사용하는 확장자는 업로드를 못하게 하자!

서버에서 이용하는 확장자를 업로드를 못하게하면 다른 파일들은 당연히 처리할 수 있는 기능이 서버에 없기 때문에 다른 파일로는 실행을 못할 것입니다. 하지만 이 방법도 만약 php 확장자를 막는다고 하면 Php, pHp 등 대소문자로 우회할 수도 있으며 대소문자도 차단한다고 하면

php => phtml, php3, php5 등 

jsp => jspx, jhtml 등 

다른 확장자이름으로 똑같이 파일을 실행시킬 수 있습니다.

 

우회 기법으로 많이 사용되는 방법

일단 먼저 정상적인 이미지 파일을 업로드를 하는데 이때 파일을 hex editor로 파일을 열어 중앙이나 끝에 웹쉘 코드를 삽입하여 업로드를 시킵니다. 그럼 파일을 이미지 파일로 생각하여 업로드 시킬 수 있습니다.

파일마다 가장 앞쪽에 특정문자로 파일을 식별하는 문자열이 있습니다. 그것을 사용하여 이미지파일로 착각하게 만들어 업로드하는 것입니다. 확인 링크: https://en.wikipedia.org/wiki/List_of_file_signatures

 

List of file signatures - Wikipedia

From Wikipedia, the free encyclopedia This is a list of file signatures, data used to identify or verify the content of a file. Such signatures are also known as magic numbers or Magic Bytes. Many file formats are not intended to be read as text. If such a

en.wikipedia.org

 

하지만 이때 우리는 업로드 확장자를 이미지 파일로 업로드를 하기 때문에 서버에서 실행시킬 수 없습니다.

php 파일이면 해당 파일의 확장자를 가져야 파일을 제대로 처리할 수 있습니다.

 

이 부분에 대해서는 각자 고민해보고 다음 시간에 알려주신다고 해서 다음에 이어서 업로드 하겠습니다.

 

이렇게 이번에 파일 업로드 취약점 발생시 일어날 수 있는 시나리오와 공격의 핵심들을 알아보았습니다.

 

마지막으로 모의해킹 실무에서 파일업로드 취약점 발견 시 주의할 점을 알아보고 마치겠습니다.

1. 웰쉘 파일은 업로드하면 안됨. => <?php echo 'hello' ?> 등으

파일 업로드를 하면 우리가 파일이 서버측에서 실행된다는 것만 발견하면 되기때문에 웹쉘까지는 필요없습니다. 

만약, 웹쉘 업로드를 하여 추가적인 공격을 찾는다고하면 꼭!! 관계자와 협의하에 진행하여야하며 테스트 진행 후 반드시 삭제하여야합니다.